{
  "openapi": "3.0.1",
  "info": {
    "title": "ZenAnalytics Management API",
    "version": "v8",
    "license": {
      "name": "Proprietary - Veertec, all rights reserved"
    },
    "description": "Configuration, identity and analytics-data surface for the ZenAnalytics\nplatform.\n\n## Request pipeline\n\nEvery request passes through three gates before it reaches a controller,\nin this order:\n\n1. **Authentication** (`UseAuthentication`) - ASP.NET Core Identity bearer\n   tokens issued by `POST /auth/login`.\n2. **`AccessInterceptorMiddleware` - license gate.** Unless the path is on\n   the bypass list, the license must be `Valid` or `Expired`. Anything else\n   returns **402** and the request never reaches the controller.\n3. **`AccessInterceptorMiddleware` - permission gate.** Authenticated\n   callers are checked against `permissions.json`; failure returns **403**.\n\n**Middleware responses are plain text, not the envelope.** The 402 and 403\nabove are written with `Response.WriteAsync(string)` - no JSON, no\n`resultCode`. Only responses produced by controllers use the envelope\ndescribed below. Parse defensively.\n\n## Response envelope\n\nController responses are camelCase and always shaped\n`{ data, message, resultCode }`. List endpoints add `totalCount` as a\n**sibling** of `data`.\n\nRead `data` and read the **HTTP status**. The other two fields are not\nreliable enough to branch on, which a live survey of 46 endpoints settled\nconclusively:\n\n- **`resultCode` is not the HTTP status.** Of 35 successful envelope\n  responses, **33 returned `resultCode: 0`** and only two returned `200`\n  (`GET /api/configuration/basic/user` and `.../users/assignable`). Errors\n  usually set it correctly - a validation failure gives `400`, an unhandled\n  exception gives `500` - but not always: `GET /api/data/colors/available`\n  returns **HTTP 400 with `resultCode: 0`**. Treat the field as advisory\n  and never as a substitute for the status line.\n- **`message` on success is one of four things**, all observed: the empty\n  string, `null`, a **timing string** (`\"This request took 0 seconds\"`), or\n  occasional real prose (`\"Roles retrieved successfully\"`). It is not\n  consistently human-facing and must not be displayed as though it were.\n  On error it does carry a real description - see below.\n\nExamples in this document show `resultCode: 200` on success because that is\nwhat the generator derives from the declared schema. The live value is\nalmost always `0`. The mock reproduces the document, not the deployment.\n\n`204`, `304` and `410` return an **empty body with no envelope**. `304` is\nan application-level \"nothing changed\" signal on write operations; it has\nnothing to do with HTTP caching and there is no `ETag` involved.\n\n## What the mock can and cannot show you\n\nThis bundle mocks the **spec**, so it reproduces controller responses\nfaithfully and does not reproduce middleware behaviour. The 402 license\ngate, the 403 permission gate and the `/auth/login` pre-check described on\nthe individual operations below happen before any controller runs, so the\nmock cannot serve them. They are documented here because you will hit them\nagainst a real instance.\n\n## What has been checked against a running instance\n\nEverything below was inferred from source and then **confirmed against a\nlive 8.3.2 deployment on 2026-07-27**, in two passes - unauthenticated, then\nauthenticated as an administrator.\n\n### Unauthenticated\n\n- **`401` carries no body at all.** Not the envelope - `Content-Length: 0`\n  and `WWW-Authenticate: Bearer`. This was inferred wrongly at first, on the\n  reasonable-looking grounds that `UnauthorizedUserException` maps to 401 in\n  `ExceptionHandlerMiddleware`. It never gets there: `[Authorize]` fails and\n  ASP.NET's challenge short-circuits the pipeline before the exception\n  middleware runs. A missing token and a malformed one are indistinguishable.\n- **Authentication precedes model binding.** `GET /api/configuration/basic/server/not-a-guid`\n  with no token returns `401`, not `400`.\n- **`405` is real, undeclared, and bodiless.** A wrong verb on a real route -\n  `PATCH /api/configuration/basic/server`, `DELETE .../server/{id}` - returns\n  an empty `405`. No operation declares it, so the mock cannot serve it.\n- **Routing-level `404` is bodiless too.** An unknown path under `/api`\n  returns an empty `404`. That is a different thing from a controller's\n  `BuildNotFoundResponse`, which does use the envelope - so `404` alone does\n  not tell you which one you got. Check for a body.\n- **`GET /auth/login` returns an empty `200`.** `GET /auth/refresh` on the\n  same deployment correctly returns `405`, which rules out a proxy quirk and\n  confirms the `AccessInterceptorMiddleware` swallow described under\n  `POST /auth/login` below: the middleware neither forwards the request nor\n  writes a response, and the pipeline unwinds empty.\n\n### Authenticated\n\nLogged in with `POST /auth/login`, then 46 parameterless `GET`s surveyed\nplus targeted probes. Findings, in the order they should change your client:\n\n- **`resultCode` is unreliable.** 33 of 35 successful envelopes returned\n  `0`, and one error returned `400` with `resultCode: 0`. Detail and\n  evidence under *Response envelope* above. This is the single most\n  important correction on this page.\n- **`message` is inconsistent on success** - empty, `null`, a timing string\n  or real prose, all four observed. Also covered above.\n- **`totalCount` placement is otherwise exactly as declared.** Every one of\n  the 36 comparable list endpoints matched the spec except the two already\n  listed as mismatches below. That is worth stating positively: the envelope\n  declarations in this document are trustworthy.\n- **A controller `404` does carry the envelope.**\n  `GET /api/configuration/basic/enrolled-vehicle/{unknown-guid}` returns 41\n  bytes of `{\"data\":null,\"message\":\"\",\"resultCode\":0}`. Contrast the\n  bodiless routing-level `404` above - the presence of a body is what\n  distinguishes them.\n- **There are two different `400` shapes.** Model-level validation\n  (`[NotEmptyGuid]` and friends) produces `data: [{field, error}]` with\n  `message: \"Validation failed\"` and `resultCode: 400`, exactly as\n  documented. A rejection raised inside a facade instead produces\n  `data: null` with the **exception's own text** in `message`. Clients that\n  parse `data` as an array of field errors will break on the second shape.\n- **`500` responses leak internal exception text.** Confirmed:\n  `GET /api/data/accr/related-images` with an all-zero id returns `500` and\n  `\"Container with ID 00000000-... not found.\"`;\n  `/api/data/lpr/anpr-related-images` likewise with `\"Plate with ID ...\"`.\n  Note both say *not found* while returning **500**, not `404` - a missing\n  id is not handled as a 404 on these two endpoints. Do not surface `message`\n  from a `500` to end users. Raised separately as\n  `ExceptionHandlerMiddleware.cs:49`.\n- **`GET /auth/manage/info` returns no envelope**, just\n  `{ \"email\": ..., \"isEmailConfirmed\": ... }`. The Identity endpoints do not\n  participate in the controller envelope at all.\n- **`GET .../watchlist/import/template` really does return a file** -\n  `text/csv`, header row\n  `watchListId,watchListGroupId,name,zoneName,targetType,enrolledVehicleId,plateNumber,vehicleColor,vehicleMake,vehicleModel,...`\n  confirming the `BuildOkFileResponse` path.\n- **Login returns** `{ tokenType: \"Bearer\", accessToken, expiresIn: 3600,\n  refreshToken }`. Tokens are ~731-character ASP.NET Data Protection blobs\n  beginning `CfDJ8`, **not** JWTs - do not attempt to decode one for claims.\n\n### Write path\n\nVerified by creating one watchlist group, patching it, deleting it and\nconfirming it was gone. Nothing pre-existing was touched.\n\n- **`304` is real, and it is bodiless.** A `PATCH` that changes nothing\n  returns `304` with no content-type and zero bytes. This had been inferred\n  from `BaseController`; it is now observed. Treat it as success-no-change,\n  and note that a client following redirects or caching on `304` will\n  misread it.\n- **Deleting something already deleted returns `304`, not `404`.** The\n  second `DELETE` of the same id returned an empty `304`. Delete signals\n  \"nothing changed\" rather than \"not found\", so a `404` handler will never\n  fire on a repeat delete.\n- **A create returns the new id as a bare string** in `data` -\n  `\"746484e8-...\"`, not an object. `PATCH` and `DELETE` return `data: true`.\n  Both matched the declared schemas.\n- **`resultCode` is `0` on writes too**, and `message` was empty throughout,\n  consistent with the read survey above.\n\nStill unverified: the `402` license gate and the `403` permission gate.\nNeither fired, because the account used is an administrator on a licensed\ndeployment - so the absence of a `403` is evidence about the account, not\nabout the middleware. Both remain inferred from source. Write operations\nwere exercised only on records created for the purpose; no existing record\nwas modified or deleted.\n\nResponse examples in this document remain **synthetic**. Live payloads were\nread for structure only - key names, types, cardinality - and the values\nwere never harvested, because this deployment holds real ANPR plates, face\nrecords and watchlist entries.\n\n## Where the spec and the implementation disagree\n\nA handful of operations declare a response schema the controller does not\nactually produce. The mock serves the **declared** shape, because that is\nwhat the spec says; a real instance sends the other one. Every such case is\ncalled out on the operation itself - search this document for\n**\"declared response schema is wrong\"** and **\"the spec is incomplete\nhere\"** to list them. The confirmed set today:\n\n- `POST /api/configuration/basic/watchlist` declares a boolean; returns the\n  new watchlist's GUID as a string.\n- `GET /api/configuration/basic/watchlist-group` declares the plain\n  envelope; returns a `FetchResponse` with `totalCount`.\n  **Confirmed live, 2026-07-27.**\n- `GET /api/configuration/basic/person` declares a doubly-nested envelope;\n  returns the flat `FetchResponse` every other list endpoint returns, with\n  `totalCount` a **sibling** of `data`, not inside it. This is the only\n  endpoint in the spec declared that way - 22 others declare it flat.\n  **Confirmed live, 2026-07-27.**\n- `POST /api/configuration/basic/module/{id}/activate` and `/deactivate`\n  declare a boolean; return the **count** of affected modules.\n- `POST .../propagate-mediasource-config` declares a boolean; returns the\n  **list of media source ids** it propagated to.\n\nSeparately, four operations can return a status the spec never declares, so\nthe mock cannot produce it: `304` on `DELETE /mediasource-links`, on\n`DELETE /mediasource-links/{id}/configs/{configId}` and on\n`DELETE /api/dashboards/widgets/{id}`; `204` on\n`GET /mediasource/snapshot/{providerMediaSourceId}`.\n"
  },
  "paths": {
    "/api/data/accr/container-info-filtered": {
      "post": {
        "tags": [
          "Accr"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContainerInfoFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ContainerInfoFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ContainerInfoFilterRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_ContainerInfoDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "62d30e9a-fc4a-44f0-ac5e-e58830c3a133",
                          "mediaSourceId": "61ef3f4b-172f-46d3-a240-cd0b59555c44",
                          "mediaSourceName": "Parking Level 2",
                          "ocrText": "tempor consectetur",
                          "confidence": 0.73,
                          "recognized": false,
                          "analyzedFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "triggerType": 2,
                          "watchListIds": [
                            "36e70e0e-39dc-4181-a393-a3b617801912",
                            "0852ce92-f2ad-4d70-a645-834cd725a8e7"
                          ],
                          "zoneName": "Lobby Entrance",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "6323f534-e2a3-46e6-a68a-2caaf77fc149",
                          "mediaSourceId": "35b48eaa-c725-47bf-acee-1b0ff386f563",
                          "mediaSourceName": "North Gate Camera",
                          "ocrText": "aliquip",
                          "confidence": 0.86,
                          "recognized": false,
                          "analyzedFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "triggerType": 0,
                          "watchListIds": [
                            "8861fb56-da9f-41e4-a79e-56ff08beb33b",
                            "e0306eab-d56d-4323-a41c-433c83880600"
                          ],
                          "zoneName": "Loading Bay 3",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_ContainerInfoDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_ContainerInfoDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Search container reads",
        "description": "Paged `FetchResponse`: `totalCount` beside `data`, `message` is the\ntiming string. There is no unfiltered listing on this tag - unlike ANPR,\nthe `POST` is the only way in.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataAccrContainerInfoFiltered"
      }
    },
    "/api/data/accr/related-images": {
      "get": {
        "tags": [
          "Accr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ACCRRelatedImagesDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "fullFrameRelatedImages": [
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                        ],
                        "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                        "codeImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ACCRRelatedImagesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ACCRRelatedImagesDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get images related to a container read",
        "description": "`id` is a query parameter, matching the ANPR equivalent.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataAccrRelatedImages"
      }
    },
    "/api/data/accr/image/{id}": {
      "get": {
        "tags": [
          "Accr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Get a container-code crop",
        "description": "The cropped code image, base64 in `data`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "getDataAccrImageById"
      }
    },
    "/api/data/accr/full-frame-image/{id}": {
      "get": {
        "tags": [
          "Accr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Get a container read's full frame",
        "description": "The whole frame, base64 in `data`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "getDataAccrFullFrameImageById"
      }
    },
    "/api/data/anpr/widgets/{dashboardWidgetId}/kpi": {
      "post": {
        "tags": [
          "AnprDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "value": 47.5,
                        "previousValue": 63.51,
                        "deltaPct": 70.12,
                        "label": "Perimeter West",
                        "status": "cillum occaecat sit",
                        "timestamp": "2026-07-27T09:14:33Z",
                        "sparkline": [
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 46.71
                          },
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 72.6
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a KPI widget's value (ANPR)",
        "description": "A single headline number with its comparison against the previous period - what a KPI tile renders.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataAnprWidgetsByDashboardWidgetKpi"
      }
    },
    "/api/data/anpr/widgets/{dashboardWidgetId}/series": {
      "post": {
        "tags": [
          "AnprDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "series": [
                          {
                            "name": "Perimeter West",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 14.8
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 27.55
                              }
                            ]
                          },
                          {
                            "name": "Parking Level 2",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 77.59
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 16.42
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a time-series widget's data (ANPR)",
        "description": "Points over time, already bucketed by the interval the widget is configured with. Do not re-aggregate client-side.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataAnprWidgetsByDashboardWidgetSeries"
      }
    },
    "/api/data/anpr/widgets/{dashboardWidgetId}/buckets": {
      "post": {
        "tags": [
          "AnprDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "id eu laboris",
                            "label": "Perimeter West",
                            "value": 54.84,
                            "durationSeconds": 25.18
                          },
                          {
                            "key": "dolore et quis esse",
                            "label": "Perimeter West",
                            "value": 36.51,
                            "durationSeconds": 99.25
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a bucketed widget's data (ANPR)",
        "description": "Counts grouped by a categorical dimension - by camera, by class, by hour of day - for a bar or pie chart.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataAnprWidgetsByDashboardWidgetBuckets"
      }
    },
    "/api/data/anpr/widgets/{dashboardWidgetId}/stacked-buckets": {
      "post": {
        "tags": [
          "AnprDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "ut",
                            "label": "Loading Bay 3",
                            "segments": [
                              {
                                "name": "Lobby Entrance",
                                "value": 57.89
                              },
                              {
                                "name": "North Gate Camera",
                                "value": 55.28
                              }
                            ]
                          },
                          {
                            "key": "sed ad",
                            "label": "Loading Bay 3",
                            "segments": [
                              {
                                "name": "Loading Bay 3",
                                "value": 67.39
                              },
                              {
                                "name": "Loading Bay 3",
                                "value": 42.84
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a stacked-bucket widget's data (ANPR)",
        "description": "Buckets split by a second dimension, for a stacked bar chart. The extra series come back inside the payload, not as separate calls.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataAnprWidgetsByDashboardWidgetStackedBuckets"
      }
    },
    "/api/data/anpr/widgets/{dashboardWidgetId}/ranked": {
      "post": {
        "tags": [
          "AnprDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_RankedPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "rows": [
                          {
                            "rank": 474,
                            "values": {
                              "nisi_f0": {},
                              "anim3f0": {},
                              "commodo_8c": {},
                              "proident70d": {},
                              "irure_1e": {},
                              "laboris_3ca": {},
                              "Utff3": {},
                              "laborea": {},
                              "nisi__e4": {},
                              "adipisicinga": {}
                            }
                          },
                          {
                            "rank": 325,
                            "values": {
                              "tempor_726": {},
                              "consectetur__": {},
                              "do7": {},
                              "in_bdc": {}
                            }
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_RankedPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_RankedPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a ranked widget's data (ANPR)",
        "description": "A top-N list ordered by the widget's metric. The N is part of the widget's stored configuration, not the request.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataAnprWidgetsByDashboardWidgetRanked"
      }
    },
    "/api/data/anpr/widgets/{dashboardWidgetId}/rows": {
      "post": {
        "tags": [
          "AnprDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetRowsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetRowsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetAnprWidgetRowsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "totalCount": 104,
                        "data": [
                          {
                            "columns": {
                              "cillum_e4": {},
                              "autefe7": {}
                            }
                          },
                          {
                            "columns": {
                              "sint5e5": {},
                              "dolor_2": {},
                              "ea_0d": {},
                              "adipisicing36c": {}
                            }
                          }
                        ],
                        "durationSeconds": 834
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a table widget's rows (ANPR)",
        "description": "The detail rows behind a table widget. This is the largest payload on the tag - expect it to dominate dashboard load time.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataAnprWidgetsByDashboardWidgetRows"
      }
    },
    "/api/configuration/basic/audit-logs": {
      "get": {
        "tags": [
          "AuditLog"
        ],
        "parameters": [
          {
            "name": "SearchText",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "From",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "To",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 10000000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_AuditLogDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "38079189-2904-4baa-a86e-7a7470f1d342",
                          "userId": "50261a2c-a678-43a2-a8b6-5b4229dde173",
                          "userRole": "consequat sint dolor culpa",
                          "targetPermission": "Ut",
                          "targetEndpoint": "rtsp://10.0.4.21:554/stream1",
                          "accessStatus": 1,
                          "requestPayload": "amet cillum do sit dolor",
                          "responseStatusCode": 757,
                          "requestDurationInMilliseconds": 33,
                          "createdAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "0c760f47-6ee1-4715-a084-6c2e77bada7b",
                          "userId": "994b7862-7577-4b6c-aa23-412dec59a31a",
                          "userRole": "tempor",
                          "targetPermission": "dolor in dolore",
                          "targetEndpoint": "rtsp://10.0.4.21:554/stream1",
                          "accessStatus": 2,
                          "requestPayload": "sunt minim aute",
                          "responseStatusCode": 0,
                          "requestDurationInMilliseconds": 181,
                          "createdAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_AuditLogDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_AuditLogDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Search the audit log",
        "description": "Who changed what, when. Paged `FetchResponse`: `totalCount` beside\n`data`, `message` is the timing string.\n\nThis is the compliance record. It is written by the platform and there\nis no endpoint that modifies it.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getAuditLogs"
      }
    },
    "/api/configuration/basic/camera-provisioning/{provider}/connectivity": {
      "post": {
        "tags": [
          "CameraProvisioning"
        ],
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckCameraConnectivityRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CheckCameraConnectivityRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CheckCameraConnectivityRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Test connectivity to a camera",
        "description": "Checks that the platform can reach a camera with the credentials in the\nbody, before provisioning it. Always call this first - provisioning a\ncamera you cannot reach leaves a broken registration behind.\n\nReachability failures come back as a `200` describing the failure, not as\na `4xx`. Read `data`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postCameraProvisioningByProviderConnectivity"
      }
    },
    "/api/configuration/basic/camera-provisioning/{provider}/{cameraId}/provision": {
      "post": {
        "tags": [
          "CameraProvisioning"
        ],
        "parameters": [
          {
            "name": "provider",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "cameraId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProvisionCameraRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ProvisionCameraRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ProvisionCameraRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Provision a camera",
        "description": "Pushes configuration onto the camera itself - streams, credentials,\nanalytics settings - as opposed to\n`POST /api/configuration/basic/mediasource/registry`, which only records\nit in the platform.\n\nThis writes to hardware. It is not idempotent in the way the registry\nendpoints are.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postCameraProvisioningByProviderByCameraProvision"
      }
    },
    "/api/data/colors/available": {
      "get": {
        "tags": [
          "Color"
        ],
        "parameters": [
          {
            "name": "module",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/ZenModule"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PaletteGroupResponseList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "paletteType": "Vehicle",
                          "colors": [
                            {
                              "id": 571,
                              "name": "Lobby Entrance"
                            },
                            {
                              "id": 756,
                              "name": "Lobby Entrance"
                            }
                          ]
                        },
                        {
                          "paletteType": "Vehicle",
                          "colors": [
                            {
                              "id": 466,
                              "name": "Loading Bay 3"
                            },
                            {
                              "id": 788,
                              "name": "Loading Bay 3"
                            }
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PaletteGroupResponseList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PaletteGroupResponseList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the colours a module can report",
        "description": "Colours vary by module, so `module` is required. Use it to populate a\ncolour filter rather than hard-coding names.\n\nAn unrecognised module returns `400` **with the internal exception\nmessage in `message`** - the action catches and forwards it. Do not\ndisplay that text to end users.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataColorsAvailable"
      }
    },
    "/api/data/counting/widgets/{dashboardWidgetId}/kpi": {
      "post": {
        "tags": [
          "CountingDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "value": 69.48,
                        "previousValue": 45.15,
                        "deltaPct": 13.12,
                        "label": "Loading Bay 3",
                        "status": "dolore in sit",
                        "timestamp": "2026-07-27T09:14:33Z",
                        "sparkline": [
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 79.67
                          },
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 79.22
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a KPI widget's value (counting)",
        "description": "A single headline number with its comparison against the previous period - what a KPI tile renders.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataCountingWidgetsByDashboardWidgetKpi"
      }
    },
    "/api/data/counting/widgets/{dashboardWidgetId}/kpi-list": {
      "post": {
        "tags": [
          "CountingDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiListPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "items": [
                          {
                            "value": 80.66,
                            "previousValue": 80.37,
                            "deltaPct": 60.16,
                            "label": "North Gate Camera",
                            "status": "id",
                            "timestamp": "2026-07-27T09:14:33Z",
                            "sparkline": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 13.95
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 13.61
                              }
                            ],
                            "name": "Loading Bay 3"
                          },
                          {
                            "value": 51.57,
                            "previousValue": 30.07,
                            "deltaPct": 31.19,
                            "label": "Lobby Entrance",
                            "status": "Ut dolor adipisicing magna",
                            "timestamp": "2026-07-27T09:14:33Z",
                            "sparkline": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 83.61
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 82.61
                              }
                            ],
                            "name": "Loading Bay 3"
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiListPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiListPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a KPI-list widget's values (counting)",
        "description": "Several related headline numbers in one call, for a tile that shows a small table of figures rather than one.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataCountingWidgetsByDashboardWidgetKpiList"
      }
    },
    "/api/data/counting/widgets/{dashboardWidgetId}/series": {
      "post": {
        "tags": [
          "CountingDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "series": [
                          {
                            "name": "Loading Bay 3",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 51.76
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 78.68
                              }
                            ]
                          },
                          {
                            "name": "North Gate Camera",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 54.91
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 23.04
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a time-series widget's data (counting)",
        "description": "Points over time, already bucketed by the interval the widget is configured with. Do not re-aggregate client-side.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataCountingWidgetsByDashboardWidgetSeries"
      }
    },
    "/api/data/counting/widgets/{dashboardWidgetId}/stacked-buckets": {
      "post": {
        "tags": [
          "CountingDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "nulla esse irure fugiat non",
                            "label": "Parking Level 2",
                            "segments": [
                              {
                                "name": "Parking Level 2",
                                "value": 4.3
                              },
                              {
                                "name": "North Gate Camera",
                                "value": 82.38
                              }
                            ]
                          },
                          {
                            "key": "consectetur exercitation in nisi",
                            "label": "Parking Level 2",
                            "segments": [
                              {
                                "name": "Parking Level 2",
                                "value": 48.05
                              },
                              {
                                "name": "North Gate Camera",
                                "value": 3.58
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a stacked-bucket widget's data (counting)",
        "description": "Buckets split by a second dimension, for a stacked bar chart. The extra series come back inside the payload, not as separate calls.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataCountingWidgetsByDashboardWidgetStackedBuckets"
      }
    },
    "/api/data/counting/widgets/{dashboardWidgetId}/buckets": {
      "post": {
        "tags": [
          "CountingDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "dolore anim ad",
                            "label": "Parking Level 2",
                            "value": 78,
                            "durationSeconds": 45.29
                          },
                          {
                            "key": "nisi consectetur do",
                            "label": "Loading Bay 3",
                            "value": 62.81,
                            "durationSeconds": 37.01
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a bucketed widget's data (counting)",
        "description": "Counts grouped by a categorical dimension - by camera, by class, by hour of day - for a bar or pie chart.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataCountingWidgetsByDashboardWidgetBuckets"
      }
    },
    "/api/data/counting/widgets/{dashboardWidgetId}/rows": {
      "post": {
        "tags": [
          "CountingDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetRowsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetRowsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetCountingWidgetRowsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "totalCount": 249,
                        "data": [
                          {
                            "columns": {
                              "sint_7": {},
                              "esse_18": {},
                              "aliqua_c9": {},
                              "inb": {},
                              "ea_483": {},
                              "esse_e_": {}
                            }
                          },
                          {
                            "columns": {
                              "doloredaa": {},
                              "anim4": {},
                              "amet_45a": {}
                            }
                          }
                        ],
                        "durationSeconds": 112
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a table widget's rows (counting)",
        "description": "The detail rows behind a table widget. This is the largest payload on the tag - expect it to dominate dashboard load time.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataCountingWidgetsByDashboardWidgetRows"
      }
    },
    "/api/dashboards/types": {
      "get": {
        "tags": [
          "Dashboard"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardTypeDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "type": 2,
                          "name": "Loading Bay 3"
                        },
                        {
                          "type": 2,
                          "name": "North Gate Camera"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardTypeDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardTypeDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List dashboard types",
        "description": "The `{dashboardType}` values every other endpoint on this tag takes.\nStart here - the set depends on which modules are licensed.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDashboardsTypes"
      }
    },
    "/api/dashboards/{dashboardType}": {
      "get": {
        "tags": [
          "Dashboard"
        ],
        "parameters": [
          {
            "name": "dashboardType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/DashboardType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "41482a44-acc3-409d-a1df-c345699f603b",
                        "dashboardLayoutId": "0e720514-b28d-45bd-a066-946cad772ef6",
                        "type": 4,
                        "name": "Parking Level 2",
                        "isDefault": false,
                        "widgets": [
                          {
                            "id": "45ff2b4c-1d8b-4d53-a2de-15b8209c2fa3",
                            "dashboardLayoutId": "8da2a407-38a2-451e-afa8-0ee852a143e0",
                            "name": "Parking Level 2",
                            "widgetKey": "Ut aute",
                            "x": 632,
                            "y": 26,
                            "width": 109,
                            "height": 422,
                            "configuration": {},
                            "anprResponseCategory": 2,
                            "incidentResponseCategory": 7,
                            "vfrResponseCategory": 5,
                            "flowResponseCategory": 6,
                            "countingResponseCategory": 2,
                            "definition": {
                              "id": "405c8e11-f614-425a-a305-410384a44de7",
                              "widgetSectionId": "0dc2ec85-b78a-44c0-a406-8c83fba70429",
                              "key": "ex",
                              "sectionKey": "officia aute magna",
                              "subtitle": "Lobby Entrance",
                              "description": "Loading Bay 3",
                              "dashboardType": 1,
                              "category": 3,
                              "visualizationType": 0,
                              "visualizations": [],
                              "actions": [
                                {
                                  "key": "ex non",
                                  "configurationKey": "dolore eu sint aute",
                                  "name": "Loading Bay 3",
                                  "type": 5,
                                  "optionsSource": 1,
                                  "displayOrder": 769,
                                  "options": [
                                    {
                                      "value": "Ut voluptate deserunt velit aute",
                                      "label": "Perimeter West",
                                      "displayOrder": 855
                                    },
                                    {
                                      "value": "sit dolor in magna",
                                      "label": "Loading Bay 3",
                                      "displayOrder": 881
                                    }
                                  ]
                                },
                                {
                                  "key": "consequat ullamco ad",
                                  "configurationKey": "esse fugiat sed laboris ea",
                                  "name": "North Gate Camera",
                                  "type": 1,
                                  "optionsSource": 6,
                                  "displayOrder": 436,
                                  "options": [
                                    {
                                      "value": "nisi laboris exercitation ex",
                                      "label": "Lobby Entrance",
                                      "displayOrder": 257
                                    },
                                    {
                                      "value": "anim nulla",
                                      "label": "Perimeter West",
                                      "displayOrder": 668
                                    }
                                  ]
                                }
                              ],
                              "width": 552,
                              "height": 918,
                              "minWidth": 547,
                              "minHeight": 73,
                              "maxWidth": 422,
                              "maxHeight": 587
                            }
                          },
                          {
                            "id": "c57da096-edaa-4fad-a793-f4765e5c5de1",
                            "dashboardLayoutId": "318cd818-0154-4f9f-a5bc-0a7a39a9096e",
                            "name": "Lobby Entrance",
                            "widgetKey": "laboris dolor voluptate tempor",
                            "x": 343,
                            "y": 631,
                            "width": 751,
                            "height": 357,
                            "configuration": {},
                            "anprResponseCategory": 1,
                            "incidentResponseCategory": 5,
                            "vfrResponseCategory": 5,
                            "flowResponseCategory": 4,
                            "countingResponseCategory": 3,
                            "definition": {
                              "id": "7f5433df-3f11-45b4-a230-bf615cff81f8",
                              "widgetSectionId": "c1b4355a-421b-4ba1-ab5b-8f5272624c3f",
                              "key": "nisi cupidatat ut",
                              "sectionKey": "labore",
                              "subtitle": "Parking Level 2",
                              "description": "North Gate Camera",
                              "dashboardType": 1,
                              "category": 2,
                              "visualizationType": 14,
                              "visualizations": [],
                              "actions": [
                                {
                                  "key": "ullamco",
                                  "configurationKey": "ut ea magna dolor ex",
                                  "name": "Loading Bay 3",
                                  "type": 5,
                                  "optionsSource": 4,
                                  "displayOrder": 469,
                                  "options": [
                                    {
                                      "value": "aute",
                                      "label": "North Gate Camera",
                                      "displayOrder": 806
                                    },
                                    {
                                      "value": "labore nisi",
                                      "label": "Parking Level 2",
                                      "displayOrder": 959
                                    }
                                  ]
                                },
                                {
                                  "key": "ut laboris consectetur dolor culpa",
                                  "configurationKey": "culpa",
                                  "name": "Lobby Entrance",
                                  "type": 2,
                                  "optionsSource": 7,
                                  "displayOrder": 695,
                                  "options": [
                                    {
                                      "value": "veniam sunt proident",
                                      "label": "Lobby Entrance",
                                      "displayOrder": 135
                                    },
                                    {
                                      "value": "in",
                                      "label": "Loading Bay 3",
                                      "displayOrder": 793
                                    }
                                  ]
                                }
                              ],
                              "width": 69,
                              "height": 79,
                              "minWidth": 812,
                              "minHeight": 937,
                              "maxWidth": 183,
                              "maxHeight": 636
                            }
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a dashboard",
        "description": "The dashboard with its layout and widgets, ready to render. One call is\nenough to paint the page.\n\nAn unrecognised `dashboardType` fails enum binding and returns a\nvalidation `400` before the action runs.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDashboardsByDashboardType"
      }
    },
    "/api/dashboards/{dashboardType}/filters": {
      "get": {
        "tags": [
          "Dashboard"
        ],
        "parameters": [
          {
            "name": "dashboardType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/DashboardType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDefinitionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "6ede12a9-348d-46ec-a5d0-5b558e75bd70",
                          "name": "Loading Bay 3",
                          "key": "dolor proident",
                          "type": 4,
                          "isBaseFilter": false,
                          "displayOrder": 947,
                          "metadata": {}
                        },
                        {
                          "id": "f3292899-2657-46f0-a7b6-dac68631c7a2",
                          "name": "North Gate Camera",
                          "key": "officia nisi qui Excepteur",
                          "type": 6,
                          "isBaseFilter": false,
                          "displayOrder": 424,
                          "metadata": {}
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDefinitionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDefinitionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List a dashboard type's filter definitions",
        "description": "The filters this dashboard supports, with their types and allowed\nvalues - metadata for building the filter bar, not filter *values*.\nSaved values live under `/api/dashboards/filters`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDashboardsByDashboardTypeFilters"
      }
    },
    "/api/dashboards/{dashboardType}/widget-sections": {
      "get": {
        "tags": [
          "Dashboard"
        ],
        "parameters": [
          {
            "name": "dashboardType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/DashboardType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WidgetSectionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "936604d0-49cc-4bad-a776-4099dae4a695",
                          "dashboardType": 2,
                          "key": "officia",
                          "displayOrder": 401,
                          "widgets": [
                            {
                              "id": "bed13c99-5c61-47d1-a58e-d5f076dc621c",
                              "widgetSectionId": "d8f55a44-e791-4dbd-a541-96391c290ecd",
                              "key": "ea Excepteur proident mollit",
                              "sectionKey": "aliquip",
                              "subtitle": "North Gate Camera",
                              "description": "Parking Level 2",
                              "dashboardType": 1,
                              "category": 2,
                              "visualizationType": 24,
                              "visualizations": [
                                25,
                                22
                              ],
                              "actions": [
                                {
                                  "key": "dolore exercitation",
                                  "configurationKey": "commodo dolore labore in irure",
                                  "name": "Lobby Entrance",
                                  "type": 2,
                                  "optionsSource": 2,
                                  "displayOrder": 94,
                                  "options": [
                                    {
                                      "value": "esse proident voluptate sint",
                                      "label": "Perimeter West",
                                      "displayOrder": 109
                                    },
                                    {
                                      "value": "ipsum culpa est occaecat",
                                      "label": "Lobby Entrance",
                                      "displayOrder": 894
                                    }
                                  ]
                                },
                                {
                                  "key": "aliqua aliquip minim mollit tempor",
                                  "configurationKey": "in dolor",
                                  "name": "North Gate Camera",
                                  "type": 3,
                                  "optionsSource": 7,
                                  "displayOrder": 681,
                                  "options": [
                                    {
                                      "value": "ipsum qui",
                                      "label": "North Gate Camera",
                                      "displayOrder": 872
                                    },
                                    {
                                      "value": "in id",
                                      "label": "Perimeter West",
                                      "displayOrder": 478
                                    }
                                  ]
                                }
                              ],
                              "width": 256,
                              "height": 37,
                              "minWidth": 321,
                              "minHeight": 833,
                              "maxWidth": 763,
                              "maxHeight": 452
                            },
                            {
                              "id": "1e3e8000-d644-4d0d-ae4f-d86bc73dbd2c",
                              "widgetSectionId": "0c1080d2-75d1-48ef-ad55-cd2f3b1b0c15",
                              "key": "labore in culpa cupidatat",
                              "sectionKey": "officia sint cillum velit ex",
                              "subtitle": "North Gate Camera",
                              "description": "North Gate Camera",
                              "dashboardType": 1,
                              "category": 3,
                              "visualizationType": 13,
                              "visualizations": [
                                18,
                                10
                              ],
                              "actions": [
                                {
                                  "key": "officia aliquip cillum sit commodo",
                                  "configurationKey": "commodo exercitation",
                                  "name": "North Gate Camera",
                                  "type": 5,
                                  "optionsSource": 6,
                                  "displayOrder": 221,
                                  "options": [
                                    {
                                      "value": "consequat laborum Excepteur aliquip",
                                      "label": "Parking Level 2",
                                      "displayOrder": 481
                                    },
                                    {
                                      "value": "in enim",
                                      "label": "Lobby Entrance",
                                      "displayOrder": 378
                                    }
                                  ]
                                },
                                {
                                  "key": "ipsum dolor dolor adipisicing qui",
                                  "configurationKey": "do officia ad adipisicing",
                                  "name": "Lobby Entrance",
                                  "type": 2,
                                  "optionsSource": 7,
                                  "displayOrder": 952,
                                  "options": [
                                    {
                                      "value": "culpa dolor",
                                      "label": "North Gate Camera",
                                      "displayOrder": 537
                                    },
                                    {
                                      "value": "ut nostrud sit elit aliquip",
                                      "label": "Perimeter West",
                                      "displayOrder": 355
                                    }
                                  ]
                                }
                              ],
                              "width": 897,
                              "height": 437,
                              "minWidth": 828,
                              "minHeight": 480,
                              "maxWidth": 214,
                              "maxHeight": 290
                            }
                          ]
                        },
                        {
                          "id": "86978923-0a05-4fe7-a34d-8b563be7d039",
                          "dashboardType": 4,
                          "key": "laborum",
                          "displayOrder": 852,
                          "widgets": [
                            {
                              "id": "578462b4-6aa5-4f1d-abad-205c13eef826",
                              "widgetSectionId": "f9760085-da01-4013-a47a-8092788aa684",
                              "key": "deserunt sint Ut sunt",
                              "sectionKey": "pariatur in incididunt eiusmod",
                              "subtitle": "Parking Level 2",
                              "description": "Loading Bay 3",
                              "dashboardType": 1,
                              "category": 1,
                              "visualizationType": 21,
                              "visualizations": [
                                11,
                                11
                              ],
                              "actions": [
                                {
                                  "key": "aliquip sed Excepteur et",
                                  "configurationKey": "ullamco ut",
                                  "name": "Parking Level 2",
                                  "type": 1,
                                  "optionsSource": 1,
                                  "displayOrder": 967,
                                  "options": [
                                    {
                                      "value": "qui pariatur anim Ut",
                                      "label": "Parking Level 2",
                                      "displayOrder": 597
                                    },
                                    {
                                      "value": "labore in",
                                      "label": "Parking Level 2",
                                      "displayOrder": 369
                                    }
                                  ]
                                },
                                {
                                  "key": "anim",
                                  "configurationKey": "elit fugiat aliquip irure sunt",
                                  "name": "North Gate Camera",
                                  "type": 3,
                                  "optionsSource": 4,
                                  "displayOrder": 817,
                                  "options": [
                                    {
                                      "value": "aliquip",
                                      "label": "Lobby Entrance",
                                      "displayOrder": 568
                                    },
                                    {
                                      "value": "pariatur aliqua veniam",
                                      "label": "Loading Bay 3",
                                      "displayOrder": 958
                                    }
                                  ]
                                }
                              ],
                              "width": 832,
                              "height": 933,
                              "minWidth": 900,
                              "minHeight": 379,
                              "maxWidth": 1,
                              "maxHeight": 761
                            },
                            {
                              "id": "9465c37d-fb6c-43d6-a130-0cf9f6613405",
                              "widgetSectionId": "ddebcc3e-051e-4e35-aaa6-948c9373f11c",
                              "key": "amet in sint pariatur dolore",
                              "sectionKey": "nisi",
                              "subtitle": "North Gate Camera",
                              "description": "Parking Level 2",
                              "dashboardType": 1,
                              "category": 3,
                              "visualizationType": 27,
                              "visualizations": [
                                24,
                                15
                              ],
                              "actions": [
                                {
                                  "key": "culpa",
                                  "configurationKey": "veniam",
                                  "name": "Loading Bay 3",
                                  "type": 3,
                                  "optionsSource": 5,
                                  "displayOrder": 774,
                                  "options": [
                                    {
                                      "value": "dolore consectetur ad adipisicing",
                                      "label": "Lobby Entrance",
                                      "displayOrder": 397
                                    },
                                    {
                                      "value": "ex",
                                      "label": "Perimeter West",
                                      "displayOrder": 355
                                    }
                                  ]
                                },
                                {
                                  "key": "elit",
                                  "configurationKey": "sit amet aute",
                                  "name": "Parking Level 2",
                                  "type": 4,
                                  "optionsSource": 7,
                                  "displayOrder": 47,
                                  "options": [
                                    {
                                      "value": "magna minim occaecat aliquip",
                                      "label": "North Gate Camera",
                                      "displayOrder": 183
                                    },
                                    {
                                      "value": "ex commodo",
                                      "label": "Loading Bay 3",
                                      "displayOrder": 137
                                    }
                                  ]
                                }
                              ],
                              "width": 638,
                              "height": 566,
                              "minWidth": 537,
                              "minHeight": 489,
                              "maxWidth": 389,
                              "maxHeight": 598
                            }
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WidgetSectionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WidgetSectionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the widgets a dashboard type can hold",
        "description": "The catalogue for an \"add widget\" picker, grouped into sections. Only\nwidgets listed here can be added to this dashboard type.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDashboardsByDashboardTypeWidgetSections"
      }
    },
    "/api/dashboards/{dashboardType}/layout": {
      "put": {
        "tags": [
          "Dashboard"
        ],
        "parameters": [
          {
            "name": "dashboardType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/DashboardType"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDashboardLayoutRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDashboardLayoutRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDashboardLayoutRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "697ea4a6-d7e8-4150-a103-c4b0cebd0374",
                        "dashboardLayoutId": "07efffb1-4be4-4deb-aa94-066e401bbfaf",
                        "type": 3,
                        "name": "Parking Level 2",
                        "isDefault": false,
                        "widgets": [
                          {
                            "id": "baf8c976-af8a-4a22-a499-81c92c079b71",
                            "dashboardLayoutId": "24774a8b-a22c-4053-a69a-7dce7392af2c",
                            "name": "Parking Level 2",
                            "widgetKey": "Lorem occaecat sint",
                            "x": 758,
                            "y": 815,
                            "width": 382,
                            "height": 719,
                            "configuration": {},
                            "anprResponseCategory": 5,
                            "incidentResponseCategory": 7,
                            "vfrResponseCategory": 3,
                            "flowResponseCategory": 2,
                            "countingResponseCategory": 5,
                            "definition": {
                              "id": "88f14e11-56c8-4ab1-ad13-1c0517952f25",
                              "widgetSectionId": "f8cdf3bb-0768-4377-a688-6ae1e7706a68",
                              "key": "ipsum reprehenderit",
                              "sectionKey": "ut incididunt",
                              "subtitle": "North Gate Camera",
                              "description": "Lobby Entrance",
                              "dashboardType": 3,
                              "category": 2,
                              "visualizationType": 21,
                              "visualizations": [
                                0,
                                11
                              ],
                              "actions": [
                                {
                                  "key": "labore quis tempor",
                                  "configurationKey": "fugiat nostrud dolore deserunt",
                                  "name": "Perimeter West",
                                  "type": 1,
                                  "optionsSource": 4,
                                  "displayOrder": 787,
                                  "options": [
                                    {
                                      "value": "Duis aliquip",
                                      "label": "Perimeter West",
                                      "displayOrder": 531
                                    },
                                    {
                                      "value": "incididunt fugiat",
                                      "label": "Loading Bay 3",
                                      "displayOrder": 542
                                    }
                                  ]
                                },
                                {
                                  "key": "ullamco consectetur dolore ipsum",
                                  "configurationKey": "incididunt aliqua nostrud",
                                  "name": "Loading Bay 3",
                                  "type": 3,
                                  "optionsSource": 7,
                                  "displayOrder": 547,
                                  "options": [
                                    {
                                      "value": "est ut labore consequat cillum",
                                      "label": "Loading Bay 3",
                                      "displayOrder": 334
                                    },
                                    {
                                      "value": "elit sed ut ut voluptate",
                                      "label": "Loading Bay 3",
                                      "displayOrder": 611
                                    }
                                  ]
                                }
                              ],
                              "width": 222,
                              "height": 568,
                              "minWidth": 824,
                              "minHeight": 640,
                              "maxWidth": 515,
                              "maxHeight": 853
                            }
                          },
                          {
                            "id": "511fd5c3-acf7-496a-ae6e-c4e55de4213e",
                            "dashboardLayoutId": "763cf2dc-11c2-4251-a0dd-62053a819737",
                            "name": "Parking Level 2",
                            "widgetKey": "cupidatat ad dolor",
                            "x": 650,
                            "y": 209,
                            "width": 276,
                            "height": 362,
                            "configuration": {},
                            "anprResponseCategory": 2,
                            "incidentResponseCategory": 7,
                            "vfrResponseCategory": 3,
                            "flowResponseCategory": 1,
                            "countingResponseCategory": 2,
                            "definition": {
                              "id": "e4861543-02fa-4d0b-aa2f-d0cdba87dd1b",
                              "widgetSectionId": "32a375e4-e693-4110-a2a9-ebbfb5379076",
                              "key": "exercitation occaecat",
                              "sectionKey": "occaecat",
                              "subtitle": "Loading Bay 3",
                              "description": "Perimeter West",
                              "dashboardType": 2,
                              "category": 2,
                              "visualizationType": 0,
                              "visualizations": [
                                18,
                                11
                              ],
                              "actions": [
                                {
                                  "key": "nulla dolore officia laboris",
                                  "configurationKey": "enim sunt",
                                  "name": "Loading Bay 3",
                                  "type": 5,
                                  "optionsSource": 5,
                                  "displayOrder": 70,
                                  "options": [
                                    {
                                      "value": "occaecat do exercitation proident",
                                      "label": "Parking Level 2",
                                      "displayOrder": 889
                                    },
                                    {
                                      "value": "anim",
                                      "label": "Perimeter West",
                                      "displayOrder": 609
                                    }
                                  ]
                                },
                                {
                                  "key": "tempor in reprehenderit pariatur",
                                  "configurationKey": "magna pariatur",
                                  "name": "Lobby Entrance",
                                  "type": 2,
                                  "optionsSource": 6,
                                  "displayOrder": 203,
                                  "options": [
                                    {
                                      "value": "aute velit Excepteur",
                                      "label": "Parking Level 2",
                                      "displayOrder": 899
                                    },
                                    {
                                      "value": "cillum labore qui Lorem",
                                      "label": "North Gate Camera",
                                      "displayOrder": 877
                                    }
                                  ]
                                }
                              ],
                              "width": 503,
                              "height": 879,
                              "minWidth": 363,
                              "minHeight": 322,
                              "maxWidth": 934,
                              "maxHeight": 626
                            }
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Save a dashboard's layout",
        "description": "Persists widget positions and sizes. Returns the **whole dashboard**, so\nyou can reconcile against what the server actually stored rather than\ntrusting the local layout.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putDashboardsByDashboardTypeLayout"
      }
    },
    "/api/dashboards/{dashboardType}/widgets": {
      "post": {
        "tags": [
          "Dashboard"
        ],
        "parameters": [
          {
            "name": "dashboardType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/DashboardType"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddDashboardWidgetsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AddDashboardWidgetsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AddDashboardWidgetsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardWidgetDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "251a255b-0946-4089-ac96-cb769227c9df",
                          "dashboardLayoutId": "f583121d-e002-434d-abd6-f7920bf8a39e",
                          "name": "North Gate Camera",
                          "widgetKey": "irure nisi cillum dolor",
                          "x": 645,
                          "y": 98,
                          "width": 517,
                          "height": 769,
                          "configuration": {},
                          "anprResponseCategory": 1,
                          "incidentResponseCategory": 5,
                          "vfrResponseCategory": 5,
                          "flowResponseCategory": 5,
                          "countingResponseCategory": 4,
                          "definition": {
                            "id": "c6c3c64f-57e8-4b6d-a2c6-67bfcfebbb77",
                            "widgetSectionId": "f8942f90-ded7-487b-adce-ac05b009a868",
                            "key": "anim cillum ut Excepteur nostrud",
                            "sectionKey": "ad",
                            "subtitle": "Loading Bay 3",
                            "description": "Lobby Entrance",
                            "dashboardType": 4,
                            "category": 1,
                            "visualizationType": 1,
                            "visualizations": [],
                            "actions": [
                              {
                                "key": "eu consequat irure nulla",
                                "configurationKey": "incididunt aliqua consequat deserunt non",
                                "name": "Parking Level 2",
                                "type": 2,
                                "optionsSource": 3,
                                "displayOrder": 175,
                                "options": [
                                  {
                                    "value": "quis irure",
                                    "label": "Lobby Entrance",
                                    "displayOrder": 902
                                  },
                                  {
                                    "value": "quis commodo anim",
                                    "label": "Perimeter West",
                                    "displayOrder": 83
                                  }
                                ]
                              },
                              {
                                "key": "quis in eu",
                                "configurationKey": "esse sunt dolore incididunt",
                                "name": "North Gate Camera",
                                "type": 4,
                                "optionsSource": 1,
                                "displayOrder": 995,
                                "options": [
                                  {
                                    "value": "in labore ipsum qui",
                                    "label": "Perimeter West",
                                    "displayOrder": 697
                                  },
                                  {
                                    "value": "sit dolore amet",
                                    "label": "Lobby Entrance",
                                    "displayOrder": 583
                                  }
                                ]
                              }
                            ],
                            "width": 621,
                            "height": 564,
                            "minWidth": 372,
                            "minHeight": 449,
                            "maxWidth": 405,
                            "maxHeight": 890
                          }
                        },
                        {
                          "id": "39326457-481b-4144-a3e8-e8f79432cb0f",
                          "dashboardLayoutId": "e9b16faa-b139-4a0f-afda-d40e50ad517b",
                          "name": "Parking Level 2",
                          "widgetKey": "sit esse",
                          "x": 879,
                          "y": 892,
                          "width": 430,
                          "height": 288,
                          "configuration": {},
                          "anprResponseCategory": 1,
                          "incidentResponseCategory": 2,
                          "vfrResponseCategory": 3,
                          "flowResponseCategory": 1,
                          "countingResponseCategory": 6,
                          "definition": {
                            "id": "5a1584ef-1f1f-4f14-a8bb-3961e5feb4b3",
                            "widgetSectionId": "5a25680d-674c-4764-a8db-9a79a268b3d5",
                            "key": "cillum",
                            "sectionKey": "dolore do",
                            "subtitle": "Lobby Entrance",
                            "description": "North Gate Camera",
                            "dashboardType": 4,
                            "category": 3,
                            "visualizationType": 10,
                            "visualizations": [],
                            "actions": [
                              {
                                "key": "tempor adipisicing",
                                "configurationKey": "ex non minim laboris",
                                "name": "North Gate Camera",
                                "type": 3,
                                "optionsSource": 6,
                                "displayOrder": 169,
                                "options": [
                                  {
                                    "value": "commodo id",
                                    "label": "North Gate Camera",
                                    "displayOrder": 249
                                  },
                                  {
                                    "value": "culpa",
                                    "label": "Perimeter West",
                                    "displayOrder": 860
                                  }
                                ]
                              },
                              {
                                "key": "sed sint fugiat tempor",
                                "configurationKey": "sed",
                                "name": "Loading Bay 3",
                                "type": 3,
                                "optionsSource": 6,
                                "displayOrder": 751,
                                "options": [
                                  {
                                    "value": "dolore ullamco",
                                    "label": "Perimeter West",
                                    "displayOrder": 81
                                  },
                                  {
                                    "value": "nisi",
                                    "label": "Parking Level 2",
                                    "displayOrder": 947
                                  }
                                ]
                              }
                            ],
                            "width": 582,
                            "height": 458,
                            "minWidth": 581,
                            "minHeight": 774,
                            "maxWidth": 479,
                            "maxHeight": 755
                          }
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardWidgetDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardWidgetDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Add widgets to a dashboard",
        "description": "Adds several at once; `data` is the list of created widgets with their\nnew ids. `409` means a widget conflicts with one already placed - the\nsame singleton widget added twice, typically. `404` means the widget\ntype is not valid for this dashboard.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `409` | `Prefer: code=409` | Conflict |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDashboardsByDashboardTypeWidgets"
      }
    },
    "/api/dashboards/{dashboardType}/widgets/duplicate": {
      "post": {
        "tags": [
          "Dashboard"
        ],
        "parameters": [
          {
            "name": "dashboardType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/DashboardType"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DuplicateDashboardWidgetRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DuplicateDashboardWidgetRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DuplicateDashboardWidgetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardWidgetDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "7973fa53-db85-48b7-a68f-24d03fe9dad2",
                        "dashboardLayoutId": "709b724b-3eae-481b-ab06-1292676e176c",
                        "name": "Lobby Entrance",
                        "widgetKey": "eiusmod laborum nulla quis",
                        "x": 218,
                        "y": 663,
                        "width": 992,
                        "height": 509,
                        "configuration": {},
                        "anprResponseCategory": 5,
                        "incidentResponseCategory": 1,
                        "vfrResponseCategory": 1,
                        "flowResponseCategory": 5,
                        "countingResponseCategory": 3,
                        "definition": {
                          "id": "46594fab-dd90-4f15-a55d-27f6ab3f8318",
                          "widgetSectionId": "f71c5fd2-cdf9-4c7a-a498-d881dbec0fd4",
                          "key": "dolore labore",
                          "sectionKey": "laboris eu ipsum dolore",
                          "subtitle": "Perimeter West",
                          "description": "Loading Bay 3",
                          "dashboardType": 2,
                          "category": 1,
                          "visualizationType": 17,
                          "visualizations": [],
                          "actions": [
                            {
                              "key": "nulla occaecat voluptate",
                              "configurationKey": "aute amet proident minim",
                              "name": "Parking Level 2",
                              "type": 3,
                              "optionsSource": 2,
                              "displayOrder": 399,
                              "options": [
                                {
                                  "value": "irure fugiat commodo nisi et",
                                  "label": "North Gate Camera",
                                  "displayOrder": 551
                                },
                                {
                                  "value": "laborum esse",
                                  "label": "North Gate Camera",
                                  "displayOrder": 349
                                }
                              ]
                            },
                            {
                              "key": "in",
                              "configurationKey": "est pariatur dolor reprehenderit",
                              "name": "Loading Bay 3",
                              "type": 3,
                              "optionsSource": 5,
                              "displayOrder": 305,
                              "options": [
                                {
                                  "value": "reprehenderit",
                                  "label": "Lobby Entrance",
                                  "displayOrder": 27
                                },
                                {
                                  "value": "ex laboris",
                                  "label": "Parking Level 2",
                                  "displayOrder": 503
                                }
                              ]
                            }
                          ],
                          "width": 484,
                          "height": 320,
                          "minWidth": 696,
                          "minHeight": 552,
                          "maxWidth": 411,
                          "maxHeight": 92
                        }
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardWidgetDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardWidgetDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Duplicate a dashboard widget",
        "description": "Copies an existing widget with its configuration and returns the copy.\nFaster than reading the original and re-adding it, and it keeps settings\nthe add endpoint does not accept.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `409` | `Prefer: code=409` | Conflict |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDashboardsByDashboardTypeWidgetsDuplicate"
      }
    },
    "/api/dashboards/widgets/{dashboardWidgetId}": {
      "put": {
        "tags": [
          "Dashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDashboardWidgetRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDashboardWidgetRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDashboardWidgetRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardWidgetDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "01f2ca72-6555-47ce-a1f1-645ccbf059cd",
                        "dashboardLayoutId": "12f9b215-dce6-4216-ae62-fd2925dfe9d9",
                        "name": "Parking Level 2",
                        "widgetKey": "ut magna pariatur ut",
                        "x": 886,
                        "y": 645,
                        "width": 605,
                        "height": 506,
                        "configuration": {},
                        "anprResponseCategory": 3,
                        "incidentResponseCategory": 4,
                        "vfrResponseCategory": 5,
                        "flowResponseCategory": 4,
                        "countingResponseCategory": 4,
                        "definition": {
                          "id": "99aef328-02da-4287-aae7-f40f97b065d7",
                          "widgetSectionId": "a56aa905-23ef-4580-ac48-3fd4070e8270",
                          "key": "magna commodo sed eiusmod nisi",
                          "sectionKey": "laborum",
                          "subtitle": "Perimeter West",
                          "description": "Lobby Entrance",
                          "dashboardType": 2,
                          "category": 3,
                          "visualizationType": 1,
                          "visualizations": [
                            25,
                            20
                          ],
                          "actions": [
                            {
                              "key": "et ipsum",
                              "configurationKey": "eiusmod proident ex occaecat",
                              "name": "Lobby Entrance",
                              "type": 4,
                              "optionsSource": 6,
                              "displayOrder": 85,
                              "options": [
                                {
                                  "value": "sint anim ullamco amet cupidatat",
                                  "label": "Lobby Entrance",
                                  "displayOrder": 773
                                },
                                {
                                  "value": "dolore in Lorem sit",
                                  "label": "Loading Bay 3",
                                  "displayOrder": 252
                                }
                              ]
                            },
                            {
                              "key": "sint nostrud proident non quis",
                              "configurationKey": "ea aliquip",
                              "name": "Perimeter West",
                              "type": 3,
                              "optionsSource": 3,
                              "displayOrder": 354,
                              "options": [
                                {
                                  "value": "sed",
                                  "label": "Loading Bay 3",
                                  "displayOrder": 755
                                },
                                {
                                  "value": "sit aliquip",
                                  "label": "North Gate Camera",
                                  "displayOrder": 13
                                }
                              ]
                            }
                          ],
                          "width": 836,
                          "height": 788,
                          "minWidth": 925,
                          "minHeight": 69,
                          "maxWidth": 77,
                          "maxHeight": 32
                        }
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardWidgetDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardWidgetDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a dashboard widget",
        "description": "Note the path: widgets are addressed by id **without** the dashboard\ntype, unlike everything above. Returns the updated widget.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putDashboardsWidgetsByDashboardWidget"
      },
      "delete": {
        "tags": [
          "Dashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete a dashboard widget",
        "description": "**The spec is incomplete here.** The action uses\n`BuildOkOrNotModifiedResponse`, so a real instance answers **`304` with\nan empty body** when nothing was deleted - but `304` is not declared, so\nthe mock cannot serve it. An already-deleted widget lands there rather\nthan on the declared `404`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteDashboardsWidgetsByDashboardWidget"
      }
    },
    "/api/dashboards/{dashboardType}/filter": {
      "get": {
        "tags": [
          "DashboardFilter"
        ],
        "parameters": [
          {
            "name": "dashboardType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/DashboardType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "17700d17-f8c4-4ce1-a6c5-d36ce2a49dde",
                        "dashboardType": 1,
                        "payload": {},
                        "modifiedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get the current user's saved filter for a dashboard",
        "description": "Note the singular path segment - `/filter` reads the caller's saved\nvalues, `/filters` lists the available filter definitions. Easy to\nconfuse; they return different things.\n\nA user with nothing saved gets `200` with `data: null`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDashboardsByDashboardTypeFilter"
      }
    },
    "/api/dashboards/filters": {
      "post": {
        "tags": [
          "DashboardFilter"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddDashboardFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AddDashboardFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AddDashboardFilterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "3df2bcd9-6bfe-459e-a86d-3edd06930008",
                        "dashboardType": 2,
                        "payload": {},
                        "modifiedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Save a dashboard filter",
        "description": "Creates a saved filter for the calling user. `409` means one already\nexists for that dashboard type - update it rather than creating a second.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `409` | `Prefer: code=409` | Conflict |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDashboardsFilters"
      }
    },
    "/api/dashboards/filters/{dashboardFilterId}": {
      "get": {
        "tags": [
          "DashboardFilter"
        ],
        "parameters": [
          {
            "name": "dashboardFilterId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "09ce2a58-5957-4f99-ac3c-799d1607d8c1",
                        "dashboardType": 4,
                        "payload": {},
                        "modifiedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a saved dashboard filter",
        "description": "By id, rather than by dashboard type. Scoped to the caller - another\nuser's filter id returns `404`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDashboardsFiltersByDashboardFilter"
      },
      "put": {
        "tags": [
          "DashboardFilter"
        ],
        "parameters": [
          {
            "name": "dashboardFilterId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDashboardFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDashboardFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateDashboardFilterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "38947e95-3a50-43ee-a8c1-d62869a35e17",
                        "dashboardType": 4,
                        "payload": {},
                        "modifiedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DashboardFilterDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a saved dashboard filter",
        "description": "Full replacement, not a merge - send every value you want kept.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putDashboardsFiltersByDashboardFilter"
      },
      "delete": {
        "tags": [
          "DashboardFilter"
        ],
        "parameters": [
          {
            "name": "dashboardFilterId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete a saved dashboard filter",
        "description": "`304` with an empty body means nothing was deleted, which is what an\nalready-deleted id gives you rather than the declared `404`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteDashboardsFiltersByDashboardFilter"
      }
    },
    "/api/data/drill-search/anpr/metadata": {
      "post": {
        "tags": [
          "DrilldownSearch"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DrilldownStateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DrilldownStateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DrilldownStateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DrilldownStateResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "durationSeconds": 742,
                        "steps": [
                          {
                            "dimension": 8,
                            "values": [
                              {
                                "value": "irure aute",
                                "count": 321
                              },
                              {
                                "value": "consequat ut",
                                "count": 439
                              }
                            ]
                          },
                          {
                            "dimension": 3,
                            "values": [
                              {
                                "value": "in id",
                                "count": 240
                              },
                              {
                                "value": "dolor in in consectetur qui",
                                "count": 226
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DrilldownStateResponse"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_DrilldownStateResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get the filter options still available",
        "description": "Send the drill-down state so far and get back the values still\nselectable for each remaining field - which is how the UI greys out\noptions that would return nothing.\n\nCall this again after every user choice; the option set narrows as the\nstate accumulates.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataDrillSearchAnprMetadata"
      }
    },
    "/api/data/drill-search/anpr/vehicle-info": {
      "post": {
        "tags": [
          "DrilldownSearch"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DrilldownStateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DrilldownStateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DrilldownStateRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_VehicleInfoDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "e3c7d222-e146-4887-a329-35fc6c026143",
                          "mediaSourceId": "9bdb2d27-520f-4dff-a06c-08f4bfbd9ad8",
                          "mediaSourceName": "North Gate Camera",
                          "zoneName": "North Gate Camera",
                          "recognized": true,
                          "licensePlate": {
                            "number": "Ut ipsum occaecat in",
                            "country": "laboris eu officia Duis reprehenderit",
                            "state": "veniam Duis",
                            "type": "sunt sed enim",
                            "color": "White",
                            "confidence": 87,
                            "boundingBox": {
                              "left": 928,
                              "top": 31,
                              "right": 492,
                              "bottom": 203
                            },
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                          },
                          "modelMakeRecognition": {
                            "make": {
                              "name": "Lobby Entrance",
                              "confidence": 83
                            },
                            "model": {
                              "name": "Parking Level 2",
                              "confidence": 92
                            },
                            "category": {
                              "name": "Lobby Entrance",
                              "confidence": 90
                            },
                            "color": {
                              "name": "Loading Bay 3",
                              "confidence": 97
                            }
                          },
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "triggerType": 1,
                          "hasFaceVehicleDetection": true,
                          "watchListIds": [
                            "32f31465-3d92-486d-a079-06288f754904",
                            "4e5f8bf0-b364-4e05-a81c-a79e43e23027"
                          ]
                        },
                        {
                          "id": "e139606f-a589-4b88-a629-32fb99c8388c",
                          "mediaSourceId": "390b7433-174e-406a-ade7-1809eee4a7af",
                          "mediaSourceName": "Loading Bay 3",
                          "zoneName": "North Gate Camera",
                          "recognized": false,
                          "licensePlate": {
                            "number": "irure",
                            "country": "nostrud in deserunt",
                            "state": "minim proident nulla dolor Lorem",
                            "type": "dolore dolor irure ut cillum",
                            "color": "Black",
                            "confidence": 76,
                            "boundingBox": {
                              "left": 0,
                              "top": 255,
                              "right": 160,
                              "bottom": 557
                            },
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                          },
                          "modelMakeRecognition": {
                            "make": {
                              "name": "Parking Level 2",
                              "confidence": 85
                            },
                            "model": {
                              "name": "Perimeter West",
                              "confidence": 94
                            },
                            "category": {
                              "name": "Loading Bay 3",
                              "confidence": 98
                            },
                            "color": {
                              "name": "Parking Level 2",
                              "confidence": 76
                            }
                          },
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "triggerType": 2,
                          "hasFaceVehicleDetection": true,
                          "watchListIds": [
                            "355cdaf8-4c39-4880-af1b-507a634b738e",
                            "9f030fb5-be8c-466b-ac90-08fe5cdce1ef"
                          ]
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_VehicleInfoDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_VehicleInfoDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Run the drill-down search",
        "description": "Applies the accumulated state and returns matching plate reads as a\npaged `FetchResponse`. The same records as\n`POST /api/data/lpr/vehicle-info-filtered`, reached a different way.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataDrillSearchAnprVehicleInfo"
      }
    },
    "/api/configuration/basic/enrolled-vehicle": {
      "get": {
        "tags": [
          "EnrolledVehicle"
        ],
        "parameters": [
          {
            "name": "SearchText",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_EnrolledVehicleDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "0deefc29-40a8-487e-a974-34cb62e89eae",
                          "licensePlate": "M-QT-2048",
                          "plateType": "irure",
                          "category": "ad Excepteur",
                          "make": "Mercedes-Benz",
                          "model": "laborum eiusmod Ut",
                          "color": "Black",
                          "newPlateCode": "do ut consectetur sed",
                          "diplomaticCode": "est cupidatat",
                          "minorColor": "Red",
                          "code": "veniam Duis",
                          "description": "Lobby Entrance",
                          "vinNumber": "proident commodo id ut",
                          "yearOfManufacture": 153,
                          "wanted": true,
                          "stolen": false,
                          "referenceNumber": "non exercitation sed reprehenderit",
                          "nationalNumber": "eiusmod Lorem",
                          "method": 4,
                          "department": "nisi",
                          "customField1": "et",
                          "customField2": "irure voluptate",
                          "customField3": "velit magna ea nostrud",
                          "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "enrolledPersonNames": [
                            "consectetur non amet magna sed",
                            "cillum consectetur officia elit"
                          ]
                        },
                        {
                          "id": "3858953c-f555-41ac-a9a0-789fd8826b68",
                          "licensePlate": "M-QT-2048",
                          "plateType": "laboris",
                          "category": "pariatur mollit",
                          "make": "Nissan",
                          "model": "proident occaecat",
                          "color": "Black",
                          "newPlateCode": "proident fugiat id nisi sed",
                          "diplomaticCode": "laborum dolore",
                          "minorColor": "Black",
                          "code": "veniam",
                          "description": "Perimeter West",
                          "vinNumber": "irure id cupidatat",
                          "yearOfManufacture": 878,
                          "wanted": false,
                          "stolen": true,
                          "referenceNumber": "dolor mollit labore dolore in",
                          "nationalNumber": "dolor velit enim sint",
                          "method": 3,
                          "department": "ut",
                          "customField1": "sint non dolore voluptate deserunt",
                          "customField2": "aute officia in cupidatat aliqua",
                          "customField3": "ex enim",
                          "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "enrolledPersonNames": [
                            "deserunt consequat",
                            "dolor nulla anim deserunt id"
                          ]
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_EnrolledVehicleDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_EnrolledVehicleDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List enrolled vehicles",
        "description": "Paged `FetchResponse`: `totalCount` beside `data`, `message` is the\ntiming string. Personal data - plates are identifiers.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getEnrolledVehicle"
      },
      "post": {
        "tags": [
          "EnrolledVehicle"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddEnrolledVehicleRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AddEnrolledVehicleRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AddEnrolledVehicleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "e565b11a-5cae-412f-a985-feae6095c97f",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Enrol a vehicle",
        "description": "Returns the new vehicle's id. Link it to a person afterwards with\n`POST /api/configuration/basic/person/{personId}/vehicles`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postEnrolledVehicle"
      },
      "put": {
        "tags": [
          "EnrolledVehicle"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEnrolledVehicleRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEnrolledVehicleRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEnrolledVehicleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update an enrolled vehicle",
        "description": "The id travels in the body, not the path. `304` with an empty body means\nnothing was written.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putEnrolledVehicle"
      }
    },
    "/api/configuration/basic/enrolled-vehicle/{id}": {
      "get": {
        "tags": [
          "EnrolledVehicle"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnrolledVehicleDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "0b52d267-2d52-4353-a287-98db37ac60b5",
                        "licensePlate": "ZH 88231",
                        "plateType": "et",
                        "category": "labore consectetur reprehenderit in",
                        "make": "Mercedes-Benz",
                        "model": "Duis",
                        "color": "Blue",
                        "newPlateCode": "adipisicing",
                        "diplomaticCode": "sunt ea",
                        "minorColor": "Blue",
                        "code": "cillum ut dolore mollit id",
                        "description": "Parking Level 2",
                        "vinNumber": "quis adipisicing occaecat eiusmod est",
                        "yearOfManufacture": 168,
                        "wanted": false,
                        "stolen": false,
                        "referenceNumber": "mollit",
                        "nationalNumber": "Ut fugiat dolore officia",
                        "method": 1,
                        "department": "sit ex dolor id ipsum",
                        "customField1": "labore",
                        "customField2": "voluptate ex",
                        "customField3": "irure aute",
                        "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z",
                        "enrolledPersonNames": [
                          "anim enim ullamco",
                          "officia"
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnrolledVehicleDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnrolledVehicleDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one enrolled vehicle",
        "description": "The only endpoint on this tag that gives a **real `404`** - it uses\n`BuildOkOrNotFoundResponse`, so a missing vehicle is `404` with an empty\n`message` rather than `200` with `data: null`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getEnrolledVehicleById"
      },
      "delete": {
        "tags": [
          "EnrolledVehicle"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete an enrolled vehicle",
        "description": "`304` means nothing was deleted. Any person links go with it; the people\nthemselves survive.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteEnrolledVehicleById"
      }
    },
    "/api/data/exports/resources": {
      "get": {
        "tags": [
          "Export"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportResourceResponseDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "resourceKey": "exercitation cupidatat sint nostrud incididunt",
                          "supportedFormats": [
                            0,
                            1
                          ],
                          "supportsFullFrameImage": true,
                          "supportsCroppedImage": true
                        },
                        {
                          "resourceKey": "velit adipisicing tempor",
                          "supportedFormats": [
                            0,
                            0
                          ],
                          "supportsFullFrameImage": true,
                          "supportsCroppedImage": true
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportResourceResponseDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportResourceResponseDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List exportable resources",
        "description": "The catalogue of things that can be exported, each with the\n`resourceKey` you pass to `POST /api/data/exports/jobs`. Start here -\nkeys are not guessable and there is no other way to discover them.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataExportsResources"
      }
    },
    "/api/data/exports/resources/{resourceKey}/columns": {
      "get": {
        "tags": [
          "Export"
        ],
        "parameters": [
          {
            "name": "resourceKey",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportResourceColumnsResponseDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "resourceKey": "ut sed",
                        "supportsFullFrameImage": true,
                        "supportsCroppedImage": true,
                        "columns": [
                          {
                            "key": "ipsum sint nostrud",
                            "defaultHeader": "est sint irure id",
                            "supportedFormats": [
                              0,
                              0
                            ]
                          },
                          {
                            "key": "exercitation",
                            "defaultHeader": "pariatur laborum",
                            "supportedFormats": [
                              1,
                              0
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportResourceColumnsResponseDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportResourceColumnsResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List a resource's exportable columns",
        "description": "The column set for one `resourceKey`, for building a column picker.\n\nAn unrecognised key returns **`400`** with\n`Unsupported export resource key: <key>` in `message` - not a `404`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataExportsResourcesByResourceKeyColumns"
      }
    },
    "/api/data/exports/jobs": {
      "post": {
        "tags": [
          "Export"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateExportJobRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateExportJobRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateExportJobRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "84b339a8-0e6b-45a7-ac94-9bfb58be3268",
                        "type": 1,
                        "status": 0,
                        "resourceKey": "ad Lorem velit laboris amet",
                        "format": 0,
                        "columns": [
                          {
                            "key": "dolor pariatur id",
                            "header": "exercitation"
                          },
                          {
                            "key": "fugiat Lorem",
                            "header": "amet cillum proident pariatur"
                          }
                        ],
                        "pageNumber": 183,
                        "recordLimit": 152,
                        "fileName": "Lobby Entrance",
                        "fileSize": 8.48,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "startedAt": "2026-07-27T09:14:33Z",
                        "completedAt": "2026-07-27T09:14:33Z",
                        "expiresAt": "2026-07-27T09:14:33Z",
                        "errorMessage": "dolor magna non proident ut"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Queue an export job",
        "description": "Creates the job and returns it immediately with its initial state. **The\nfile does not exist yet.** Poll `GET /api/data/exports/jobs/{jobId}`\nuntil it reports ready, then call `/download`.\n\nThe job is owned by the calling user and only that user sees it in\n`GET /api/data/exports/jobs`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataExportsJobs"
      },
      "get": {
        "tags": [
          "Export"
        ],
        "parameters": [
          {
            "name": "From",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "To",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "FileNameSearch",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Status",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/ExportJobStatus"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_ExportJobResponseDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "5f2b2bd8-17fa-4db0-a309-41968141e4b0",
                          "type": 1,
                          "status": 4,
                          "resourceKey": "irure",
                          "format": 0,
                          "columns": [
                            {
                              "key": "sint et ut",
                              "header": "laboris exercitation"
                            },
                            {
                              "key": "sit",
                              "header": "ex consequat dolore magna sed"
                            }
                          ],
                          "pageNumber": 30,
                          "recordLimit": 822,
                          "fileName": "Perimeter West",
                          "fileSize": 22.1,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "startedAt": "2026-07-27T09:14:33Z",
                          "completedAt": "2026-07-27T09:14:33Z",
                          "expiresAt": "2026-07-27T09:14:33Z",
                          "errorMessage": "dolor ea"
                        },
                        {
                          "id": "67eb7a6d-468f-4f92-a814-0093e9e4cd5e",
                          "type": 0,
                          "status": 1,
                          "resourceKey": "ut sint",
                          "format": 1,
                          "columns": [
                            {
                              "key": "ea exercitation cupidatat",
                              "header": "consequat non"
                            },
                            {
                              "key": "laborum ullamco amet commodo eu",
                              "header": "tempor laborum est anim"
                            }
                          ],
                          "pageNumber": 461,
                          "recordLimit": 563,
                          "fileName": "Parking Level 2",
                          "fileSize": 59.22,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "startedAt": "2026-07-27T09:14:33Z",
                          "completedAt": "2026-07-27T09:14:33Z",
                          "expiresAt": "2026-07-27T09:14:33Z",
                          "errorMessage": "pariatur id"
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_ExportJobResponseDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_ExportJobResponseDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the calling user's export jobs",
        "description": "Paged `FetchResponse`: `totalCount` sits beside `data` at the top level,\nnot inside it, and `message` is the timing string.\n\nScoped to the caller (`GetUserJobsAsync`); there is no endpoint that\nlists another user's jobs.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataExportsJobs"
      }
    },
    "/api/data/exports/dashboard/jobs": {
      "post": {
        "tags": [
          "Export"
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "required": [
                  "Images",
                  "Manifest"
                ],
                "type": "object",
                "properties": {
                  "Manifest": {
                    "type": "string"
                  },
                  "Images": {
                    "minItems": 1,
                    "type": "array",
                    "items": {
                      "type": "string",
                      "format": "binary"
                    }
                  }
                }
              },
              "encoding": {
                "Manifest": {
                  "style": "form"
                },
                "Images": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "625c3c44-b834-4321-a496-3622ce905b1e",
                        "type": 1,
                        "status": 2,
                        "resourceKey": "Lorem adipisicing",
                        "format": 0,
                        "columns": [
                          {
                            "key": "cupidatat sit amet quis Lorem",
                            "header": "eiusmod culpa"
                          },
                          {
                            "key": "ad",
                            "header": "dolore cillum velit"
                          }
                        ],
                        "pageNumber": 204,
                        "recordLimit": 710,
                        "fileName": "North Gate Camera",
                        "fileSize": 3.04,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "startedAt": "2026-07-27T09:14:33Z",
                        "completedAt": "2026-07-27T09:14:33Z",
                        "expiresAt": "2026-07-27T09:14:33Z",
                        "errorMessage": "fugiat dolore sed"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Content Too Large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "default": {
                    "summary": "Content Too Large",
                    "value": {
                      "type": "https://tools.ietf.org/html/rfc9110#section-15.5.14",
                      "title": "Request body too large.",
                      "status": 413
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Queue a dashboard export job",
        "description": "`multipart/form-data`, not JSON: a `manifest` JSON part plus the rendered\ndashboard images. The client renders the charts and uploads them; the\nserver composes the document.\n\n**Hard limit 64 MB** for the whole multipart body\n(`RequestSizeLimit`/`RequestFormLimits`). Exceeding it returns `413` as\nRFC 7807 ProblemDetails from ASP.NET - **not** the Zen envelope, because\nthe request is rejected before the controller runs.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `413` | `Prefer: code=413` | Content Too Large |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataExportsDashboardJobs"
      }
    },
    "/api/data/exports/jobs/{jobId}/retry": {
      "post": {
        "tags": [
          "Export"
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "d49e9199-144c-446e-a008-71acbc1d4f7c",
                        "type": 1,
                        "status": 0,
                        "resourceKey": "id ad in et dolor",
                        "format": 1,
                        "columns": [
                          {
                            "key": "minim laborum consectetur ut Ut",
                            "header": "eiusmod aliqua"
                          },
                          {
                            "key": "incididunt elit tempor non",
                            "header": "in sint est aute"
                          }
                        ],
                        "pageNumber": 439,
                        "recordLimit": 510,
                        "fileName": "Loading Bay 3",
                        "fileSize": 68.73,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "startedAt": "2026-07-27T09:14:33Z",
                        "completedAt": "2026-07-27T09:14:33Z",
                        "expiresAt": "2026-07-27T09:14:33Z",
                        "errorMessage": "culpa commodo qui adipisicing"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Retry a failed export job",
        "description": "Re-queues a job that failed. Returns the job in its new state.\n\nA job that is not in a retryable state comes back as `400`, not `409`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataExportsJobsByJobRetry"
      }
    },
    "/api/data/exports/jobs/{jobId}": {
      "get": {
        "tags": [
          "Export"
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "5bc49e61-24bc-40f1-a4f9-6fdaeb337af1",
                        "type": 0,
                        "status": 1,
                        "resourceKey": "voluptate eiusmod et nulla",
                        "format": 0,
                        "columns": [
                          {
                            "key": "exercitation laboris commodo ut",
                            "header": "minim"
                          },
                          {
                            "key": "ipsum deserunt sunt do ex",
                            "header": "et ullamco ut incididunt occaecat"
                          }
                        ],
                        "pageNumber": 273,
                        "recordLimit": 52,
                        "fileName": "Loading Bay 3",
                        "fileSize": 60.05,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "startedAt": "2026-07-27T09:14:33Z",
                        "completedAt": "2026-07-27T09:14:33Z",
                        "expiresAt": "2026-07-27T09:14:33Z",
                        "errorMessage": "non"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ExportJobResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one export job",
        "description": "The polling endpoint. Returns the job's current state; `404` with\n`Export job <id> was not found.` when it does not exist or belongs to\nsomeone else.\n\nNot on the license bypass list, unlike job creation and listing.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataExportsJobsByJob"
      }
    },
    "/api/data/exports/jobs/bulk-delete": {
      "post": {
        "tags": [
          "Export"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete several export jobs",
        "description": "A `POST` that deletes: the body is the list of job ids, validated by\n`[NotEmptyGuidList]`.\n\nReturns `200`/`data: true` when something was deleted and **`304` with\nan empty body** when nothing was - ids that do not exist, or are not\nyours, land here.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataExportsJobsBulkDelete"
      }
    },
    "/api/data/exports/jobs/{jobId}/download": {
      "get": {
        "tags": [
          "Export"
        ],
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "410": {
            "description": "Gone",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "type": "dolor",
                      "title": "Parking Level 2",
                      "status": 690,
                      "detail": "id sed dolore",
                      "instance": "aliqua magna"
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Download a finished export file",
        "description": "Returns the file itself with `Content-Disposition`, supporting range\nrequests. **The `200` is a binary body, not the envelope** - the spec\ndeclares no schema for it.\n\nThe status tells you the job's state, and every one of these is a normal\noutcome rather than a client bug:\n\n| Status | State | Body |\n| --- | --- | --- |\n| `200` | ready | the file |\n| `409` | still running | envelope, `Export job <id> is still in progress.` |\n| `400` | the job failed | envelope, no downloadable file |\n| `410` | the file expired and was cleaned up | **empty**, no envelope |\n| `404` | unknown job, or the file is missing from storage | envelope |\n| `500` | binary storage unavailable | envelope |\n\nFiles are removed on a schedule by the `cleanup-expired-export-files`\nrecurring job, which is what turns a `200` into a `410` over time.\nRe-queue with `POST /api/data/exports/jobs` rather than retrying.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `409` | `Prefer: code=409` | Conflict |\n| `410` | `Prefer: code=410` | Gone |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataExportsJobsByJobDownload"
      }
    },
    "/api/configuration/basic/face/features": {
      "post": {
        "tags": [
          "FaceRecognition"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ImageRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ImageRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FaceFeatureVectorResult"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "featureVector": "mollit tempor do ea",
                        "yaw": 90.75,
                        "pitch": 96.85
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FaceFeatureVectorResult"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FaceFeatureVectorResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "406": {
            "description": "Not Acceptable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Acceptable - face payload rejected",
                    "value": {
                      "data": null,
                      "message": "No face detected in the supplied image.",
                      "resultCode": 406
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Extract a face feature vector from an image",
        "description": "Computes the biometric template for an image without storing anything -\nuse it to check a photo before enrolling it.\n\nThe image is a base64 string in the body. Two `400`s are raised before\nany processing:\n\n- `Image data is missing.` - `base64Image` was absent or blank;\n- `Invalid Base64 string format.` - it did not decode.\n\n`406` means the image decoded but no usable face was detected.\n`excludeChecks` skips the quality gates, which is how you force a\nmarginal photo through.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `406` | `Prefer: code=406` | Not Acceptable |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postFaceFeatures"
      }
    },
    "/api/configuration/basic/face": {
      "post": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "skipFaceValidation",
            "in": "query",
            "schema": {
              "type": "boolean",
              "default": false
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollFacesRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollFacesRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollFacesRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GuidList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        "0fd98196-db1c-46b0-aa2d-6290d98128b5",
                        "7cb84ad8-4272-4db7-a3db-720b808023cc"
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GuidList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GuidList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "406": {
            "description": "Not Acceptable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Acceptable - face payload rejected",
                    "value": {
                      "data": null,
                      "message": "No face detected in the supplied image.",
                      "resultCode": 406
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Unprocessable Entity - business rule",
                    "value": {
                      "data": null,
                      "message": "Cannot delete a media source that is in use by an active flow.",
                      "resultCode": 422
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Enrol faces",
        "description": "Enrols one or more faces against existing people; `data` is the list of\nnew face ids, in request order.\n\n`skipFaceValidation=true` (query) bypasses the quality checks - use it\nonly for images you have already vetted, since a bad template degrades\nmatching for everyone.\n\n`406` means no usable face was found in one of the images; `422` means\nthe enrolment broke a rule, typically a duplicate of a face already\nenrolled to a different person.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `406` | `Prefer: code=406` | Not Acceptable |\n| `422` | `Prefer: code=422` | Unprocessable Content |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postFace"
      },
      "delete": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "faceId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Unprocessable Entity - business rule",
                    "value": {
                      "data": null,
                      "message": "Cannot delete a media source that is in use by an active flow.",
                      "resultCode": 422
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete an enrolled face",
        "description": "`faceId` is a query parameter. The person survives; only this face and\nits template are removed.\n\n`422` means the face cannot be deleted on its own - it is the person's\nlast remaining face. Delete the person instead, or transfer the face\nfirst.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `422` | `Prefer: code=422` | Unprocessable Content |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteFace"
      }
    },
    "/api/configuration/basic/person/switch-enrolled-face": {
      "post": {
        "tags": [
          "FaceRecognition"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SwitchEnrolledFaceRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SwitchEnrolledFaceRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SwitchEnrolledFaceRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Move the enrolled face between two people",
        "description": "Swaps which person a face is enrolled to, given a source face, its\ncurrent person and the target person - the fix for a face filed under\nthe wrong identity.\n\n`enhanceEnrolledFace` additionally promotes the moved face to the\ntarget's primary template.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postPersonSwitchEnrolledFace"
      }
    },
    "/api/configuration/basic/face/{faceId}/transfer/{transferPersonId}": {
      "patch": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "faceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "transferPersonId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PersonDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "bfa50f88-dc93-4ac7-a51f-360f578ec751",
                        "firstName": "Loading Bay 3",
                        "lastName": "Parking Level 2",
                        "customField1": "Duis veniam dolor pariatur",
                        "customField2": "officia",
                        "customField3": "id voluptate",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "birthYear": 251,
                        "status": 1,
                        "relatedFaces": [
                          {
                            "id": "e24f3038-d1af-44ec-a854-cafc563a01de",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "modifiedAt": "2026-07-27T09:14:33Z",
                            "minAge": 935,
                            "maxAge": 874,
                            "gender": 0,
                            "recognized": false,
                            "isDefault": true,
                            "faceImageName": "Parking Level 2",
                            "featureVector": "ipsum minim ex tempor occaecat",
                            "detectionConfidence": 95,
                            "enrolledPersonId": "d9778c71-c6b4-4f50-a379-85711071a415",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                          },
                          {
                            "id": "d7341484-b483-45c3-a64d-d7c9df384dfb",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "modifiedAt": "2026-07-27T09:14:33Z",
                            "minAge": 134,
                            "maxAge": 917,
                            "gender": 1,
                            "recognized": true,
                            "isDefault": true,
                            "faceImageName": "Loading Bay 3",
                            "featureVector": "qui aute reprehenderit tempor Excepteur",
                            "detectionConfidence": 93,
                            "enrolledPersonId": "4943602b-5931-4581-aea4-bfec92e770a4",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                          }
                        ],
                        "groups": [
                          {
                            "id": "c98b280c-5340-41bc-a0bf-162aaaeed8cd",
                            "name": "Loading Bay 3",
                            "alertOnCapture": true,
                            "isDefault": false
                          },
                          {
                            "id": "b028db59-2bc5-4c01-ac89-2dc78c3439c0",
                            "name": "Loading Bay 3",
                            "alertOnCapture": true,
                            "isDefault": true
                          }
                        ],
                        "roles": [
                          {
                            "id": "f6f053c2-b848-411e-af29-4e5958e5552c",
                            "name": "North Gate Camera"
                          },
                          {
                            "id": "a3876eb8-d6a6-48c9-ae22-a4cc13e6c1a4",
                            "name": "North Gate Camera"
                          }
                        ],
                        "vehicles": [
                          {
                            "id": "b8ceaad1-3be6-4c59-a2e4-302f220db64d",
                            "licensePlate": "B 227 HK",
                            "plateType": "in nisi ex nulla incididunt",
                            "category": "in",
                            "make": "Volkswagen",
                            "model": "culpa eu sit quis magna",
                            "color": "Red",
                            "newPlateCode": "Lorem culpa Duis",
                            "diplomaticCode": "officia anim quis",
                            "minorColor": "Black",
                            "code": "ea dolor sunt",
                            "description": "Perimeter West",
                            "vinNumber": "consequat nostrud ea dolor",
                            "yearOfManufacture": 673,
                            "wanted": false,
                            "stolen": false,
                            "referenceNumber": "nostrud laboris nisi esse",
                            "nationalNumber": "labore",
                            "method": 1,
                            "department": "Duis irure",
                            "customField1": "anim id culpa est magna",
                            "customField2": "proident qui est in voluptate",
                            "customField3": "dolor nulla cupidatat cillum",
                            "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "modifiedAt": "2026-07-27T09:14:33Z",
                            "enrolledPersonNames": [
                              "nulla eiusmod veniam proident",
                              "do"
                            ]
                          },
                          {
                            "id": "fe31622d-eb97-42c9-adb2-ab641569b987",
                            "licensePlate": "B 227 HK",
                            "plateType": "id officia culpa",
                            "category": "quis Duis labore laborum irure",
                            "make": "Nissan",
                            "model": "quis",
                            "color": "Black",
                            "newPlateCode": "exercitation",
                            "diplomaticCode": "aute dolore dolor",
                            "minorColor": "Blue",
                            "code": "sunt tempor",
                            "description": "Parking Level 2",
                            "vinNumber": "sit irure sunt cupidatat",
                            "yearOfManufacture": 758,
                            "wanted": true,
                            "stolen": false,
                            "referenceNumber": "do deserunt",
                            "nationalNumber": "elit minim",
                            "method": 2,
                            "department": "qui adipisicing in",
                            "customField1": "velit amet laborum enim",
                            "customField2": "do nostrud enim sit",
                            "customField3": "labore Duis",
                            "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "modifiedAt": "2026-07-27T09:14:33Z",
                            "enrolledPersonNames": [
                              "cupidatat incididunt dolor consectetur",
                              "incididunt"
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PersonDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PersonDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Transfer a face to another person",
        "description": "Moves the face to `{transferPersonId}`. Returns the **destination\n`PersonDto`**, not a boolean, so you can render the result immediately.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchFaceByFaceTransferByTransferPerson"
      }
    },
    "/api/configuration/basic/face/{faceId}/transfer": {
      "patch": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "faceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PersonDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "5ba6a276-ded8-48eb-a3b3-49a79798b093",
                        "firstName": "North Gate Camera",
                        "lastName": "Perimeter West",
                        "customField1": "nulla amet quis ullamco",
                        "customField2": "ex",
                        "customField3": "quis dolor occaecat culpa sunt",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "birthYear": 747,
                        "status": 0,
                        "relatedFaces": [
                          {
                            "id": "cf312c16-f7b2-4d5c-ad2d-339a3fae425b",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "modifiedAt": "2026-07-27T09:14:33Z",
                            "minAge": 428,
                            "maxAge": 847,
                            "gender": 0,
                            "recognized": false,
                            "isDefault": true,
                            "faceImageName": "Perimeter West",
                            "featureVector": "labore",
                            "detectionConfidence": 89,
                            "enrolledPersonId": "578d4027-9432-455e-a483-5d6871d91a4b",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                          },
                          {
                            "id": "ed96f480-2007-4ac3-a141-5faea207313f",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "modifiedAt": "2026-07-27T09:14:33Z",
                            "minAge": 378,
                            "maxAge": 495,
                            "gender": 1,
                            "recognized": true,
                            "isDefault": true,
                            "faceImageName": "Lobby Entrance",
                            "featureVector": "esse",
                            "detectionConfidence": 96,
                            "enrolledPersonId": "5d864df7-88e9-42fa-aca2-d5744e6e3b50",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                          }
                        ],
                        "groups": [
                          {
                            "id": "f49a71c1-16d8-4db5-ab75-857da13a9798",
                            "name": "Parking Level 2",
                            "alertOnCapture": true,
                            "isDefault": true
                          },
                          {
                            "id": "329b341a-1b74-4d36-af4b-90915ad6335f",
                            "name": "North Gate Camera",
                            "alertOnCapture": false,
                            "isDefault": false
                          }
                        ],
                        "roles": [
                          {
                            "id": "fa92d3b6-654d-45d7-a5d9-4750099cb193",
                            "name": "Perimeter West"
                          },
                          {
                            "id": "9c96c0e9-e72d-45c4-a04b-1c062864cf7f",
                            "name": "Loading Bay 3"
                          }
                        ],
                        "vehicles": [
                          {
                            "id": "3c7fa356-0aa9-43aa-a7e2-02683f8b16a9",
                            "licensePlate": "LT-4471",
                            "plateType": "fugiat",
                            "category": "aliqua elit commodo aliquip adipisicing",
                            "make": "Mercedes-Benz",
                            "model": "in",
                            "color": "Silver",
                            "newPlateCode": "incididunt quis",
                            "diplomaticCode": "ut in amet occaecat ad",
                            "minorColor": "Black",
                            "code": "ea nisi sit laborum",
                            "description": "North Gate Camera",
                            "vinNumber": "fugiat cupidatat",
                            "yearOfManufacture": 694,
                            "wanted": false,
                            "stolen": false,
                            "referenceNumber": "reprehenderit",
                            "nationalNumber": "proident aliqua sit consectetur",
                            "method": 4,
                            "department": "eiusmod ullamco",
                            "customField1": "incididunt elit pariatur tempor minim",
                            "customField2": "fugiat dolor",
                            "customField3": "ut veniam",
                            "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "modifiedAt": "2026-07-27T09:14:33Z",
                            "enrolledPersonNames": [
                              "id in adipisicing mollit aliqua",
                              "aliqua occaecat"
                            ]
                          },
                          {
                            "id": "1c5fe666-ac8e-4aa0-aee1-d0895fd82bd0",
                            "licensePlate": "LT-4471",
                            "plateType": "eiusmod tempor Lorem",
                            "category": "quis minim exercitation cillum cupidatat",
                            "make": "Nissan",
                            "model": "anim aute Duis eu ea",
                            "color": "White",
                            "newPlateCode": "dolor mollit Excepteur",
                            "diplomaticCode": "consectetur minim non",
                            "minorColor": "Black",
                            "code": "consequat quis laboris officia",
                            "description": "North Gate Camera",
                            "vinNumber": "velit mollit aliqua consequat",
                            "yearOfManufacture": 285,
                            "wanted": false,
                            "stolen": false,
                            "referenceNumber": "magna et deserunt dolore enim",
                            "nationalNumber": "cillum dolor consectetur",
                            "method": 1,
                            "department": "elit Ut commodo dolore",
                            "customField1": "cillum id ea proident commodo",
                            "customField2": "et irure in Ut",
                            "customField3": "elit est",
                            "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "modifiedAt": "2026-07-27T09:14:33Z",
                            "enrolledPersonNames": [
                              "nostrud",
                              "mollit laborum deserunt"
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PersonDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PersonDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Transfer a face to a new person",
        "description": "Same action as the route above with the person id omitted, which means\n*create a new person and give them this face*. The response is the newly\ncreated `PersonDto`.\n\nThat difference is invisible in the path - it is entirely a matter of\nwhether the last segment is present.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchFaceByFaceTransfer"
      }
    },
    "/api/configuration/basic/person": {
      "post": {
        "tags": [
          "FaceRecognition"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollPersonRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollPersonRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EnrollPersonRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "07b38e9b-2041-469e-a782-1e7109c7ff0c",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "406": {
            "description": "Not Acceptable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Acceptable - face payload rejected",
                    "value": {
                      "data": null,
                      "message": "No face detected in the supplied image.",
                      "resultCode": 406
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "422": {
            "description": "Unprocessable Content",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Unprocessable Entity - business rule",
                    "value": {
                      "data": null,
                      "message": "Cannot delete a media source that is in use by an active flow.",
                      "resultCode": 422
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Enrol a person",
        "description": "Creates the identity and its first face in one call; `data` is the new\nperson's id.\n\nShares the face-quality failure modes: `406` when the photo contains no\nusable face, `422` when the enrolment breaks a rule - the same person\nenrolled twice, most often.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `406` | `Prefer: code=406` | Not Acceptable |\n| `422` | `Prefer: code=422` | Unprocessable Content |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postPerson"
      },
      "patch": {
        "tags": [
          "FaceRecognition"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEnrolledPeopleRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEnrolledPeopleRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateEnrolledPeopleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update enrolled people",
        "description": "Bulk update of person metadata - names, labels, watchlist membership.\nNot for faces or vehicles, which have their own endpoints.\n\nNeither `404` nor `422` is declared: an unknown person id surfaces as\n`400` or `500`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchPerson"
      },
      "get": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "PersonId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "EnrollmentFilter",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/PersonEnrollmentFilter"
            }
          },
          {
            "name": "PersonName",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ExcludeRolesAndGroups",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FetchResponse_PersonDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "data": [
                          {
                            "id": "6a756646-39b5-43ec-ae5c-98dc84424425",
                            "firstName": "Parking Level 2",
                            "lastName": "Loading Bay 3",
                            "customField1": "labore quis nostrud ut mollit",
                            "customField2": "nostrud ut Lorem",
                            "customField3": "anim irure incididunt do mollit",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "birthYear": 597,
                            "status": 1,
                            "relatedFaces": [
                              {
                                "id": "e55b8c7d-68f9-4df2-aa0d-fca49d7192b4",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 579,
                                "maxAge": 397,
                                "gender": 1,
                                "recognized": false,
                                "isDefault": true,
                                "faceImageName": "Loading Bay 3",
                                "featureVector": "Excepteur",
                                "detectionConfidence": 89,
                                "enrolledPersonId": "647ec381-c6cc-4c48-a48f-77110f1d338f",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              },
                              {
                                "id": "07942bcb-aba2-459f-a4cd-2f2e7289c366",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 264,
                                "maxAge": 417,
                                "gender": 2,
                                "recognized": false,
                                "isDefault": true,
                                "faceImageName": "North Gate Camera",
                                "featureVector": "do deserunt ut",
                                "detectionConfidence": 72,
                                "enrolledPersonId": "589f92b8-a796-4d24-ac5f-19199d2a68b9",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              }
                            ],
                            "groups": [
                              {
                                "id": "92a9d68b-32f3-4cf4-a3db-3e2470e82224",
                                "name": "Parking Level 2",
                                "alertOnCapture": true,
                                "isDefault": false
                              },
                              {
                                "id": "a486dfe3-285d-4de8-a12d-58175c3b0ae1",
                                "name": "North Gate Camera",
                                "alertOnCapture": false,
                                "isDefault": true
                              }
                            ],
                            "roles": [
                              {
                                "id": "8e73cbc5-51b3-4770-a7cf-d136fed1e4f7",
                                "name": "Lobby Entrance"
                              },
                              {
                                "id": "a318b235-10d5-4eba-ac6c-241d586aecfb",
                                "name": "North Gate Camera"
                              }
                            ],
                            "vehicles": [
                              {
                                "id": "20688850-51b5-469f-a18b-43584dbf88fa",
                                "licensePlate": "LT-4471",
                                "plateType": "minim",
                                "category": "aute deserunt velit sunt",
                                "make": "Volkswagen",
                                "model": "ea",
                                "color": "Red",
                                "newPlateCode": "in id adipisicing ea sit",
                                "diplomaticCode": "et qui",
                                "minorColor": "Black",
                                "code": "esse magna voluptate occaecat",
                                "description": "Perimeter West",
                                "vinNumber": "laboris mollit adipisicing ad",
                                "yearOfManufacture": 81,
                                "wanted": true,
                                "stolen": true,
                                "referenceNumber": "dolor elit",
                                "nationalNumber": "reprehenderit occaecat Excepteur dolor",
                                "method": 2,
                                "department": "in cupidatat in",
                                "customField1": "in qui irure est ad",
                                "customField2": "aliqua nostrud nulla",
                                "customField3": "incididunt in Duis cillum voluptate",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "cillum",
                                  "irure culpa ad commodo sunt"
                                ]
                              },
                              {
                                "id": "abca4f9a-d831-4887-a8b7-acf892447afb",
                                "licensePlate": "LT-4471",
                                "plateType": "ipsum",
                                "category": "laborum",
                                "make": "Toyota",
                                "model": "Ut Excepteur exercitation",
                                "color": "Blue",
                                "newPlateCode": "fugiat ex Excepteur",
                                "diplomaticCode": "adipisicing",
                                "minorColor": "White",
                                "code": "proident aliquip Ut cillum commodo",
                                "description": "Loading Bay 3",
                                "vinNumber": "aute Duis laborum esse",
                                "yearOfManufacture": 227,
                                "wanted": false,
                                "stolen": true,
                                "referenceNumber": "magna exercitation",
                                "nationalNumber": "nulla",
                                "method": 3,
                                "department": "occaecat",
                                "customField1": "anim",
                                "customField2": "et minim",
                                "customField3": "consectetur Duis",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "dolore",
                                  "id ut"
                                ]
                              }
                            ]
                          },
                          {
                            "id": "15c2bdb3-7cbc-4901-aad0-05a77fd38a7e",
                            "firstName": "Perimeter West",
                            "lastName": "Lobby Entrance",
                            "customField1": "officia voluptate ex mollit consectetur",
                            "customField2": "incididunt",
                            "customField3": "incididunt",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "birthYear": 19,
                            "status": 1,
                            "relatedFaces": [
                              {
                                "id": "17690e23-eafb-4aaf-a28e-54c8c1d7cb53",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 108,
                                "maxAge": 503,
                                "gender": 2,
                                "recognized": false,
                                "isDefault": false,
                                "faceImageName": "Lobby Entrance",
                                "featureVector": "quis dolore sed nisi",
                                "detectionConfidence": 84,
                                "enrolledPersonId": "32eee6c9-1e9f-4f64-a2dc-0a2c69f1b2e5",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              },
                              {
                                "id": "a7e1d0a2-de04-46b1-a22b-bb98d7a4f6ba",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 532,
                                "maxAge": 811,
                                "gender": 2,
                                "recognized": false,
                                "isDefault": true,
                                "faceImageName": "Lobby Entrance",
                                "featureVector": "exercitation",
                                "detectionConfidence": 87,
                                "enrolledPersonId": "1e8eef1f-c667-4ce4-a38b-95226a118e83",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              }
                            ],
                            "groups": [
                              {
                                "id": "96a217da-81b9-4c5b-a636-5d49f5ac3e76",
                                "name": "North Gate Camera",
                                "alertOnCapture": false,
                                "isDefault": true
                              },
                              {
                                "id": "28f62400-6802-492e-a875-06c16ddc14a4",
                                "name": "Loading Bay 3",
                                "alertOnCapture": false,
                                "isDefault": false
                              }
                            ],
                            "roles": [
                              {
                                "id": "5a96b3a0-d98a-4897-ab17-c3f510ab8a1e",
                                "name": "North Gate Camera"
                              },
                              {
                                "id": "f4bcffdc-7a43-404c-a0c5-d81b7895d3ea",
                                "name": "Loading Bay 3"
                              }
                            ],
                            "vehicles": [
                              {
                                "id": "fe5f2adb-d473-4274-a5bf-4ba3190aeb10",
                                "licensePlate": "LT-4471",
                                "plateType": "tempor aliquip in in ullamco",
                                "category": "amet irure aliqua",
                                "make": "Volkswagen",
                                "model": "Duis ex",
                                "color": "Black",
                                "newPlateCode": "ut eiusmod consequat",
                                "diplomaticCode": "cupidatat",
                                "minorColor": "White",
                                "code": "nisi",
                                "description": "North Gate Camera",
                                "vinNumber": "anim ut",
                                "yearOfManufacture": 618,
                                "wanted": false,
                                "stolen": false,
                                "referenceNumber": "non ut Lorem dolore ex",
                                "nationalNumber": "est Duis in",
                                "method": 4,
                                "department": "dolore",
                                "customField1": "ex dolore esse do",
                                "customField2": "dolor magna pariatur ea aliquip",
                                "customField3": "dolore id amet",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "cupidatat enim consequat ad anim",
                                  "laborum cillum"
                                ]
                              },
                              {
                                "id": "6849c148-b27d-45bd-a5f2-072fd6694321",
                                "licensePlate": "LT-4471",
                                "plateType": "pariatur",
                                "category": "est magna",
                                "make": "Mercedes-Benz",
                                "model": "eiusmod",
                                "color": "Red",
                                "newPlateCode": "incididunt in",
                                "diplomaticCode": "laboris quis",
                                "minorColor": "Silver",
                                "code": "cillum ut officia consequat",
                                "description": "Loading Bay 3",
                                "vinNumber": "aliqua esse est aliquip cillum",
                                "yearOfManufacture": 726,
                                "wanted": false,
                                "stolen": true,
                                "referenceNumber": "magna velit deserunt",
                                "nationalNumber": "et exercitation",
                                "method": 3,
                                "department": "labore est",
                                "customField1": "exercitation proident adipisicing veniam",
                                "customField2": "nisi quis officia",
                                "customField3": "anim est",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "laborum ad",
                                  "enim ad laborum ex"
                                ]
                              }
                            ]
                          }
                        ],
                        "message": "nulla veniam",
                        "resultCode": 217,
                        "totalCount": 37
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FetchResponse_PersonDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FetchResponse_PersonDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List enrolled people",
        "description": "Paged. **The declared schema is wrong here specifically.** The spec says\n`BaseResponse<FetchResponse<PersonDto[]>>` - a *doubly* wrapped\nenvelope - but `BuildOkFetchResponse` returns a flat `FetchResponse`, so\na real instance sends `{ data, totalCount, message, resultCode }` with\n`totalCount` beside `data`. The mock serves the declared nested shape.\nThis is the only endpoint in the API with that particular defect; every\nother paged endpoint declares the flat shape correctly.\n\nThis returns personal data. Treat responses accordingly.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getPerson"
      },
      "delete": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "enrolledPersonId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete an enrolled person",
        "description": "`enrolledPersonId` is a query parameter. Deletes the identity together\nwith its faces and biometric templates - vehicle links go with it, but\nthe vehicle records themselves survive.\n\nThis is the endpoint a data-subject erasure request ends at.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deletePerson"
      }
    },
    "/api/configuration/basic/person/{personId}/faces": {
      "get": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnrolledFaceDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "6cf2f271-e41c-42f8-a19a-38dd468f05e6",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "minAge": 862,
                          "maxAge": 705,
                          "gender": 0,
                          "recognized": false,
                          "isDefault": false,
                          "faceImageName": "Parking Level 2",
                          "featureVector": "elit cillum proident",
                          "detectionConfidence": 97,
                          "enrolledPersonId": "26764cc1-6105-4883-adc2-f03c8bb414bb",
                          "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                        },
                        {
                          "id": "f684f254-ec47-4c03-a941-44908fefdacb",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "minAge": 287,
                          "maxAge": 414,
                          "gender": 1,
                          "recognized": true,
                          "isDefault": false,
                          "faceImageName": "Perimeter West",
                          "featureVector": "pariatur laborum non",
                          "detectionConfidence": 87,
                          "enrolledPersonId": "bca097bd-06df-49ed-aa7b-1319fac67b61",
                          "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnrolledFaceDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnrolledFaceDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List a person's enrolled faces",
        "description": "Every face template on this identity. Images come back base64-encoded\ninside the DTOs, so responses can be large - a person with many\nenrolments is megabytes, not kilobytes.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getPersonByPersonFaces"
      }
    },
    "/api/configuration/basic/person/{personId}/vehicles": {
      "get": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnrolledVehicleDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "1d426e64-c6c5-4e67-acee-9ed2f7d509a6",
                          "licensePlate": "LT-4471",
                          "plateType": "est cillum sunt adipisicing",
                          "category": "Lorem voluptate pariatur ea sint",
                          "make": "Toyota",
                          "model": "amet Duis anim sunt",
                          "color": "Black",
                          "newPlateCode": "velit",
                          "diplomaticCode": "quis reprehenderit",
                          "minorColor": "Blue",
                          "code": "velit dolore Ut dolor",
                          "description": "Loading Bay 3",
                          "vinNumber": "sint qui consectetur",
                          "yearOfManufacture": 720,
                          "wanted": false,
                          "stolen": false,
                          "referenceNumber": "dolor",
                          "nationalNumber": "Duis exercitation in tempor qui",
                          "method": 1,
                          "department": "voluptate dolor",
                          "customField1": "minim nulla irure ullamco",
                          "customField2": "amet ut",
                          "customField3": "ad veniam dolor",
                          "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "enrolledPersonNames": [
                            "culpa",
                            "sunt eiusmod amet voluptate"
                          ]
                        },
                        {
                          "id": "f318fe39-118a-4d27-aec8-ec48be92c3e0",
                          "licensePlate": "B 227 HK",
                          "plateType": "anim",
                          "category": "consectetur reprehenderit",
                          "make": "Toyota",
                          "model": "velit deserunt dolore",
                          "color": "Black",
                          "newPlateCode": "amet sunt dolor ipsum est",
                          "diplomaticCode": "occaecat ut esse",
                          "minorColor": "Black",
                          "code": "exercitation ex",
                          "description": "Lobby Entrance",
                          "vinNumber": "culpa",
                          "yearOfManufacture": 712,
                          "wanted": true,
                          "stolen": false,
                          "referenceNumber": "est eiusmod anim irure",
                          "nationalNumber": "ad anim reprehenderit exercitation eu",
                          "method": 4,
                          "department": "aliquip veniam Excepteur proident consequat",
                          "customField1": "proident ex culpa",
                          "customField2": "ea sit cillum Duis nulla",
                          "customField3": "aute",
                          "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "enrolledPersonNames": [
                            "ut",
                            "non consequat mollit"
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnrolledVehicleDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnrolledVehicleDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List a person's linked vehicles",
        "description": "The vehicles associated with this identity. Linking is what lets an ANPR\nhit and a face hit be correlated into one person.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getPersonByPersonVehicles"
      },
      "post": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Link vehicles to a person",
        "description": "The body is a list of **enrolled-vehicle ids**, validated by\n`[NotEmptyGuidList]` - create the vehicles first through\n`/api/configuration/basic/enrolled-vehicle`.\n\nAdditive: linking a vehicle already linked is not an error.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postPersonByPersonVehicles"
      }
    },
    "/api/configuration/basic/person/{personId}/vehicles/{vehicleId}": {
      "delete": {
        "tags": [
          "FaceRecognition"
        ],
        "parameters": [
          {
            "name": "personId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "vehicleId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Unlink a vehicle from a person",
        "description": "Removes the association only. The enrolled vehicle itself survives and\ncan be linked to someone else.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deletePersonByPersonVehiclesByVehicle"
      }
    },
    "/api/data/face-vehicle-detections/search": {
      "post": {
        "tags": [
          "FaceVehicle"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FaceVehicleDetectionFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FaceVehicleDetectionFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FaceVehicleDetectionFilterRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceVehicleDetectionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "f5db520d-a264-4472-a48c-17bdf0ece0a4",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "face": {
                            "id": "68c181eb-b343-4d2b-a13e-01639be29e17",
                            "minAge": 203,
                            "maxAge": 108,
                            "gender": 1,
                            "featureVector": "sit dolor dolor dolore ut",
                            "detectionConfidence": 81,
                            "boundingBox": "dolore nostrud",
                            "personRecognitionConfidence": 79,
                            "analyzerIdentifier": "est ea minim dolor",
                            "mediaSourceId": "8f51657c-2c15-4a37-a17c-991717ccf557",
                            "mediaSourceName": "Loading Bay 3",
                            "enrolledPersonId": "dd557954-48e6-4e54-af9c-8de604e8a46c",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "imageId": "860af4a4-e99a-4955-a0a4-30b6ade8bec8",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "triggerType": 2,
                            "hasFaceVehicleDetection": false,
                            "watchListIds": [
                              "5535e2da-c2c7-405c-ac9f-ecc47dc82c02",
                              "d558adb8-270f-44ee-ab8b-919f90f722e0"
                            ],
                            "firstName": "Perimeter West",
                            "lastName": "Lobby Entrance",
                            "detectionDate": 212,
                            "enrolledPerson": {
                              "id": "7e0128f0-9e01-4037-a5b1-12edb4b28a73",
                              "firstName": "Parking Level 2",
                              "lastName": "Loading Bay 3",
                              "customField1": "dolor",
                              "customField2": "qui amet",
                              "customField3": "est reprehenderit et consectetur",
                              "createdAt": "2026-07-27T09:14:33Z",
                              "birthYear": 262,
                              "status": 0,
                              "relatedFaces": [
                                {
                                  "id": "2d1ae7f8-5ec7-41d6-a7be-125828603a82",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 436,
                                  "maxAge": 911,
                                  "gender": 2,
                                  "recognized": false,
                                  "isDefault": true,
                                  "faceImageName": "Lobby Entrance",
                                  "featureVector": "ut",
                                  "detectionConfidence": 88,
                                  "enrolledPersonId": "dd2b60a5-fa6f-4166-a9df-6ee56ce809bf",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                },
                                {
                                  "id": "f1bad2f9-3c3e-431a-a642-7cf77faf9c04",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 633,
                                  "maxAge": 635,
                                  "gender": 2,
                                  "recognized": false,
                                  "isDefault": true,
                                  "faceImageName": "Parking Level 2",
                                  "featureVector": "Duis sed",
                                  "detectionConfidence": 91,
                                  "enrolledPersonId": "71e9b448-58e5-44ae-a1a2-0a9601de5960",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                }
                              ],
                              "groups": [
                                {
                                  "id": "edd7f5bc-d653-4ea1-a9ed-05d283d15e67",
                                  "name": "Lobby Entrance",
                                  "alertOnCapture": true,
                                  "isDefault": true
                                },
                                {
                                  "id": "77811dd3-c6b2-47c7-a82c-f49bfca5d27f",
                                  "name": "Parking Level 2",
                                  "alertOnCapture": true,
                                  "isDefault": false
                                }
                              ],
                              "roles": [
                                {
                                  "id": "296b8761-e8b9-4774-aa91-6de5c10104ea",
                                  "name": "North Gate Camera"
                                },
                                {
                                  "id": "f1370639-e1c8-43bc-a669-4af27e03ad32",
                                  "name": "Perimeter West"
                                }
                              ],
                              "vehicles": [
                                {
                                  "id": "b6a47845-d91c-41ad-aa9f-484a3254572a",
                                  "licensePlate": "ZH 88231",
                                  "plateType": "aliquip ipsum dolor",
                                  "category": "deserunt",
                                  "make": "Nissan",
                                  "model": "qui",
                                  "color": "Silver",
                                  "newPlateCode": "cupidatat amet eu incididunt ex",
                                  "diplomaticCode": "consectetur tempor",
                                  "minorColor": "Blue",
                                  "code": "occaecat",
                                  "description": "North Gate Camera",
                                  "vinNumber": "occaecat id in",
                                  "yearOfManufacture": 273,
                                  "wanted": true,
                                  "stolen": true,
                                  "referenceNumber": "nulla ut mollit Ut eiusmod",
                                  "nationalNumber": "aliquip ut sint adipisicing",
                                  "method": 4,
                                  "department": "ex pariatur ut",
                                  "customField1": "sunt pariatur eu",
                                  "customField2": "Lorem",
                                  "customField3": "magna",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "non mollit aute esse sed",
                                    "cupidatat dolor ea"
                                  ]
                                },
                                {
                                  "id": "135e0395-c964-43d2-af70-56219875a1c4",
                                  "licensePlate": "M-QT-2048",
                                  "plateType": "ut laboris deserunt",
                                  "category": "non sunt enim",
                                  "make": "Toyota",
                                  "model": "culpa proident sunt tempor",
                                  "color": "Red",
                                  "newPlateCode": "dolore minim",
                                  "diplomaticCode": "cillum fugiat",
                                  "minorColor": "Black",
                                  "code": "proident magna",
                                  "description": "Lobby Entrance",
                                  "vinNumber": "culpa in",
                                  "yearOfManufacture": 187,
                                  "wanted": true,
                                  "stolen": false,
                                  "referenceNumber": "irure consequat ut aliquip ut",
                                  "nationalNumber": "do quis in sed",
                                  "method": 1,
                                  "department": "elit laboris velit ut nulla",
                                  "customField1": "id do",
                                  "customField2": "qui in sit veniam ad",
                                  "customField3": "Duis anim sed Excepteur aliquip",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "ipsum anim esse Excepteur nulla",
                                    "non labore sunt"
                                  ]
                                }
                              ]
                            },
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "recognized": false
                          },
                          "vehicleInfo": {
                            "id": "8bfff36b-9bc4-4838-ade9-293614a399de",
                            "mediaSourceId": "c16bef7b-0099-4256-add1-e7d3c27e79e7",
                            "mediaSourceName": "Lobby Entrance",
                            "zoneName": "Lobby Entrance",
                            "recognized": false,
                            "licensePlate": {
                              "number": "id eiusmod",
                              "country": "do id consectetur cupidatat reprehenderit",
                              "state": "ex anim nulla nisi voluptate",
                              "type": "cupidatat",
                              "color": "Black",
                              "confidence": 77,
                              "boundingBox": {
                                "left": 752,
                                "top": 273,
                                "right": 463,
                                "bottom": 796
                              },
                              "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                              "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                            },
                            "modelMakeRecognition": {
                              "make": {
                                "name": "North Gate Camera",
                                "confidence": 77
                              },
                              "model": {
                                "name": "Loading Bay 3",
                                "confidence": 79
                              },
                              "category": {
                                "name": "Lobby Entrance",
                                "confidence": 90
                              },
                              "color": {
                                "name": "Parking Level 2",
                                "confidence": 73
                              }
                            },
                            "createdAt": "2026-07-27T09:14:33Z",
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "triggerType": 3,
                            "hasFaceVehicleDetection": true,
                            "watchListIds": [
                              "a2a0f48d-9fed-4bf4-ad4c-01bdb6bba115",
                              "fff13cb0-2d2a-41b5-a746-4410f45cd227"
                            ]
                          }
                        },
                        {
                          "id": "0cd2002b-78c7-41d9-ad9c-038f1bccfdfb",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "face": {
                            "id": "9d9397a9-4ac3-4d97-a9af-da32b91628e1",
                            "minAge": 724,
                            "maxAge": 788,
                            "gender": 0,
                            "featureVector": "tempor proident qui",
                            "detectionConfidence": 86,
                            "boundingBox": "nostrud occaecat aute",
                            "personRecognitionConfidence": 74,
                            "analyzerIdentifier": "amet mollit",
                            "mediaSourceId": "65f2b3d3-342b-40df-ae69-41e30d3c256a",
                            "mediaSourceName": "North Gate Camera",
                            "enrolledPersonId": "a0784c11-66d2-4012-a258-057f4166ed0e",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "imageId": "62471f63-b9ee-45c0-a45d-adaebb4ec5db",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "triggerType": 0,
                            "hasFaceVehicleDetection": true,
                            "watchListIds": [
                              "b7451b16-3fa8-49b8-a167-81ce6099f923",
                              "a0a5fba6-9de2-434b-ae3d-2a523289a1df"
                            ],
                            "firstName": "Loading Bay 3",
                            "lastName": "Lobby Entrance",
                            "detectionDate": 275,
                            "enrolledPerson": {
                              "id": "95aee5d5-ced5-4a5d-accd-949191a4aca1",
                              "firstName": "Lobby Entrance",
                              "lastName": "Loading Bay 3",
                              "customField1": "et commodo",
                              "customField2": "id ullamco laborum incididunt",
                              "customField3": "irure incididunt",
                              "createdAt": "2026-07-27T09:14:33Z",
                              "birthYear": 60,
                              "status": 1,
                              "relatedFaces": [
                                {
                                  "id": "dccdd257-59c6-4f6d-a1a0-d74758ce0acb",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 625,
                                  "maxAge": 284,
                                  "gender": 1,
                                  "recognized": false,
                                  "isDefault": false,
                                  "faceImageName": "Parking Level 2",
                                  "featureVector": "ut labore Lorem pariatur id",
                                  "detectionConfidence": 95,
                                  "enrolledPersonId": "6f883052-529e-4aaa-a5ea-0c1dfef042f5",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                },
                                {
                                  "id": "64853837-5a56-4974-a83c-6d2e23755e00",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 265,
                                  "maxAge": 503,
                                  "gender": 2,
                                  "recognized": false,
                                  "isDefault": false,
                                  "faceImageName": "Parking Level 2",
                                  "featureVector": "est fugiat",
                                  "detectionConfidence": 83,
                                  "enrolledPersonId": "7cfce146-2abd-4b9c-a167-aaf2b4f15352",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                }
                              ],
                              "groups": [
                                {
                                  "id": "8cfff745-e4c7-43ec-a968-5565fcd238fb",
                                  "name": "Parking Level 2",
                                  "alertOnCapture": false,
                                  "isDefault": true
                                },
                                {
                                  "id": "ea88750c-9b5e-4572-a0f4-25c5e707d329",
                                  "name": "Perimeter West",
                                  "alertOnCapture": true,
                                  "isDefault": true
                                }
                              ],
                              "roles": [
                                {
                                  "id": "81f451f9-dd36-47b0-a5a0-b5d67de1afb5",
                                  "name": "Loading Bay 3"
                                },
                                {
                                  "id": "b957d2fe-2411-4c52-a8a2-19baa1ccf1c2",
                                  "name": "Perimeter West"
                                }
                              ],
                              "vehicles": [
                                {
                                  "id": "8e695758-870c-4395-a673-2fa000f1b272",
                                  "licensePlate": "ZH 88231",
                                  "plateType": "ut cupidatat",
                                  "category": "tempor",
                                  "make": "Nissan",
                                  "model": "Duis",
                                  "color": "White",
                                  "newPlateCode": "in aute",
                                  "diplomaticCode": "tempor laborum qui proident",
                                  "minorColor": "Blue",
                                  "code": "qui in consectetur laborum",
                                  "description": "Parking Level 2",
                                  "vinNumber": "quis nulla",
                                  "yearOfManufacture": 360,
                                  "wanted": true,
                                  "stolen": false,
                                  "referenceNumber": "Duis consequat eiusmod nulla ut",
                                  "nationalNumber": "dolor commodo eu",
                                  "method": 3,
                                  "department": "sit laboris in aliqua",
                                  "customField1": "sit non",
                                  "customField2": "consequat ex pariatur anim",
                                  "customField3": "velit reprehenderit proident",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "nisi Excepteur sed ut ex",
                                    "Lorem sit"
                                  ]
                                },
                                {
                                  "id": "320d6615-ecbe-4cf2-a318-efc8eb015edf",
                                  "licensePlate": "AB-12-CD",
                                  "plateType": "ipsum amet sit aute",
                                  "category": "in Ut in nisi veniam",
                                  "make": "Hyundai",
                                  "model": "anim tempor",
                                  "color": "White",
                                  "newPlateCode": "occaecat et tempor ex",
                                  "diplomaticCode": "veniam",
                                  "minorColor": "Red",
                                  "code": "Ut elit",
                                  "description": "North Gate Camera",
                                  "vinNumber": "Ut magna Duis",
                                  "yearOfManufacture": 707,
                                  "wanted": true,
                                  "stolen": false,
                                  "referenceNumber": "enim nisi",
                                  "nationalNumber": "magna aute exercitation",
                                  "method": 4,
                                  "department": "incididunt esse culpa",
                                  "customField1": "incididunt consectetur",
                                  "customField2": "pariatur voluptate",
                                  "customField3": "et Ut ad dolore mollit",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "quis dolor Lorem commodo",
                                    "minim nostrud in"
                                  ]
                                }
                              ]
                            },
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "recognized": true
                          },
                          "vehicleInfo": {
                            "id": "74a788bc-479a-43d9-aa5d-7d315f071521",
                            "mediaSourceId": "2ba956e2-02d4-4b02-a89c-5de7aed2e0d3",
                            "mediaSourceName": "North Gate Camera",
                            "zoneName": "North Gate Camera",
                            "recognized": true,
                            "licensePlate": {
                              "number": "dolore",
                              "country": "eu ipsum",
                              "state": "adipisicing aliqua consectetur in ullamco",
                              "type": "occaecat Duis",
                              "color": "Blue",
                              "confidence": 96,
                              "boundingBox": {
                                "left": 819,
                                "top": 414,
                                "right": 434,
                                "bottom": 510
                              },
                              "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                              "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                            },
                            "modelMakeRecognition": {
                              "make": {
                                "name": "Loading Bay 3",
                                "confidence": 83
                              },
                              "model": {
                                "name": "North Gate Camera",
                                "confidence": 72
                              },
                              "category": {
                                "name": "Loading Bay 3",
                                "confidence": 77
                              },
                              "color": {
                                "name": "Loading Bay 3",
                                "confidence": 97
                              }
                            },
                            "createdAt": "2026-07-27T09:14:33Z",
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "triggerType": 2,
                            "hasFaceVehicleDetection": false,
                            "watchListIds": [
                              "a11db665-b322-4072-a841-3a9b6d2c919a",
                              "15e758b6-2db9-4cf5-a8d2-918cfc9bb8d3"
                            ]
                          }
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceVehicleDetectionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceVehicleDetectionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Search face-and-vehicle detections",
        "description": "Paged `FetchResponse`: `totalCount` beside `data`, `message` is the\ntiming string.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFaceVehicleDetectionsSearch"
      }
    },
    "/api/data/face-vehicle-detections/face/{faceId}": {
      "get": {
        "tags": [
          "FaceVehicle"
        ],
        "parameters": [
          {
            "name": "faceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceVehicleDetectionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "47d7251f-9817-4139-af42-6bac90b8261d",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "face": {
                            "id": "4482654d-d2e8-4811-aa11-d19150d03d9c",
                            "minAge": 182,
                            "maxAge": 373,
                            "gender": 2,
                            "featureVector": "velit cupidatat non",
                            "detectionConfidence": 84,
                            "boundingBox": "laborum nulla occaecat nisi",
                            "personRecognitionConfidence": 76,
                            "analyzerIdentifier": "magna exercitation non",
                            "mediaSourceId": "180d9438-1814-477a-a9b4-535eb4210c0d",
                            "mediaSourceName": "Lobby Entrance",
                            "enrolledPersonId": "18be095f-a793-435b-a145-889efe5882c0",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "imageId": "90d31477-922f-4bed-a610-2c4fc8df1d05",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "triggerType": 1,
                            "hasFaceVehicleDetection": true,
                            "watchListIds": [
                              "fc949d0e-9b3f-4fef-acce-4a88727cbd91",
                              "6e5b9c14-2da6-414e-a545-d17179eda48e"
                            ],
                            "firstName": "Lobby Entrance",
                            "lastName": "Perimeter West",
                            "detectionDate": 711,
                            "enrolledPerson": {
                              "id": "82337475-a535-4812-ac84-8c55fe62e9eb",
                              "firstName": "North Gate Camera",
                              "lastName": "Parking Level 2",
                              "customField1": "Excepteur do dolore",
                              "customField2": "ut",
                              "customField3": "incididunt laboris irure est",
                              "createdAt": "2026-07-27T09:14:33Z",
                              "birthYear": 353,
                              "status": 0,
                              "relatedFaces": [
                                {
                                  "id": "cbae2f74-d4fd-457f-a340-ce09e12cf873",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 845,
                                  "maxAge": 60,
                                  "gender": 1,
                                  "recognized": false,
                                  "isDefault": false,
                                  "faceImageName": "North Gate Camera",
                                  "featureVector": "laboris elit proident in Duis",
                                  "detectionConfidence": 92,
                                  "enrolledPersonId": "c4991414-7a7c-4187-a5ad-1188c44f6db5",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                },
                                {
                                  "id": "56ce747d-2241-437b-a158-82c37c93cc81",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 662,
                                  "maxAge": 919,
                                  "gender": 1,
                                  "recognized": false,
                                  "isDefault": false,
                                  "faceImageName": "North Gate Camera",
                                  "featureVector": "minim anim tempor",
                                  "detectionConfidence": 97,
                                  "enrolledPersonId": "2b4544ce-e2f2-4556-a620-51949b70702a",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                }
                              ],
                              "groups": [
                                {
                                  "id": "b25191f7-29ac-4d27-a7eb-597005776b3b",
                                  "name": "North Gate Camera",
                                  "alertOnCapture": false,
                                  "isDefault": true
                                },
                                {
                                  "id": "1cbaedb5-70da-4ac4-abf9-d764f4f5025b",
                                  "name": "Loading Bay 3",
                                  "alertOnCapture": true,
                                  "isDefault": false
                                }
                              ],
                              "roles": [
                                {
                                  "id": "d8425520-46d9-431d-a442-897e9468d12d",
                                  "name": "North Gate Camera"
                                },
                                {
                                  "id": "7540e32f-fe31-472e-a048-acc092d2e8c4",
                                  "name": "Parking Level 2"
                                }
                              ],
                              "vehicles": [
                                {
                                  "id": "ff5de6fe-7ed6-4c0b-a7f0-19f86c1ba4e9",
                                  "licensePlate": "AB-12-CD",
                                  "plateType": "adipisicing dolor reprehenderit",
                                  "category": "dolor elit",
                                  "make": "Nissan",
                                  "model": "pariatur est et quis culpa",
                                  "color": "Red",
                                  "newPlateCode": "in",
                                  "diplomaticCode": "sint enim commodo labore",
                                  "minorColor": "White",
                                  "code": "cillum consectetur laboris",
                                  "description": "Perimeter West",
                                  "vinNumber": "dolore dolor",
                                  "yearOfManufacture": 475,
                                  "wanted": true,
                                  "stolen": true,
                                  "referenceNumber": "sunt in laboris pariatur",
                                  "nationalNumber": "commodo do enim est",
                                  "method": 3,
                                  "department": "cillum cupidatat velit ea id",
                                  "customField1": "exercitation et dolor",
                                  "customField2": "eu Lorem ex anim",
                                  "customField3": "irure",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "sunt Excepteur occaecat tempor irure",
                                    "cupidatat cillum"
                                  ]
                                },
                                {
                                  "id": "3f94ef8d-b595-40f1-a13c-a6b4b0f4518e",
                                  "licensePlate": "ZH 88231",
                                  "plateType": "ea",
                                  "category": "fugiat est dolore amet ex",
                                  "make": "Mercedes-Benz",
                                  "model": "occaecat nulla laboris aute",
                                  "color": "Silver",
                                  "newPlateCode": "commodo officia aliquip eiusmod",
                                  "diplomaticCode": "in adipisicing",
                                  "minorColor": "Silver",
                                  "code": "cillum ullamco",
                                  "description": "Parking Level 2",
                                  "vinNumber": "in",
                                  "yearOfManufacture": 455,
                                  "wanted": true,
                                  "stolen": false,
                                  "referenceNumber": "incididunt",
                                  "nationalNumber": "nulla officia dolor in tempor",
                                  "method": 1,
                                  "department": "mollit",
                                  "customField1": "et ut dolore id",
                                  "customField2": "id ea eiusmod Lorem non",
                                  "customField3": "dolor dolore",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "nisi culpa adipisicing",
                                    "minim ipsum aliqua ad laborum"
                                  ]
                                }
                              ]
                            },
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "recognized": true
                          },
                          "vehicleInfo": {
                            "id": "60a46e73-6b4d-4b24-acab-f0f2bf480455",
                            "mediaSourceId": "bb8d24f5-f4cc-4b9f-ab13-4697bc71de50",
                            "mediaSourceName": "Loading Bay 3",
                            "zoneName": "North Gate Camera",
                            "recognized": false,
                            "licensePlate": {
                              "number": "anim culpa tempor",
                              "country": "in consectetur",
                              "state": "laborum",
                              "type": "consequat sunt",
                              "color": "Silver",
                              "confidence": 91,
                              "boundingBox": {
                                "left": 167,
                                "top": 946,
                                "right": 173,
                                "bottom": 463
                              },
                              "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                              "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                            },
                            "modelMakeRecognition": {
                              "make": {
                                "name": "Parking Level 2",
                                "confidence": 74
                              },
                              "model": {
                                "name": "Loading Bay 3",
                                "confidence": 85
                              },
                              "category": {
                                "name": "Perimeter West",
                                "confidence": 85
                              },
                              "color": {
                                "name": "North Gate Camera",
                                "confidence": 75
                              }
                            },
                            "createdAt": "2026-07-27T09:14:33Z",
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "triggerType": 3,
                            "hasFaceVehicleDetection": false,
                            "watchListIds": [
                              "66946eeb-1be5-465c-a787-3568b9ce52f5",
                              "3d7a1d55-5298-4614-a864-362a9006ba4e"
                            ]
                          }
                        },
                        {
                          "id": "57c231f3-7693-4a54-a30a-107f6e5b8d49",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "face": {
                            "id": "42cf8218-8fc3-4194-a219-234e54e0ae76",
                            "minAge": 413,
                            "maxAge": 803,
                            "gender": 1,
                            "featureVector": "deserunt occaecat amet aliquip culpa",
                            "detectionConfidence": 75,
                            "boundingBox": "est sunt adipisicing",
                            "personRecognitionConfidence": 82,
                            "analyzerIdentifier": "sit ut ex in Excepteur",
                            "mediaSourceId": "61d7396f-b3f7-480f-adf3-bccc8eaf11ed",
                            "mediaSourceName": "North Gate Camera",
                            "enrolledPersonId": "9e67c11c-1554-4b17-a8ab-7258b2e7dfce",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "imageId": "599bbc4b-6d52-4ad6-a125-ad9cfe0aae09",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "triggerType": 1,
                            "hasFaceVehicleDetection": true,
                            "watchListIds": [
                              "90487d84-89ad-4cec-ac9c-400bc7b92fce",
                              "e83293e9-0168-4ddf-ad7d-995a04915dfa"
                            ],
                            "firstName": "Perimeter West",
                            "lastName": "North Gate Camera",
                            "detectionDate": 410,
                            "enrolledPerson": {
                              "id": "d6ea1e18-cb41-4e1a-a900-13bcaa8395b8",
                              "firstName": "North Gate Camera",
                              "lastName": "Lobby Entrance",
                              "customField1": "nulla",
                              "customField2": "nulla labore",
                              "customField3": "ullamco dolore eu eiusmod ex",
                              "createdAt": "2026-07-27T09:14:33Z",
                              "birthYear": 362,
                              "status": 1,
                              "relatedFaces": [
                                {
                                  "id": "8985fa61-70d0-4460-af06-ced0e55024ed",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 320,
                                  "maxAge": 621,
                                  "gender": 2,
                                  "recognized": true,
                                  "isDefault": false,
                                  "faceImageName": "Loading Bay 3",
                                  "featureVector": "adipisicing",
                                  "detectionConfidence": 98,
                                  "enrolledPersonId": "78cca9bd-9b44-478f-a0eb-6d8c783ba674",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                },
                                {
                                  "id": "eaef4a59-684a-4cd0-a0ba-17460f05a1e5",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 172,
                                  "maxAge": 534,
                                  "gender": 0,
                                  "recognized": false,
                                  "isDefault": true,
                                  "faceImageName": "Lobby Entrance",
                                  "featureVector": "nostrud cupidatat ut",
                                  "detectionConfidence": 97,
                                  "enrolledPersonId": "fffd71df-0fd5-4a94-ad59-ffd481da8673",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                }
                              ],
                              "groups": [
                                {
                                  "id": "0453d31d-12d2-4f32-a7ad-95c1f6987630",
                                  "name": "North Gate Camera",
                                  "alertOnCapture": true,
                                  "isDefault": true
                                },
                                {
                                  "id": "5724fa57-065b-447b-a1c9-0cbfe15c7bcb",
                                  "name": "Perimeter West",
                                  "alertOnCapture": true,
                                  "isDefault": true
                                }
                              ],
                              "roles": [
                                {
                                  "id": "a65eee5d-80de-4728-a7a7-a418a634d3c0",
                                  "name": "Loading Bay 3"
                                },
                                {
                                  "id": "b0b5b58c-4061-43f2-ac92-e5a86591e7a6",
                                  "name": "Lobby Entrance"
                                }
                              ],
                              "vehicles": [
                                {
                                  "id": "997502a3-84bc-4d34-a17a-06dcbc9bacd8",
                                  "licensePlate": "ZH 88231",
                                  "plateType": "minim ad esse proident",
                                  "category": "occaecat labore do",
                                  "make": "Toyota",
                                  "model": "tempor",
                                  "color": "White",
                                  "newPlateCode": "et in in amet",
                                  "diplomaticCode": "commodo incididunt",
                                  "minorColor": "Blue",
                                  "code": "exercitation ad laborum culpa deserunt",
                                  "description": "Parking Level 2",
                                  "vinNumber": "occaecat eu commodo culpa irure",
                                  "yearOfManufacture": 831,
                                  "wanted": true,
                                  "stolen": false,
                                  "referenceNumber": "ut dolor",
                                  "nationalNumber": "eiusmod",
                                  "method": 3,
                                  "department": "nisi Lorem",
                                  "customField1": "consequat dolore",
                                  "customField2": "veniam laboris",
                                  "customField3": "sed laborum consectetur adipisicing incididunt",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "deserunt",
                                    "officia"
                                  ]
                                },
                                {
                                  "id": "1a5f004c-d7d3-4763-aff8-865e99059a43",
                                  "licensePlate": "ZH 88231",
                                  "plateType": "dolor labore",
                                  "category": "amet laboris",
                                  "make": "Hyundai",
                                  "model": "Lorem",
                                  "color": "Red",
                                  "newPlateCode": "cillum commodo mollit ut ea",
                                  "diplomaticCode": "culpa enim ut anim",
                                  "minorColor": "Red",
                                  "code": "Lorem",
                                  "description": "North Gate Camera",
                                  "vinNumber": "dolor ad adipisicing",
                                  "yearOfManufacture": 316,
                                  "wanted": true,
                                  "stolen": true,
                                  "referenceNumber": "tempor ipsum aliqua labore ex",
                                  "nationalNumber": "ipsum sunt",
                                  "method": 1,
                                  "department": "magna consectetur",
                                  "customField1": "occaecat dolor",
                                  "customField2": "laborum voluptate dolore dolor tempor",
                                  "customField3": "laborum eu proident esse",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "aliquip irure quis reprehenderit veniam",
                                    "ut"
                                  ]
                                }
                              ]
                            },
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "recognized": false
                          },
                          "vehicleInfo": {
                            "id": "f6852d8f-c0d6-43b4-a183-4e0f1808d43b",
                            "mediaSourceId": "c9afba65-6d21-486d-a2b8-42cf29f659de",
                            "mediaSourceName": "Perimeter West",
                            "zoneName": "Parking Level 2",
                            "recognized": true,
                            "licensePlate": {
                              "number": "aliqua irure fugiat veniam",
                              "country": "amet reprehenderit proident Ut id",
                              "state": "dolor fugiat est",
                              "type": "nulla ullamco cupidatat",
                              "color": "Red",
                              "confidence": 89,
                              "boundingBox": {
                                "left": 916,
                                "top": 985,
                                "right": 287,
                                "bottom": 855
                              },
                              "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                              "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                            },
                            "modelMakeRecognition": {
                              "make": {
                                "name": "Loading Bay 3",
                                "confidence": 95
                              },
                              "model": {
                                "name": "Loading Bay 3",
                                "confidence": 94
                              },
                              "category": {
                                "name": "Parking Level 2",
                                "confidence": 72
                              },
                              "color": {
                                "name": "Parking Level 2",
                                "confidence": 97
                              }
                            },
                            "createdAt": "2026-07-27T09:14:33Z",
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "triggerType": 0,
                            "hasFaceVehicleDetection": true,
                            "watchListIds": [
                              "6e72478a-00cb-4bab-af02-0fe279147637",
                              "f947be5a-d48a-45a4-ad06-10881e285740"
                            ]
                          }
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceVehicleDetectionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceVehicleDetectionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Find the vehicles seen with a face",
        "description": "Correlations anchored on one face detection. Also a `FetchResponse`\ndespite taking no paging parameters, so `totalCount` is still there.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataFaceVehicleDetectionsFaceByFace"
      }
    },
    "/api/data/face-vehicle-detections/vehicle-info/{vehicleInfoId}": {
      "get": {
        "tags": [
          "FaceVehicle"
        ],
        "parameters": [
          {
            "name": "vehicleInfoId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceVehicleDetectionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "4fe34da3-e854-4353-a240-02c34369b00b",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "face": {
                            "id": "ba23760f-861e-41d4-a598-66b4dab03b3c",
                            "minAge": 795,
                            "maxAge": 316,
                            "gender": 1,
                            "featureVector": "laboris ipsum dolore esse",
                            "detectionConfidence": 93,
                            "boundingBox": "ullamco nostrud incididunt",
                            "personRecognitionConfidence": 78,
                            "analyzerIdentifier": "mollit aliqua do esse enim",
                            "mediaSourceId": "021c96be-5ff0-468d-a426-bd43ed754de7",
                            "mediaSourceName": "Perimeter West",
                            "enrolledPersonId": "ecdba911-5a66-46db-af83-69792facdf81",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "imageId": "4b7d65f8-af6c-46f6-a7b4-16d5ec2e809e",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "triggerType": 2,
                            "hasFaceVehicleDetection": true,
                            "watchListIds": [
                              "63eab3b6-ba7c-4023-a754-34b21dab937f",
                              "8d4857cc-59b1-4c02-afa0-b4c9dec85bc7"
                            ],
                            "firstName": "Lobby Entrance",
                            "lastName": "Parking Level 2",
                            "detectionDate": 982,
                            "enrolledPerson": {
                              "id": "da7ce4f6-4d4e-4d9e-af9a-988ac38c1680",
                              "firstName": "Loading Bay 3",
                              "lastName": "Loading Bay 3",
                              "customField1": "deserunt id amet est",
                              "customField2": "elit nulla",
                              "customField3": "dolore occaecat Ut consequat",
                              "createdAt": "2026-07-27T09:14:33Z",
                              "birthYear": 620,
                              "status": 0,
                              "relatedFaces": [
                                {
                                  "id": "f0e9c50d-4059-4fa3-a767-e7d3456eafa7",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 422,
                                  "maxAge": 567,
                                  "gender": 0,
                                  "recognized": true,
                                  "isDefault": false,
                                  "faceImageName": "Loading Bay 3",
                                  "featureVector": "tempor nulla occaecat",
                                  "detectionConfidence": 72,
                                  "enrolledPersonId": "3d5e5e6c-870f-4f7d-a60a-ed10f4e9e510",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                },
                                {
                                  "id": "2cfaa764-61c6-430d-a391-c8c447318baa",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 929,
                                  "maxAge": 661,
                                  "gender": 0,
                                  "recognized": true,
                                  "isDefault": false,
                                  "faceImageName": "North Gate Camera",
                                  "featureVector": "commodo consequat dolore",
                                  "detectionConfidence": 78,
                                  "enrolledPersonId": "d7e0e55e-995c-4fe4-a78a-60422a491378",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                }
                              ],
                              "groups": [
                                {
                                  "id": "8c89025d-140d-4926-a93f-0732853ebef1",
                                  "name": "Parking Level 2",
                                  "alertOnCapture": true,
                                  "isDefault": true
                                },
                                {
                                  "id": "de45b4b9-d632-4170-afa9-3d66d9322409",
                                  "name": "North Gate Camera",
                                  "alertOnCapture": true,
                                  "isDefault": true
                                }
                              ],
                              "roles": [
                                {
                                  "id": "6b444be0-6269-46cb-a01a-ed79f73a6012",
                                  "name": "Perimeter West"
                                },
                                {
                                  "id": "d8e47209-f0a3-4fba-aeb0-48ec7d8e0405",
                                  "name": "Parking Level 2"
                                }
                              ],
                              "vehicles": [
                                {
                                  "id": "6f07c828-234c-4ac2-a600-a0c60c44503a",
                                  "licensePlate": "LT-4471",
                                  "plateType": "exercitation eiusmod",
                                  "category": "fugiat exercitation dolor",
                                  "make": "Volkswagen",
                                  "model": "Duis nulla eu anim",
                                  "color": "Red",
                                  "newPlateCode": "sed",
                                  "diplomaticCode": "eiusmod Lorem",
                                  "minorColor": "White",
                                  "code": "sint dolore",
                                  "description": "Loading Bay 3",
                                  "vinNumber": "fugiat exercitation",
                                  "yearOfManufacture": 449,
                                  "wanted": false,
                                  "stolen": false,
                                  "referenceNumber": "id",
                                  "nationalNumber": "nisi id fugiat magna nostrud",
                                  "method": 2,
                                  "department": "in aliquip",
                                  "customField1": "ut",
                                  "customField2": "exercitation ipsum ut dolor culpa",
                                  "customField3": "do nulla sed sunt non",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "id",
                                    "et"
                                  ]
                                },
                                {
                                  "id": "adbf1b09-5d30-4a2e-adf8-250a3181d5bd",
                                  "licensePlate": "LT-4471",
                                  "plateType": "laboris",
                                  "category": "consectetur in qui",
                                  "make": "Hyundai",
                                  "model": "nostrud esse reprehenderit",
                                  "color": "White",
                                  "newPlateCode": "qui laborum nostrud",
                                  "diplomaticCode": "veniam officia consequat in",
                                  "minorColor": "Blue",
                                  "code": "aliqua",
                                  "description": "Loading Bay 3",
                                  "vinNumber": "sint labore sunt minim",
                                  "yearOfManufacture": 656,
                                  "wanted": true,
                                  "stolen": false,
                                  "referenceNumber": "cillum quis deserunt enim Ut",
                                  "nationalNumber": "dolore",
                                  "method": 1,
                                  "department": "pariatur ipsum",
                                  "customField1": "non",
                                  "customField2": "commodo eu sit",
                                  "customField3": "nostrud sit laboris",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "consectetur ex exercitation",
                                    "adipisicing velit Duis sed"
                                  ]
                                }
                              ]
                            },
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "recognized": true
                          },
                          "vehicleInfo": {
                            "id": "499ad9c4-e4c7-474f-aef5-3ac2bdb9f656",
                            "mediaSourceId": "ca8d3a02-6037-4495-a18a-c00a75345477",
                            "mediaSourceName": "North Gate Camera",
                            "zoneName": "Loading Bay 3",
                            "recognized": true,
                            "licensePlate": {
                              "number": "aliqua non sit",
                              "country": "esse non",
                              "state": "adipisicing sunt quis ullamco",
                              "type": "nisi consequat",
                              "color": "White",
                              "confidence": 80,
                              "boundingBox": {
                                "left": 384,
                                "top": 990,
                                "right": 377,
                                "bottom": 240
                              },
                              "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                              "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                            },
                            "modelMakeRecognition": {
                              "make": {
                                "name": "Perimeter West",
                                "confidence": 73
                              },
                              "model": {
                                "name": "Parking Level 2",
                                "confidence": 91
                              },
                              "category": {
                                "name": "Loading Bay 3",
                                "confidence": 75
                              },
                              "color": {
                                "name": "North Gate Camera",
                                "confidence": 97
                              }
                            },
                            "createdAt": "2026-07-27T09:14:33Z",
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "triggerType": 2,
                            "hasFaceVehicleDetection": true,
                            "watchListIds": [
                              "518e76cc-e471-42bc-a84a-b7372e9124e7",
                              "cd4c07f3-dd06-41df-a062-52cbf16ce14a"
                            ]
                          }
                        },
                        {
                          "id": "0df0a65f-1761-4d05-a4e9-8bc445e0ee85",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "face": {
                            "id": "7c149477-c9f1-4e0e-ae09-cc1b08bc0aaa",
                            "minAge": 49,
                            "maxAge": 67,
                            "gender": 0,
                            "featureVector": "ut",
                            "detectionConfidence": 92,
                            "boundingBox": "commodo dolore dolore",
                            "personRecognitionConfidence": 85,
                            "analyzerIdentifier": "officia exercitation dolor culpa",
                            "mediaSourceId": "76e16c3a-1f0f-41aa-a663-a5dd2c29b3a2",
                            "mediaSourceName": "Lobby Entrance",
                            "enrolledPersonId": "f37168c9-2c30-481f-a6d4-eb06c04afe46",
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "imageId": "5575994e-1040-4402-a74a-b8d509288cbb",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "triggerType": 1,
                            "hasFaceVehicleDetection": false,
                            "watchListIds": [
                              "0709638e-e8f5-420d-ab76-ccd7a2d16bd3",
                              "7ce1d4a8-553e-4514-a630-4a768a3dc518"
                            ],
                            "firstName": "Loading Bay 3",
                            "lastName": "Loading Bay 3",
                            "detectionDate": 934,
                            "enrolledPerson": {
                              "id": "3f1f8d94-f45e-49b1-aebb-b0b8793ef4d6",
                              "firstName": "Perimeter West",
                              "lastName": "North Gate Camera",
                              "customField1": "mollit velit",
                              "customField2": "reprehenderit velit laborum exercitation",
                              "customField3": "sint",
                              "createdAt": "2026-07-27T09:14:33Z",
                              "birthYear": 389,
                              "status": 0,
                              "relatedFaces": [
                                {
                                  "id": "31ba07a7-39a9-4552-affb-c82121de9da9",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 257,
                                  "maxAge": 557,
                                  "gender": 0,
                                  "recognized": false,
                                  "isDefault": true,
                                  "faceImageName": "Loading Bay 3",
                                  "featureVector": "ut consequat laborum eu labore",
                                  "detectionConfidence": 80,
                                  "enrolledPersonId": "5873d38f-68d1-4b8d-a515-aab8f398a207",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                },
                                {
                                  "id": "ed4dc15e-756c-4043-a307-2b43f2c4ffde",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "minAge": 248,
                                  "maxAge": 763,
                                  "gender": 0,
                                  "recognized": true,
                                  "isDefault": false,
                                  "faceImageName": "Perimeter West",
                                  "featureVector": "ullamco velit ut",
                                  "detectionConfidence": 84,
                                  "enrolledPersonId": "6725be4e-2618-4e26-a548-1e0b8578ad6b",
                                  "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                                }
                              ],
                              "groups": [
                                {
                                  "id": "73aef90c-0125-45ba-aed1-15a474195ce7",
                                  "name": "Perimeter West",
                                  "alertOnCapture": true,
                                  "isDefault": true
                                },
                                {
                                  "id": "673c51c7-91db-45f8-af0e-4e28ddad76bb",
                                  "name": "Parking Level 2",
                                  "alertOnCapture": true,
                                  "isDefault": true
                                }
                              ],
                              "roles": [
                                {
                                  "id": "1f00c429-dc7f-451b-a468-baab23c488b3",
                                  "name": "Parking Level 2"
                                },
                                {
                                  "id": "decacdf1-c4ab-4fcd-a47c-421c30407455",
                                  "name": "Loading Bay 3"
                                }
                              ],
                              "vehicles": [
                                {
                                  "id": "906834e1-c5ec-4e67-aa72-b04d3f4c337b",
                                  "licensePlate": "ZH 88231",
                                  "plateType": "quis aliquip fugiat",
                                  "category": "nostrud cillum irure officia",
                                  "make": "Toyota",
                                  "model": "commodo esse",
                                  "color": "Blue",
                                  "newPlateCode": "enim",
                                  "diplomaticCode": "Lorem Ut",
                                  "minorColor": "Blue",
                                  "code": "anim ea",
                                  "description": "Perimeter West",
                                  "vinNumber": "dolore commodo ullamco dolore pariatur",
                                  "yearOfManufacture": 224,
                                  "wanted": true,
                                  "stolen": false,
                                  "referenceNumber": "proident",
                                  "nationalNumber": "et eiusmod esse mollit pariatur",
                                  "method": 1,
                                  "department": "et ea elit mollit",
                                  "customField1": "aute",
                                  "customField2": "tempor",
                                  "customField3": "ipsum in commodo",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "consequat ea dolor",
                                    "culpa dolor aliquip eu"
                                  ]
                                },
                                {
                                  "id": "eba2c15d-0953-43a0-ac8c-f44a34881787",
                                  "licensePlate": "ZH 88231",
                                  "plateType": "est labore cillum eiusmod",
                                  "category": "occaecat qui sunt",
                                  "make": "Mercedes-Benz",
                                  "model": "nostrud quis",
                                  "color": "Silver",
                                  "newPlateCode": "non",
                                  "diplomaticCode": "et",
                                  "minorColor": "Black",
                                  "code": "ipsum dolore labore dolor Excepteur",
                                  "description": "Parking Level 2",
                                  "vinNumber": "culpa ipsum et",
                                  "yearOfManufacture": 210,
                                  "wanted": true,
                                  "stolen": false,
                                  "referenceNumber": "labore amet ut nostrud do",
                                  "nationalNumber": "non reprehenderit sit sunt",
                                  "method": 1,
                                  "department": "mollit et do",
                                  "customField1": "id nisi",
                                  "customField2": "nostrud elit",
                                  "customField3": "in quis eiusmod consectetur dolore",
                                  "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                  "createdAt": "2026-07-27T09:14:33Z",
                                  "modifiedAt": "2026-07-27T09:14:33Z",
                                  "enrolledPersonNames": [
                                    "sunt aute ullamco",
                                    "incididunt"
                                  ]
                                }
                              ]
                            },
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "recognized": false
                          },
                          "vehicleInfo": {
                            "id": "6791bbf8-0f6e-44b1-a4c5-6c194af16aff",
                            "mediaSourceId": "c6c83e69-6ee0-49ff-a016-9e070e15190d",
                            "mediaSourceName": "North Gate Camera",
                            "zoneName": "Lobby Entrance",
                            "recognized": false,
                            "licensePlate": {
                              "number": "Lorem ea",
                              "country": "id pariatur et sed",
                              "state": "pariatur commodo",
                              "type": "est id occaecat et",
                              "color": "Red",
                              "confidence": 84,
                              "boundingBox": {
                                "left": 891,
                                "top": 759,
                                "right": 737,
                                "bottom": 242
                              },
                              "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                              "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                            },
                            "modelMakeRecognition": {
                              "make": {
                                "name": "Loading Bay 3",
                                "confidence": 76
                              },
                              "model": {
                                "name": "Loading Bay 3",
                                "confidence": 95
                              },
                              "category": {
                                "name": "Loading Bay 3",
                                "confidence": 75
                              },
                              "color": {
                                "name": "Perimeter West",
                                "confidence": 82
                              }
                            },
                            "createdAt": "2026-07-27T09:14:33Z",
                            "occurredAt": "2026-07-27T09:14:33Z",
                            "triggerType": 1,
                            "hasFaceVehicleDetection": true,
                            "watchListIds": [
                              "81165cd8-6472-4cd2-a6cd-9871212b056a",
                              "dc0f8075-32d8-466d-a9eb-2de1e11779d1"
                            ]
                          }
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceVehicleDetectionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceVehicleDetectionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Find the faces seen with a vehicle",
        "description": "The inverse: correlations anchored on one plate read.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataFaceVehicleDetectionsVehicleInfoByVehicleInfo"
      }
    },
    "/api/configuration/basic/flows": {
      "get": {
        "tags": [
          "Flow"
        ],
        "parameters": [
          {
            "name": "Status",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/FlowStatusType"
            }
          },
          {
            "name": "EntityType",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/FlowEntityTypes"
            }
          },
          {
            "name": "SearchTerm",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SortBy",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "SortDirection",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FlowDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "ec44c976-36a6-4c1e-a225-2af3f4d3e844",
                          "name": "Perimeter West",
                          "estimatedTime": 337,
                          "status": 0,
                          "entityType": 0,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "updatedAt": "2026-07-27T09:14:33Z",
                          "stepCount": 192,
                          "stages": [
                            {
                              "id": "070958e2-44ff-454d-a8e8-75e3eccad5f1",
                              "name": "Lobby Entrance",
                              "order": 892,
                              "isRequired": false,
                              "type": 1,
                              "sectionId": "1c37d7e9-b288-4dc0-a434-c52f93db93c5",
                              "duplicateStageId": "c2ef8bf0-7068-4a41-ae39-63d76bf6f828",
                              "minTime": 202,
                              "maxTime": 540,
                              "mediaSources": [
                                {
                                  "id": "eaaa992f-d338-4ee6-a4b1-13698b727ba2",
                                  "name": "Lobby Entrance"
                                },
                                {
                                  "id": "5b5184b3-3952-4e13-a874-5ea40d19f5fa",
                                  "name": "Parking Level 2"
                                }
                              ]
                            },
                            {
                              "id": "f7e313a3-8a0a-4a48-a7c7-13157740c2b3",
                              "name": "Parking Level 2",
                              "order": 425,
                              "isRequired": true,
                              "type": 1,
                              "sectionId": "27237529-dd2b-4c7d-a08e-77a781545123",
                              "duplicateStageId": "b24f1fb7-5105-43cf-af59-7a96408d3b2e",
                              "minTime": 811,
                              "maxTime": 18,
                              "mediaSources": [
                                {
                                  "id": "3b13107c-18d5-4918-a3be-ed52067b3125",
                                  "name": "Lobby Entrance"
                                },
                                {
                                  "id": "1090c5ca-e819-4b2f-affd-8578df29169d",
                                  "name": "Perimeter West"
                                }
                              ]
                            }
                          ],
                          "sections": [
                            {
                              "id": "8673e05c-27aa-42d8-adcb-b516f17017ec",
                              "name": "Perimeter West",
                              "order": 352,
                              "isRequired": true,
                              "type": 0,
                              "stages": []
                            },
                            {
                              "id": "7f491518-424e-4e09-ad69-a571939daa0d",
                              "name": "Perimeter West",
                              "order": 981,
                              "isRequired": true,
                              "type": 0,
                              "stages": []
                            }
                          ]
                        },
                        {
                          "id": "96865d34-cb9e-4151-a63a-5c91e57c48bc",
                          "name": "Loading Bay 3",
                          "estimatedTime": 899,
                          "status": 1,
                          "entityType": 1,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "updatedAt": "2026-07-27T09:14:33Z",
                          "stepCount": 267,
                          "stages": [
                            {
                              "id": "98cd4b91-f8ff-4c7b-afb3-11d8bc756eb9",
                              "name": "Perimeter West",
                              "order": 272,
                              "isRequired": true,
                              "type": 1,
                              "sectionId": "41b4211c-57b5-43e7-a0a1-25bb8a4f6578",
                              "duplicateStageId": "ee0868b3-1808-47ec-ac40-3b4ced6151a5",
                              "minTime": 159,
                              "maxTime": 769,
                              "mediaSources": [
                                {
                                  "id": "bf8a9e85-b7f8-4323-aa7e-b8602418434a",
                                  "name": "Lobby Entrance"
                                },
                                {
                                  "id": "7da32af4-ab91-440f-aa52-4df7e809e5df",
                                  "name": "Lobby Entrance"
                                }
                              ]
                            },
                            {
                              "id": "3b3e2a26-7754-4432-aaf2-03a95cf499e4",
                              "name": "Loading Bay 3",
                              "order": 458,
                              "isRequired": false,
                              "type": 0,
                              "sectionId": "8d1d061c-1d47-4c2e-a4bd-d8dacfb7f768",
                              "duplicateStageId": "19556017-4a0f-4b12-a2dd-99c70309c899",
                              "minTime": 564,
                              "maxTime": 468,
                              "mediaSources": [
                                {
                                  "id": "f8ddde87-2173-4ce3-a68c-588d820ba433",
                                  "name": "Lobby Entrance"
                                },
                                {
                                  "id": "43154837-26aa-4a1b-a267-a4597c414bcf",
                                  "name": "Perimeter West"
                                }
                              ]
                            }
                          ],
                          "sections": [
                            {
                              "id": "67b19a96-9045-4aea-ab51-c51432ad55ed",
                              "name": "Perimeter West",
                              "order": 279,
                              "isRequired": true,
                              "type": 0,
                              "stages": []
                            },
                            {
                              "id": "92e2456a-686b-4990-a478-ab098618c681",
                              "name": "North Gate Camera",
                              "order": 21,
                              "isRequired": true,
                              "type": 0,
                              "stages": []
                            }
                          ]
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FlowDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FlowDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List flows",
        "description": "Paged `FetchResponse`: `totalCount` sits beside `data` at the top level\nand `message` is the timing string.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getFlows"
      },
      "post": {
        "tags": [
          "Flow"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowCreateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowCreateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FlowCreateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FlowDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "bf571fc6-5424-45b2-a383-1f715f0cc389",
                        "name": "Loading Bay 3",
                        "estimatedTime": 617,
                        "status": 0,
                        "entityType": 1,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "updatedAt": "2026-07-27T09:14:33Z",
                        "stepCount": 426,
                        "stages": [
                          {
                            "id": "8fd080a4-fde7-4df7-a54b-eb2c4d563f40",
                            "name": "Parking Level 2",
                            "order": 984,
                            "isRequired": false,
                            "type": 1,
                            "sectionId": "66ea024d-561b-4f5f-a005-252f9e1de7a8",
                            "duplicateStageId": "dec8cc9e-5454-47d7-ad9c-65b3e0491bf5",
                            "minTime": 950,
                            "maxTime": 154,
                            "mediaSources": [
                              {
                                "id": "73fd517e-6e21-459f-aaa8-8f60570eb049",
                                "name": "Loading Bay 3"
                              },
                              {
                                "id": "6dc51ac9-443b-418e-ab96-557c8f318725",
                                "name": "Loading Bay 3"
                              }
                            ]
                          },
                          {
                            "id": "03be3891-4222-4edf-aa61-fdc896bed70e",
                            "name": "Perimeter West",
                            "order": 368,
                            "isRequired": false,
                            "type": 1,
                            "sectionId": "f59647e5-8924-4ce5-a79d-71605c2a7d39",
                            "duplicateStageId": "16a9d4d8-b4e5-47e7-a2b6-ae689d7b1cfe",
                            "minTime": 273,
                            "maxTime": 216,
                            "mediaSources": [
                              {
                                "id": "931e0536-fcbf-446a-acc9-14f8be3e6108",
                                "name": "Loading Bay 3"
                              },
                              {
                                "id": "2aa04dfe-9afb-475f-aaaa-2314d0f7b0d7",
                                "name": "Parking Level 2"
                              }
                            ]
                          }
                        ],
                        "sections": [
                          {
                            "id": "fde03872-64ab-4022-aae0-d7a4c9c89819",
                            "name": "Perimeter West",
                            "order": 593,
                            "isRequired": true,
                            "type": 0,
                            "stages": [
                              {
                                "id": "78bacf53-8aa3-4e37-ace0-fcbc37c6ac44",
                                "name": "Parking Level 2",
                                "order": 583,
                                "isRequired": false,
                                "type": 0,
                                "sectionId": "faebe2f1-ca0e-4944-a473-29c6305d5ce1",
                                "duplicateStageId": "72b0fcbc-4481-4bbb-a79e-3fd36748e187",
                                "minTime": 913,
                                "maxTime": 688,
                                "mediaSources": [
                                  {
                                    "id": "ec02c659-3a00-40e5-a8a5-507e508491a5",
                                    "name": "Lobby Entrance"
                                  },
                                  {
                                    "id": "d0260973-5fcb-4541-a006-d2b34029154c",
                                    "name": "Perimeter West"
                                  }
                                ]
                              },
                              {
                                "id": "9a58eaff-bbc9-4f88-ae1a-2aeec325fa8e",
                                "name": "Loading Bay 3",
                                "order": 338,
                                "isRequired": false,
                                "type": 0,
                                "sectionId": "07a80f00-9539-4fa7-a483-3e354d1956fc",
                                "duplicateStageId": "b4d456bb-55e9-496f-a061-4af1afe7f523",
                                "minTime": 150,
                                "maxTime": 780,
                                "mediaSources": [
                                  {
                                    "id": "ae96a7fc-2a4b-4524-a644-76f4cfa3ccd5",
                                    "name": "North Gate Camera"
                                  },
                                  {
                                    "id": "72493f0c-97b8-48d1-a6a3-41e2e594f8e7",
                                    "name": "Parking Level 2"
                                  }
                                ]
                              }
                            ]
                          },
                          {
                            "id": "e6c885a0-e019-427c-adae-d49240ec4e4b",
                            "name": "Parking Level 2",
                            "order": 489,
                            "isRequired": false,
                            "type": 0,
                            "stages": [
                              {
                                "id": "681baf1e-fb09-43e6-a6f3-24aabfd96055",
                                "name": "Perimeter West",
                                "order": 36,
                                "isRequired": false,
                                "type": 0,
                                "sectionId": "3aa25072-c656-40c2-aac7-3ba231f2aa57",
                                "duplicateStageId": "77b41f7c-bc54-43ba-a3ac-d678fd3c153b",
                                "minTime": 861,
                                "maxTime": 937,
                                "mediaSources": [
                                  {
                                    "id": "1f0e5109-cd82-4ecb-a80b-34cc64f5723b",
                                    "name": "Perimeter West"
                                  },
                                  {
                                    "id": "f231cf54-72bf-4c15-a518-a3ddac070b4d",
                                    "name": "Perimeter West"
                                  }
                                ]
                              },
                              {
                                "id": "11560882-e506-4c4f-a19a-75d10d44e0f2",
                                "name": "Loading Bay 3",
                                "order": 461,
                                "isRequired": true,
                                "type": 0,
                                "sectionId": "bf17a67a-2d8a-4266-a4a5-8dc64ce708da",
                                "duplicateStageId": "dc5d9703-6287-4f11-a1ca-cd18c89fc07c",
                                "minTime": 463,
                                "maxTime": 531,
                                "mediaSources": [
                                  {
                                    "id": "d4070639-d8e0-4c17-a540-b889ce716350",
                                    "name": "Parking Level 2"
                                  },
                                  {
                                    "id": "384e3cfa-4c9b-405a-ac99-928c97a97736",
                                    "name": "Loading Bay 3"
                                  }
                                ]
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FlowDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FlowDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a flow",
        "description": "Returns the created flow. A new flow's status is not necessarily active;\ncheck it, and use `PATCH /api/configuration/basic/flows/{id}/status` to\nstart it.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postFlows"
      }
    },
    "/api/configuration/basic/flows/{id}": {
      "get": {
        "tags": [
          "Flow"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FlowDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "e48f181c-d111-4c28-a6f6-274ae052610b",
                        "name": "Perimeter West",
                        "estimatedTime": 94,
                        "status": 0,
                        "entityType": 3,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "updatedAt": "2026-07-27T09:14:33Z",
                        "stepCount": 317,
                        "stages": [
                          {
                            "id": "26846dcd-d63b-4595-a667-18c986d09d9c",
                            "name": "Perimeter West",
                            "order": 866,
                            "isRequired": true,
                            "type": 0,
                            "sectionId": "b24dae34-a143-4f4c-af7d-9a54cb4f5070",
                            "duplicateStageId": "3680eca0-2038-4254-a689-d899681b81d4",
                            "minTime": 715,
                            "maxTime": 831,
                            "mediaSources": [
                              {
                                "id": "24ede03a-790d-4dd0-a0b5-4ff01a86efa3",
                                "name": "Parking Level 2"
                              },
                              {
                                "id": "e3a6da2d-02ba-431e-a2c4-0210f7e3e027",
                                "name": "North Gate Camera"
                              }
                            ]
                          },
                          {
                            "id": "3d3d49f7-9e80-4e07-ad2f-45e04ad9a82e",
                            "name": "Loading Bay 3",
                            "order": 981,
                            "isRequired": false,
                            "type": 1,
                            "sectionId": "472d366a-5882-4828-a746-c6c22f07216e",
                            "duplicateStageId": "23f87975-b6d7-49bc-aa33-142348859ff1",
                            "minTime": 243,
                            "maxTime": 604,
                            "mediaSources": [
                              {
                                "id": "5bc62087-7bbb-41d6-accf-4a41eaae1973",
                                "name": "Perimeter West"
                              },
                              {
                                "id": "b4f7ddca-fc01-454d-ab25-828bf19da781",
                                "name": "Lobby Entrance"
                              }
                            ]
                          }
                        ],
                        "sections": [
                          {
                            "id": "29a1dc20-6220-4d7f-a242-d1186be01825",
                            "name": "North Gate Camera",
                            "order": 718,
                            "isRequired": false,
                            "type": 0,
                            "stages": [
                              {
                                "id": "9574ca55-017c-49cf-a860-b7f41a934e7b",
                                "name": "North Gate Camera",
                                "order": 34,
                                "isRequired": false,
                                "type": 1,
                                "sectionId": "97d8427d-48b7-4d62-a896-0916d520d2c9",
                                "duplicateStageId": "bba914b3-1eb0-4c3f-a87c-0668cc566e28",
                                "minTime": 723,
                                "maxTime": 757,
                                "mediaSources": []
                              },
                              {
                                "id": "52629cc1-3e4e-4425-a8fe-4a1fffde9a78",
                                "name": "Perimeter West",
                                "order": 850,
                                "isRequired": false,
                                "type": 1,
                                "sectionId": "a30a9315-c72b-4b7f-aaa4-f9b1920dbd96",
                                "duplicateStageId": "b0a3f5cc-4bd8-4b58-a3c9-77b1ca54eabc",
                                "minTime": 804,
                                "maxTime": 797,
                                "mediaSources": []
                              }
                            ]
                          },
                          {
                            "id": "4cf65309-803c-4cab-abe3-a254b77135ed",
                            "name": "North Gate Camera",
                            "order": 893,
                            "isRequired": false,
                            "type": 0,
                            "stages": [
                              {
                                "id": "282dbc1b-3e98-458b-a2e5-1989b208f3ed",
                                "name": "Parking Level 2",
                                "order": 908,
                                "isRequired": false,
                                "type": 1,
                                "sectionId": "62d9d05e-b9e1-4699-a981-dc0d7fd29dc9",
                                "duplicateStageId": "7f2682a1-9102-4aa0-a64e-1207bf5e95bc",
                                "minTime": 906,
                                "maxTime": 267,
                                "mediaSources": []
                              },
                              {
                                "id": "5a3ca965-094f-4c2f-a251-499170e1dd79",
                                "name": "Perimeter West",
                                "order": 906,
                                "isRequired": true,
                                "type": 0,
                                "sectionId": "067c0a23-5a34-41ce-a940-cc657394ea40",
                                "duplicateStageId": "8da78646-f30e-44fc-a0a9-73cd5697059e",
                                "minTime": 699,
                                "maxTime": 590,
                                "mediaSources": []
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FlowDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_FlowDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one flow",
        "description": "The full definition including its media-source links. Build those first\nthrough `/api/configuration/basic/mediasource-links` - a flow references\nlinks, it does not create them.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getFlowsById"
      },
      "put": {
        "tags": [
          "Flow"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowUpdateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowUpdateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FlowUpdateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a flow",
        "description": "Full replacement. `304` with an empty body means nothing was written.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putFlowsById"
      },
      "delete": {
        "tags": [
          "Flow"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete a flow",
        "description": "Unlike most single deletes here this one uses `BuildOkResponse`, so it\nreturns `200` with `data: false` when nothing was deleted rather than\n`304`. **Check `data`, not just the status.**\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteFlowsById"
      }
    },
    "/api/configuration/basic/flows/bulk": {
      "delete": {
        "tags": [
          "Flow"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowBulkDeleteRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowBulkDeleteRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FlowBulkDeleteRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete several flows",
        "description": "Ids travel in the body as `{ \"ids\": [...] }`. Unlike the single delete,\nthis one does return **`304`** when nothing matched.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteFlowsBulk"
      }
    },
    "/api/configuration/basic/flows/{id}/status": {
      "patch": {
        "tags": [
          "Flow"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowStatusUpdateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowStatusUpdateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FlowStatusUpdateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Change a flow's status",
        "description": "Start and stop a flow without touching its definition - the endpoint an\noperator toggle calls. `304` means it was already in that status.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchFlowsByIdStatus"
      }
    },
    "/api/data/flow/widgets/{dashboardWidgetId}/kpi": {
      "post": {
        "tags": [
          "FlowDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "value": 22.75,
                        "previousValue": 92.65,
                        "deltaPct": 84.91,
                        "label": "Loading Bay 3",
                        "status": "anim culpa Lorem",
                        "timestamp": "2026-07-27T09:14:33Z",
                        "sparkline": [
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 18.16
                          },
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 39.51
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a KPI widget's value (flow)",
        "description": "A single headline number with its comparison against the previous period - what a KPI tile renders.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFlowWidgetsByDashboardWidgetKpi"
      }
    },
    "/api/data/flow/widgets/{dashboardWidgetId}/kpi-list": {
      "post": {
        "tags": [
          "FlowDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiListPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "items": [
                          {
                            "value": 8.35,
                            "previousValue": 25.81,
                            "deltaPct": 0.47,
                            "label": "Lobby Entrance",
                            "status": "aliquip magna voluptate qui",
                            "timestamp": "2026-07-27T09:14:33Z",
                            "sparkline": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 12.34
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 1.43
                              }
                            ],
                            "name": "Lobby Entrance"
                          },
                          {
                            "value": 0.73,
                            "previousValue": 35.29,
                            "deltaPct": 30.02,
                            "label": "Lobby Entrance",
                            "status": "non",
                            "timestamp": "2026-07-27T09:14:33Z",
                            "sparkline": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 58.41
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 20.2
                              }
                            ],
                            "name": "North Gate Camera"
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiListPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiListPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a KPI-list widget's values (flow)",
        "description": "Several related headline numbers in one call, for a tile that shows a small table of figures rather than one.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFlowWidgetsByDashboardWidgetKpiList"
      }
    },
    "/api/data/flow/widgets/{dashboardWidgetId}/series": {
      "post": {
        "tags": [
          "FlowDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "series": [
                          {
                            "name": "Perimeter West",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 11.23
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 11.96
                              }
                            ]
                          },
                          {
                            "name": "Perimeter West",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 44.24
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 89.96
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a time-series widget's data (flow)",
        "description": "Points over time, already bucketed by the interval the widget is configured with. Do not re-aggregate client-side.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFlowWidgetsByDashboardWidgetSeries"
      }
    },
    "/api/data/flow/widgets/{dashboardWidgetId}/buckets": {
      "post": {
        "tags": [
          "FlowDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "aliquip do dolor est labore",
                            "label": "Parking Level 2",
                            "value": 67.88,
                            "durationSeconds": 75.26
                          },
                          {
                            "key": "sunt laborum in ea cillum",
                            "label": "Perimeter West",
                            "value": 68.79,
                            "durationSeconds": 46.64
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a bucketed widget's data (flow)",
        "description": "Counts grouped by a categorical dimension - by camera, by class, by hour of day - for a bar or pie chart.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFlowWidgetsByDashboardWidgetBuckets"
      }
    },
    "/api/data/flow/widgets/{dashboardWidgetId}/stacked-buckets": {
      "post": {
        "tags": [
          "FlowDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "aliquip mollit",
                            "label": "Loading Bay 3",
                            "segments": [
                              {
                                "name": "Perimeter West",
                                "value": 94.23
                              },
                              {
                                "name": "Lobby Entrance",
                                "value": 51.7
                              }
                            ]
                          },
                          {
                            "key": "in elit proident",
                            "label": "North Gate Camera",
                            "segments": [
                              {
                                "name": "Lobby Entrance",
                                "value": 67.97
                              },
                              {
                                "name": "Perimeter West",
                                "value": 52.01
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a stacked-bucket widget's data (flow)",
        "description": "Buckets split by a second dimension, for a stacked bar chart. The extra series come back inside the payload, not as separate calls.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFlowWidgetsByDashboardWidgetStackedBuckets"
      }
    },
    "/api/data/flow/widgets/{dashboardWidgetId}/rows": {
      "post": {
        "tags": [
          "FlowDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetRowsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetRowsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetFlowWidgetRowsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "totalCount": 430,
                        "data": [
                          {
                            "columns": {
                              "laboree99": {},
                              "sint16": {},
                              "ut360": {},
                              "magna4": {},
                              "tempor099": {},
                              "dolorec0e": {},
                              "labore369": {}
                            }
                          },
                          {
                            "columns": {
                              "amet_7d": {},
                              "esse9": {},
                              "sed_d": {},
                              "exercitation_4": {}
                            }
                          }
                        ],
                        "durationSeconds": 817
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a table widget's rows (flow)",
        "description": "The detail rows behind a table widget. This is the largest payload on the tag - expect it to dominate dashboard load time.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFlowWidgetsByDashboardWidgetRows"
      }
    },
    "/api/data/flow-events": {
      "post": {
        "tags": [
          "FlowEvent"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateFlowEventRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateFlowEventRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateFlowEventRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "417": {
            "description": "Expectation Failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Expectation Failed",
                    "value": {
                      "data": null,
                      "message": "Failed to publish the triggered event.",
                      "resultCode": 417
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Record a flow event",
        "description": "Normally written by the pipeline. `400` with `Flow event not created`\nmeans the facade refused it; `417` means it broke a business rule, such\nas referencing a flow that is not running.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `417` | `Prefer: code=417` | Expectation Failed |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFlowEvents"
      }
    },
    "/api/data/flow-events/filter": {
      "post": {
        "tags": [
          "FlowEvent"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowEventFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FlowEventFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FlowEventFilterRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FlowEventDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "1eb3f19c-8042-4d3f-a2b4-04be02f2ce38",
                          "flowId": "3ef0a5f9-2ccd-46a9-a14b-23d69fa00c1e",
                          "stageId": "d469d6ab-ff40-40f5-af56-0f5adbfc5d96",
                          "mediaSourceId": "c744ee60-2627-42e3-a344-f55d84fde056",
                          "mediaSourceName": "North Gate Camera",
                          "entityRef": "do nisi consequat Lorem cillum",
                          "enteredAt": "2026-07-27T09:14:33Z",
                          "exitedAt": "2026-07-27T09:14:33Z",
                          "durationSec": 152,
                          "outcome": "irure elit labore",
                          "violationCode": "reprehenderit proident ex cillum",
                          "createdAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "c8641310-0eb0-4b04-a552-4abd8a5d20b2",
                          "flowId": "dbfce694-9684-44ad-acfb-7551464e05e6",
                          "stageId": "2b4e6aab-fa44-4645-a47c-7b8b48297407",
                          "mediaSourceId": "88b323a0-3a22-423e-a4a6-1d4f299a677d",
                          "mediaSourceName": "Lobby Entrance",
                          "entityRef": "ullamco id non eiusmod cillum",
                          "enteredAt": "2026-07-27T09:14:33Z",
                          "exitedAt": "2026-07-27T09:14:33Z",
                          "durationSec": 40,
                          "outcome": "eiusmod in aliquip",
                          "violationCode": "veniam laborum dolore ad",
                          "createdAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FlowEventDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FlowEventDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Search flow events",
        "description": "Paged `FetchResponse`: `totalCount` beside `data`, `message` is the\ntiming string. A `POST` that reads, because the filter is too large for\na query string.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFlowEventsFilter"
      }
    },
    "/api/configuration/basic/face-group": {
      "post": {
        "tags": [
          "Group"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonGroupDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/PersonGroupDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/PersonGroupDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a face group",
        "description": "`200`/`data: true`, or `400` with `Failed to add face group` when the\nfacade refuses it.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postFaceGroup"
      },
      "patch": {
        "tags": [
          "Group"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateGroupRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateGroupRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateGroupRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a face group",
        "description": "The id travels in the body. `304` with an empty body means nothing was\nwritten.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchFaceGroup"
      },
      "get": {
        "tags": [
          "Group"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PersonGroupDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "f7d89a80-2dd6-4962-ab9e-d2553d4b67bc",
                          "name": "Parking Level 2",
                          "alertOnCapture": true,
                          "isDefault": false
                        },
                        {
                          "id": "16b332c5-f418-43c4-af53-e9425cb19f04",
                          "name": "Lobby Entrance",
                          "alertOnCapture": false,
                          "isDefault": true
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PersonGroupDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PersonGroupDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List face groups",
        "description": "Every group with its members.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getFaceGroup"
      }
    },
    "/api/configuration/basic/face-group/delete": {
      "post": {
        "tags": [
          "Group"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteGroupRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteGroupRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteGroupRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete face groups",
        "description": "A `POST` that deletes: the body is `{ \"idsToDelete\": [...] }`, the same\nshape as the application-role delete. `304` means nothing matched.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postFaceGroupDelete"
      }
    },
    "/api/configuration/basic/identity-role": {
      "get": {
        "tags": [
          "IdentityRole"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_IdentityRoleDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "c9a2c513-1549-47c3-af2f-8e562a99ac79",
                          "name": "North Gate Camera",
                          "description": "Parking Level 2",
                          "claims": [
                            {
                              "type": "sunt",
                              "value": "esse pariatur et nisi ex"
                            },
                            {
                              "type": "quis in enim deserunt nostrud",
                              "value": "culpa exercitation ut"
                            }
                          ]
                        },
                        {
                          "id": "e861c6b8-b5bc-4ed6-aa3a-2d0a0ee90acf",
                          "name": "Loading Bay 3",
                          "description": "Lobby Entrance",
                          "claims": [
                            {
                              "type": "nostrud cupidatat est sint",
                              "value": "veniam qui deserunt tempor"
                            },
                            {
                              "type": "consectetur in Ut amet dolore",
                              "value": "nulla"
                            }
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_IdentityRoleDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_IdentityRoleDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List Identity roles",
        "description": "ASP.NET Identity roles, stored in `AspNetRoles` and managed by\n`RoleManager<ZRole>`. Distinct from the application roles under\n`/api/configuration/basic/role`, which carry the permission sets.\n\n`message` is the literal `\"Roles retrieved successfully\"`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getIdentityRole"
      }
    },
    "/api/configuration/basic/identity-role/{id}": {
      "get": {
        "tags": [
          "IdentityRole"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_IdentityRoleDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "0d8460a7-f754-4b39-a5b1-c4b7fed56c78",
                        "name": "Lobby Entrance",
                        "description": "Lobby Entrance",
                        "claims": [
                          {
                            "type": "in consectetur",
                            "value": "non fugiat"
                          },
                          {
                            "type": "nulla Lorem aliquip laborum pariatur",
                            "value": "incididunt aute enim"
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_IdentityRoleDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_IdentityRoleDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one Identity role",
        "description": "**A missing role returns `400`, not `404`.** The controller checks for\nnull and calls `BuildBadResponse($\"Role with ID {id} not found\")`, so the\ndeclared `404` is only reachable if the facade itself raises\n`NotFoundException`. Branch on `400` when handling \"does not exist\".\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getIdentityRoleById"
      }
    },
    "/api/configuration/basic/identity-role/user/{userId}/roles": {
      "get": {
        "tags": [
          "IdentityRole"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        "exercitation aliqua Duis",
                        "magna incididunt"
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List a user's Identity roles",
        "description": "Returns role **names** as strings, not ids. To change membership you need\nthe role id, which you get from `GET /api/configuration/basic/identity-role`.\n\nAn unknown `userId` returns an empty list rather than an error.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getIdentityRoleUserByUserRoles"
      }
    },
    "/api/configuration/basic/identity-role/user/{userId}/role/{roleId}": {
      "post": {
        "tags": [
          "IdentityRole"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "roleId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Add a user to an Identity role",
        "description": "Returns `200`/`data: true` on success. **Every failure is `400`** with\nthe reason in `message` - unknown user, unknown role, or already a\nmember. The declared `404` is not produced by this action.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postIdentityRoleUserByUserRoleByRole"
      },
      "delete": {
        "tags": [
          "IdentityRole"
        ],
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "roleId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Remove a user from an Identity role",
        "description": "Returns `200`/`data: true` on success and `400` on any failure,\nincluding \"was not a member\". Idempotent retries therefore report `400`,\nnot `200` - do not treat that as a hard error.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteIdentityRoleUserByUserRoleByRole"
      }
    },
    "/api/configuration/basic/identity-role/{roleId}/claims": {
      "get": {
        "tags": [
          "IdentityRole"
        ],
        "parameters": [
          {
            "name": "roleId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_IdentityRoleClaimDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "type": "anim in nostrud ipsum",
                          "value": "ad cupidatat cillum laboris"
                        },
                        {
                          "type": "exercitation sed dolore",
                          "value": "sed proident reprehenderit laborum"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_IdentityRoleClaimDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_IdentityRoleClaimDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List an Identity role's claims",
        "description": "Returns the claims attached to the role. Claims here are the Identity\nmechanism; they are not the permission strings that\n`AccessInterceptorMiddleware` enforces - those live in `permissions.json`\nand are reached through the application roles.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getIdentityRoleByRoleClaims"
      }
    },
    "/api/data/incident/widgets/{dashboardWidgetId}/kpi": {
      "post": {
        "tags": [
          "IncidentDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "value": 13.01,
                        "previousValue": 50.94,
                        "deltaPct": 35,
                        "label": "North Gate Camera",
                        "status": "amet mollit sint ex adipisicing",
                        "timestamp": "2026-07-27T09:14:33Z",
                        "sparkline": [
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 93.47
                          },
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 85.23
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a KPI widget's value (incident)",
        "description": "A single headline number with its comparison against the previous period - what a KPI tile renders.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataIncidentWidgetsByDashboardWidgetKpi"
      }
    },
    "/api/data/incident/widgets/{dashboardWidgetId}/series": {
      "post": {
        "tags": [
          "IncidentDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "series": [
                          {
                            "name": "Loading Bay 3",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 59.54
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 39.5
                              }
                            ]
                          },
                          {
                            "name": "Parking Level 2",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 29.19
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 33.33
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a time-series widget's data (incident)",
        "description": "Points over time, already bucketed by the interval the widget is configured with. Do not re-aggregate client-side.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataIncidentWidgetsByDashboardWidgetSeries"
      }
    },
    "/api/data/incident/widgets/{dashboardWidgetId}/buckets": {
      "post": {
        "tags": [
          "IncidentDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "laboris id sed amet",
                            "label": "Loading Bay 3",
                            "value": 51.96,
                            "durationSeconds": 41.45
                          },
                          {
                            "key": "anim elit velit consequat cupidatat",
                            "label": "Lobby Entrance",
                            "value": 88.08,
                            "durationSeconds": 96.85
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a bucketed widget's data (incident)",
        "description": "Counts grouped by a categorical dimension - by camera, by class, by hour of day - for a bar or pie chart.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataIncidentWidgetsByDashboardWidgetBuckets"
      }
    },
    "/api/data/incident/widgets/{dashboardWidgetId}/stacked-buckets": {
      "post": {
        "tags": [
          "IncidentDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "aliqua Lorem reprehenderit ex laborum",
                            "label": "North Gate Camera",
                            "segments": [
                              {
                                "name": "Perimeter West",
                                "value": 29.48
                              },
                              {
                                "name": "North Gate Camera",
                                "value": 27.94
                              }
                            ]
                          },
                          {
                            "key": "exercitation veniam eu laborum",
                            "label": "Lobby Entrance",
                            "segments": [
                              {
                                "name": "Loading Bay 3",
                                "value": 16.76
                              },
                              {
                                "name": "North Gate Camera",
                                "value": 71.18
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a stacked-bucket widget's data (incident)",
        "description": "Buckets split by a second dimension, for a stacked bar chart. The extra series come back inside the payload, not as separate calls.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataIncidentWidgetsByDashboardWidgetStackedBuckets"
      }
    },
    "/api/data/incident/widgets/{dashboardWidgetId}/ranked": {
      "post": {
        "tags": [
          "IncidentDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_RankedPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "rows": [
                          {
                            "rank": 472,
                            "values": {
                              "exercitationf": {},
                              "adipisicingee": {},
                              "amet__4": {}
                            }
                          },
                          {
                            "rank": 596,
                            "values": {
                              "dolor48": {},
                              "aute659": {},
                              "ine": {},
                              "voluptate_c8a": {},
                              "veniam6f9": {}
                            }
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_RankedPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_RankedPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a ranked widget's data (incident)",
        "description": "A top-N list ordered by the widget's metric. The N is part of the widget's stored configuration, not the request.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataIncidentWidgetsByDashboardWidgetRanked"
      }
    },
    "/api/data/incident/widgets/{dashboardWidgetId}/rows": {
      "post": {
        "tags": [
          "IncidentDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetRowsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetRowsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetIncidentWidgetRowsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "totalCount": 210,
                        "data": [
                          {
                            "columns": {
                              "eu_2": {},
                              "est_9": {},
                              "Ut3f": {}
                            }
                          },
                          {
                            "columns": {
                              "dolor3": {},
                              "ea07f": {},
                              "exercitation_a6": {},
                              "irure6": {},
                              "exercitation_5": {}
                            }
                          }
                        ],
                        "durationSeconds": 65
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a table widget's rows (incident)",
        "description": "The detail rows behind a table widget. This is the largest payload on the tag - expect it to dominate dashboard load time.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataIncidentWidgetsByDashboardWidgetRows"
      }
    },
    "/api/configuration/basic/license": {
      "get": {
        "tags": [
          "License"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LicenseInfoDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "27278d15-1b40-4b91-a9db-ec9078223915",
                        "licenseType": "enim aliquip aliqua quis irure",
                        "licensedTo": "amet",
                        "releaseVersion": "Excepteur aute",
                        "generatedOn": "2026-07-27T09:14:33Z",
                        "licenseExpiryDate": "2026-07-27T09:14:33Z",
                        "licenseFeatures": {
                          "nostrud_fb": "dolore in non minim",
                          "in_0f8": "minim elit exercitation in est",
                          "dolor_8": "ut laborum",
                          "mollit6": "in culpa",
                          "etb89": "in cillum Duis",
                          "sed8": "nulla dolor Lorem veniam exercitation"
                        },
                        "licenseLimits": {
                          "Hawk": 723,
                          "Falcon": 673,
                          "Eagle": 473,
                          "Phoenix": 551,
                          "None": 158
                        },
                        "licensedServers": [
                          {
                            "id": "4dd84464-5166-4270-a74d-445471b55134",
                            "name": "Parking Level 2",
                            "type": 0,
                            "rfl": "velit",
                            "features": {
                              "idd04": {
                                "rfl": "in",
                                "encryptedLicense": "qui"
                              }
                            }
                          },
                          {
                            "id": "89dc71e2-394c-4c7f-a681-df791d19b01a",
                            "name": "North Gate Camera",
                            "type": 0,
                            "rfl": "amet eu in sit proident",
                            "features": {
                              "laborum5": {
                                "rfl": "elit aute",
                                "encryptedLicense": "elit in"
                              },
                              "velit9": {
                                "rfl": "velit esse reprehenderit sunt",
                                "encryptedLicense": "laboris"
                              },
                              "reprehenderit_0": {
                                "rfl": "est incididunt tempor anim Ut",
                                "encryptedLicense": "officia est"
                              },
                              "proidentae": {
                                "rfl": "incididunt ut Duis deserunt officia",
                                "encryptedLicense": "sit in dolor"
                              }
                            }
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LicenseInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LicenseInfoDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Read the installed license",
        "description": "Returns type, licensee, generation and expiry dates, the feature map, the\nper-tier media-source limits (`Hawk`, `Falcon`, `Eagle`, `Phoenix`,\n`None`) and the licensed servers.\n\n`licenseLimits` counts what the license *permits*, not what is currently\nconfigured - compare against\n`GET /api/configuration/basic/server/assigned-mediaSources` to find\nheadroom.\n\n### Licensing controls the whole API\n\n`AccessInterceptorMiddleware` gates every non-bypassed request on\n`GetLicenseStatusAsync()`. `Valid` and `Expired` both pass; only\n`Invalid` is refused, with **`402 Payment Required`** and the plain-text\nbody `License is required. Please import a valid license.` - not the\nenvelope, and no `resultCode`.\n\nAn *expired* license does not lock the system out. Only a missing or\nunparseable one does.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "getLicense"
      },
      "post": {
        "tags": [
          "License"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLicenseRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLicenseRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLicenseRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Install or replace the license",
        "description": "Post `{ \"license\": \"<blob from the vendor>\" }`. Returns `true` when the\nblob parsed and was persisted, `false` when it did not - **the status is\n`200` either way**, so check `data`, not the status code.\n\nTakes effect on the next request; there is no restart.\n\nOn the license bypass list, so this is reachable on an otherwise\n402-locked system.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postLicense"
      },
      "delete": {
        "tags": [
          "License"
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Remove the installed license",
        "description": "Deletes the license unconditionally and returns `200` with `data: true`.\n\n**This locks the API.** Once removed, `GetLicenseStatusAsync()` reports\n`Invalid` and every request outside the bypass list returns `402` until a\nnew license is installed. The endpoints that remain reachable are login,\nversion, license import and request, server registration and listing, and\nthe export surface.\n\nThe bypass check matches on **path only**, so `GET`, `POST` and `DELETE`\non `/api/configuration/basic/license` are all exempt - the list entry is\nnominally for the import verb.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "deleteLicense"
      }
    },
    "/api/configuration/basic/license/request": {
      "post": {
        "tags": [
          "License"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralLicenseRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralLicenseRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralLicenseRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Generate a license request blob for the vendor",
        "description": "Takes the media-source counts you want licensed and returns an opaque\nstring to send to Veer, who return a license to install with\n`POST /api/configuration/basic/license`.\n\nOn the license bypass list - by necessity, since you call it when the\nsystem has no valid license.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postLicenseRequest"
      }
    },
    "/api/configuration/basic/live-feed/folders": {
      "get": {
        "tags": [
          "LiveFeedFolder"
        ],
        "parameters": [
          {
            "name": "parentFolderId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "52ca9a6f-ebd0-4f59-af93-132191699a03",
                          "name": "Loading Bay 3",
                          "description": "Lobby Entrance",
                          "parentFolderId": "2522cd09-cade-4c3f-a8ee-b3fd63f01bf5",
                          "userId": "cebe5c2c-02b7-4c7b-ac00-1ecfa6681144",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "ff75f491-03b8-4831-afe1-2f700df59fff",
                          "name": "Perimeter West",
                          "description": "Loading Bay 3",
                          "parentFolderId": "6af9b1f7-1426-4151-a9ee-a250241f81fd",
                          "userId": "79f2026f-c123-4dcb-a132-9201aab303f0",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List live-feed folders",
        "description": "One level only. `parentFolderId` is optional - omit it for the roots,\nsupply it for a folder's children. For the whole hierarchy in one call\nuse `/tree`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getLiveFeedFolders"
      },
      "post": {
        "tags": [
          "LiveFeedFolder"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLiveFeedFolderRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLiveFeedFolderRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLiveFeedFolderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "8288cd3a-8c5a-4085-a04d-cbdd1199e3f9",
                        "name": "Parking Level 2",
                        "description": "Perimeter West",
                        "parentFolderId": "c491449a-36f7-4084-ab3d-370ace969f51",
                        "userId": "0dd0e705-bf76-491a-a859-68e791c0c466",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a folder",
        "description": "Omit the parent to create a root folder.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postLiveFeedFolders"
      }
    },
    "/api/configuration/basic/live-feed/folders/tree": {
      "get": {
        "tags": [
          "LiveFeedFolder"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderTreeNodeDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "c7b4d913-6b87-43e1-aea5-ef9418ba85c7",
                          "name": "North Gate Camera",
                          "parentFolderId": "a791641d-0532-4b5b-ab20-dbdbd1be1d28",
                          "childCount": 179,
                          "viewCount": 281,
                          "children": [
                            {
                              "id": "f430f45d-1b7b-41c6-a0c8-678c47ad7451",
                              "name": "Parking Level 2",
                              "parentFolderId": "9c1f8d73-927f-4102-aba9-a226673e6280",
                              "childCount": 228,
                              "viewCount": 203,
                              "children": [
                                {
                                  "id": "3176b610-9fae-4763-a14a-a88f5e118c42",
                                  "name": "Lobby Entrance",
                                  "parentFolderId": "90c95495-1ac8-4ff8-ab2c-d792fcb0d166",
                                  "childCount": 227,
                                  "viewCount": 176,
                                  "children": [
                                    {
                                      "id": "6b0e24eb-c1fa-4081-ada5-22cbe5f44cf5",
                                      "name": "Loading Bay 3",
                                      "parentFolderId": "878a606d-d70a-4471-a9e3-2917b602c4ce",
                                      "childCount": 294,
                                      "viewCount": 310,
                                      "children": [
                                        {
                                          "id": "612c9f1a-1859-4f8e-a332-171fe591456b",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "4a627bc8-68b9-402f-af9d-1c0e23ae386f",
                                          "childCount": 49,
                                          "viewCount": 153,
                                          "children": []
                                        },
                                        {
                                          "id": "9c3c2d3f-adff-499a-aa4f-1f2480189ab7",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "40f09823-3906-42c3-af03-f9b54bd04a45",
                                          "childCount": 185,
                                          "viewCount": 240,
                                          "children": []
                                        }
                                      ]
                                    },
                                    {
                                      "id": "b68a2ed7-9abf-4233-a746-327198d9b520",
                                      "name": "Parking Level 2",
                                      "parentFolderId": "c3cb07f4-30ca-472f-a645-828e2bf353ac",
                                      "childCount": 107,
                                      "viewCount": 50,
                                      "children": [
                                        {
                                          "id": "dc8a808f-31ee-4411-a616-5d3217c3ebff",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "5ce75adc-a519-45a7-a4a3-f73ddc492035",
                                          "childCount": 312,
                                          "viewCount": 108,
                                          "children": []
                                        },
                                        {
                                          "id": "279a0c0e-d776-4220-a291-cc3e2a2156ae",
                                          "name": "Loading Bay 3",
                                          "parentFolderId": "2e216219-f90d-42a1-a5fb-b7794bcdb6ec",
                                          "childCount": 211,
                                          "viewCount": 297,
                                          "children": []
                                        }
                                      ]
                                    }
                                  ]
                                },
                                {
                                  "id": "91a266c8-f57b-4bde-a40b-5b126e2ec0f6",
                                  "name": "Lobby Entrance",
                                  "parentFolderId": "ad6f7ab1-9214-4584-a9b3-ee8745967fc9",
                                  "childCount": 242,
                                  "viewCount": 473,
                                  "children": [
                                    {
                                      "id": "8841da2a-d529-4be4-a0ac-fa9a8ef16c61",
                                      "name": "North Gate Camera",
                                      "parentFolderId": "bb8c004a-336a-4550-ac02-643a38c42202",
                                      "childCount": 284,
                                      "viewCount": 422,
                                      "children": [
                                        {
                                          "id": "111929bb-4d84-4e32-a18c-87f0dc17095f",
                                          "name": "Perimeter West",
                                          "parentFolderId": "59d51d21-3f74-461c-acda-09671a460e56",
                                          "childCount": 66,
                                          "viewCount": 383,
                                          "children": []
                                        },
                                        {
                                          "id": "672ee0dc-0717-4b7f-a347-1cb190574a56",
                                          "name": "Loading Bay 3",
                                          "parentFolderId": "8ccd155c-cf70-4a30-aae3-1b09f18dd638",
                                          "childCount": 291,
                                          "viewCount": 323,
                                          "children": []
                                        }
                                      ]
                                    },
                                    {
                                      "id": "91c29832-91ba-4cc3-a8c7-424179435fbc",
                                      "name": "Perimeter West",
                                      "parentFolderId": "7910e862-61a3-457f-ad51-f9956b65575f",
                                      "childCount": 41,
                                      "viewCount": 109,
                                      "children": [
                                        {
                                          "id": "9b29acee-b913-435a-a33b-949c513da91d",
                                          "name": "North Gate Camera",
                                          "parentFolderId": "5db79834-72a6-4598-a1b0-a7bf421b19f4",
                                          "childCount": 436,
                                          "viewCount": 425,
                                          "children": []
                                        },
                                        {
                                          "id": "42f1a8a9-ccb0-454f-a001-03fed28b89bd",
                                          "name": "Perimeter West",
                                          "parentFolderId": "bcfcb815-50f8-436d-a166-0b0374127fc2",
                                          "childCount": 441,
                                          "viewCount": 321,
                                          "children": []
                                        }
                                      ]
                                    }
                                  ]
                                }
                              ]
                            },
                            {
                              "id": "59f997f9-9853-4031-a4d3-c280b322331f",
                              "name": "Perimeter West",
                              "parentFolderId": "ab364a54-07e1-4b61-a17a-545d2d3976a4",
                              "childCount": 149,
                              "viewCount": 256,
                              "children": [
                                {
                                  "id": "fdf477a0-5191-4c04-a1bd-287b45c7d8e5",
                                  "name": "Parking Level 2",
                                  "parentFolderId": "09818f01-5678-4396-a11c-f61905b6dc28",
                                  "childCount": 281,
                                  "viewCount": 137,
                                  "children": [
                                    {
                                      "id": "39e87f64-a397-409f-abed-9dc72f2c4151",
                                      "name": "Perimeter West",
                                      "parentFolderId": "2b60154c-dbbf-46cd-a4d3-c31afe5baada",
                                      "childCount": 230,
                                      "viewCount": 35,
                                      "children": [
                                        {
                                          "id": "700697aa-3d45-4d9b-ac92-11a83ce1979d",
                                          "name": "Loading Bay 3",
                                          "parentFolderId": "2f5eb38a-8fd5-42bf-aa71-0b54c77a3649",
                                          "childCount": 200,
                                          "viewCount": 480,
                                          "children": []
                                        },
                                        {
                                          "id": "a3f71853-7605-4e26-aa7a-e3271737c344",
                                          "name": "North Gate Camera",
                                          "parentFolderId": "e038b81c-74da-447b-a551-090deb63c6f9",
                                          "childCount": 159,
                                          "viewCount": 369,
                                          "children": []
                                        }
                                      ]
                                    },
                                    {
                                      "id": "6f277fd9-7ef4-4a2e-a5c1-900eec7960e7",
                                      "name": "Perimeter West",
                                      "parentFolderId": "ad9aa375-b304-45a6-ab6e-57703d5c8015",
                                      "childCount": 286,
                                      "viewCount": 420,
                                      "children": [
                                        {
                                          "id": "3c323294-6f97-4e2f-a459-9831a10c3698",
                                          "name": "Parking Level 2",
                                          "parentFolderId": "4bf38abd-427e-4eda-a77a-502f7c845813",
                                          "childCount": 477,
                                          "viewCount": 91,
                                          "children": []
                                        },
                                        {
                                          "id": "3b8bf7f2-1065-4742-a7de-83e625f3d54a",
                                          "name": "Perimeter West",
                                          "parentFolderId": "cd1c8684-e350-4ac0-a84a-ae0af948567d",
                                          "childCount": 247,
                                          "viewCount": 449,
                                          "children": []
                                        }
                                      ]
                                    }
                                  ]
                                },
                                {
                                  "id": "c389cb3c-73b5-410b-a0f5-7d4627d8762b",
                                  "name": "North Gate Camera",
                                  "parentFolderId": "388b5586-b532-413b-a8bc-9c0fd2201872",
                                  "childCount": 258,
                                  "viewCount": 498,
                                  "children": [
                                    {
                                      "id": "e1f7467e-a871-49fd-a0f5-e9468091b97f",
                                      "name": "North Gate Camera",
                                      "parentFolderId": "75645457-84cd-49a0-ac76-9e062311447c",
                                      "childCount": 23,
                                      "viewCount": 496,
                                      "children": [
                                        {
                                          "id": "4feddfcd-1bf5-4f15-a8b3-11f2cd5145eb",
                                          "name": "Perimeter West",
                                          "parentFolderId": "3892c1ff-4de6-4cfc-adb7-e8eab802a2d8",
                                          "childCount": 297,
                                          "viewCount": 160,
                                          "children": []
                                        },
                                        {
                                          "id": "6e139845-ce33-4485-a798-064098fb446a",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "b7610743-725b-47ee-a869-6592ebdcced8",
                                          "childCount": 436,
                                          "viewCount": 455,
                                          "children": []
                                        }
                                      ]
                                    },
                                    {
                                      "id": "23c253d5-9fbf-45c9-ab50-89695630b55b",
                                      "name": "Parking Level 2",
                                      "parentFolderId": "e9cf941a-f7a9-461c-a31d-5e034ee2910d",
                                      "childCount": 138,
                                      "viewCount": 480,
                                      "children": [
                                        {
                                          "id": "b8cfb160-7772-4101-aa81-e11ed8a1ac4d",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "640b4f6d-478d-4abc-a115-02038b141463",
                                          "childCount": 49,
                                          "viewCount": 349,
                                          "children": []
                                        },
                                        {
                                          "id": "68d7876b-2ae5-44ae-a5cf-3c632b47a86f",
                                          "name": "Loading Bay 3",
                                          "parentFolderId": "875f4bdd-bae5-4cae-ab3e-a100ac6c6e8b",
                                          "childCount": 446,
                                          "viewCount": 104,
                                          "children": []
                                        }
                                      ]
                                    }
                                  ]
                                }
                              ]
                            }
                          ]
                        },
                        {
                          "id": "ded00649-3773-4e95-a5a8-e3e94bd29301",
                          "name": "Lobby Entrance",
                          "parentFolderId": "9eae28b5-deaf-445b-a066-ee238d7b21a2",
                          "childCount": 4,
                          "viewCount": 299,
                          "children": [
                            {
                              "id": "19c08dce-a5e3-4968-a943-ae6668cdbefd",
                              "name": "Perimeter West",
                              "parentFolderId": "7b7989fe-f258-46bf-a421-3e8de3e67c20",
                              "childCount": 420,
                              "viewCount": 275,
                              "children": [
                                {
                                  "id": "01682ea8-cf2e-4f82-a063-ea8ecdc50d49",
                                  "name": "Lobby Entrance",
                                  "parentFolderId": "91f2baf7-4afe-46fd-ab5b-2efd11c5e131",
                                  "childCount": 223,
                                  "viewCount": 460,
                                  "children": [
                                    {
                                      "id": "2f719fb3-524f-4c15-ad88-120983aa0ca1",
                                      "name": "Loading Bay 3",
                                      "parentFolderId": "9a7d7a07-3ded-4721-a084-68788a992f42",
                                      "childCount": 302,
                                      "viewCount": 104,
                                      "children": [
                                        {
                                          "id": "94486d23-e65d-467e-ac98-8048768d9a39",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "7be94bcd-e5bb-457b-a44c-8d20b9acd86a",
                                          "childCount": 414,
                                          "viewCount": 391,
                                          "children": []
                                        },
                                        {
                                          "id": "af703093-3642-40f9-a8a0-420ffa3930bf",
                                          "name": "North Gate Camera",
                                          "parentFolderId": "aa4ec8ad-f597-4af8-a812-3343643d8863",
                                          "childCount": 448,
                                          "viewCount": 278,
                                          "children": []
                                        }
                                      ]
                                    },
                                    {
                                      "id": "386891ee-e652-41b3-ad7d-9a430d062e28",
                                      "name": "Lobby Entrance",
                                      "parentFolderId": "6c3a9306-d9ac-4395-a868-5f67c30167c3",
                                      "childCount": 492,
                                      "viewCount": 481,
                                      "children": [
                                        {
                                          "id": "83d28bf7-853e-4ddc-a162-68a4dd13ba90",
                                          "name": "Loading Bay 3",
                                          "parentFolderId": "5c19141f-b095-4eab-ac25-1bdf8767e3e6",
                                          "childCount": 76,
                                          "viewCount": 327,
                                          "children": []
                                        },
                                        {
                                          "id": "0fea0483-f778-45f1-ae50-b089f4c1a6d8",
                                          "name": "North Gate Camera",
                                          "parentFolderId": "c8e237e1-b619-415f-a1d0-1a882ec669bf",
                                          "childCount": 178,
                                          "viewCount": 493,
                                          "children": []
                                        }
                                      ]
                                    }
                                  ]
                                },
                                {
                                  "id": "f41f3ddf-84bd-4b4f-ac97-e990c313ee43",
                                  "name": "Loading Bay 3",
                                  "parentFolderId": "595672c6-4d48-43e2-ac73-a3c97bb0429f",
                                  "childCount": 229,
                                  "viewCount": 101,
                                  "children": [
                                    {
                                      "id": "c4b60b35-a91b-4dfe-a63f-67776fe07176",
                                      "name": "Perimeter West",
                                      "parentFolderId": "e1e9d103-b317-4b50-a886-db11bec2e749",
                                      "childCount": 498,
                                      "viewCount": 117,
                                      "children": [
                                        {
                                          "id": "40937293-d0d1-45fe-a6d6-e735ba40da6e",
                                          "name": "North Gate Camera",
                                          "parentFolderId": "6e7395c0-168b-4685-a357-70c65ead434d",
                                          "childCount": 182,
                                          "viewCount": 387,
                                          "children": []
                                        },
                                        {
                                          "id": "c294f9e2-c0bb-4123-af9b-268846145153",
                                          "name": "Loading Bay 3",
                                          "parentFolderId": "9171ab53-1ddb-4758-a289-281d0f527c2d",
                                          "childCount": 79,
                                          "viewCount": 473,
                                          "children": []
                                        }
                                      ]
                                    },
                                    {
                                      "id": "d06a9f47-4df8-45a6-a75f-328bb2983e4d",
                                      "name": "Loading Bay 3",
                                      "parentFolderId": "baf68de9-bd5e-45f7-af8b-f3ded5890081",
                                      "childCount": 383,
                                      "viewCount": 254,
                                      "children": [
                                        {
                                          "id": "55489258-cf65-440e-a0fd-5ee2a214cdce",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "a858acbf-31a9-4cf1-afb0-72b207331f13",
                                          "childCount": 490,
                                          "viewCount": 364,
                                          "children": []
                                        },
                                        {
                                          "id": "3df4f5a1-480a-40f5-ac51-af3110c826a8",
                                          "name": "Loading Bay 3",
                                          "parentFolderId": "b770ced0-e38d-4bde-ad0f-32427843443a",
                                          "childCount": 130,
                                          "viewCount": 179,
                                          "children": []
                                        }
                                      ]
                                    }
                                  ]
                                }
                              ]
                            },
                            {
                              "id": "59ad4ad8-5d89-4be2-a052-c8cd419e0582",
                              "name": "Perimeter West",
                              "parentFolderId": "974d6a39-eacb-419b-aeb1-2cb330d6070f",
                              "childCount": 129,
                              "viewCount": 6,
                              "children": [
                                {
                                  "id": "1451b4be-785b-41c7-a4f8-6014c1e73d04",
                                  "name": "Loading Bay 3",
                                  "parentFolderId": "f09969f9-a068-4211-abae-6a76ccdacf5b",
                                  "childCount": 412,
                                  "viewCount": 47,
                                  "children": [
                                    {
                                      "id": "96736096-adf1-4473-a0c9-4baf96814f37",
                                      "name": "Lobby Entrance",
                                      "parentFolderId": "f5643208-d551-4904-afd9-6005dacc4d28",
                                      "childCount": 463,
                                      "viewCount": 236,
                                      "children": [
                                        {
                                          "id": "fb6b392e-dede-4817-aa92-cd2f53b953c9",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "fc7a6f16-683b-4530-a499-dc35d8fa0b8f",
                                          "childCount": 231,
                                          "viewCount": 245,
                                          "children": []
                                        },
                                        {
                                          "id": "bfa93684-2062-4636-a1ef-7545807f6bb6",
                                          "name": "North Gate Camera",
                                          "parentFolderId": "029b41ce-0d70-4216-a27a-bce916a8e3c1",
                                          "childCount": 132,
                                          "viewCount": 339,
                                          "children": []
                                        }
                                      ]
                                    },
                                    {
                                      "id": "0669269b-80cc-4b22-ac4b-4e464fb94904",
                                      "name": "Parking Level 2",
                                      "parentFolderId": "eb438584-6f1e-4b9c-af72-63c8686f248d",
                                      "childCount": 366,
                                      "viewCount": 25,
                                      "children": [
                                        {
                                          "id": "7f011924-31c8-43fa-ab46-b2b1eab8a562",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "1c7629ff-daf0-4a5b-a62b-664ced932056",
                                          "childCount": 386,
                                          "viewCount": 126,
                                          "children": []
                                        },
                                        {
                                          "id": "7d23273c-a027-4999-a34a-6c688bab6133",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "e3af4f4c-cda4-461a-a38a-7c037a53d5ef",
                                          "childCount": 470,
                                          "viewCount": 199,
                                          "children": []
                                        }
                                      ]
                                    }
                                  ]
                                },
                                {
                                  "id": "a4c85d59-9123-4457-a879-aaafa37a38a7",
                                  "name": "Lobby Entrance",
                                  "parentFolderId": "12c9f118-b8ae-4a96-afa6-4f7c9a6597e6",
                                  "childCount": 317,
                                  "viewCount": 350,
                                  "children": [
                                    {
                                      "id": "b0241f3c-39b3-4ffa-ad92-bb1579be1864",
                                      "name": "Parking Level 2",
                                      "parentFolderId": "d19c2c7d-d9e0-4b31-ac80-d3a30b74be4d",
                                      "childCount": 139,
                                      "viewCount": 125,
                                      "children": [
                                        {
                                          "id": "eea56a51-fa78-4a60-ac50-ab62bf222de6",
                                          "name": "North Gate Camera",
                                          "parentFolderId": "b2867c09-15c3-4e3d-ae0d-d171124ed815",
                                          "childCount": 479,
                                          "viewCount": 482,
                                          "children": []
                                        },
                                        {
                                          "id": "f56046bb-5304-43ce-ae00-7800cfff057b",
                                          "name": "North Gate Camera",
                                          "parentFolderId": "5b9c5e38-8414-454a-a237-10cb3c0b8dc6",
                                          "childCount": 214,
                                          "viewCount": 349,
                                          "children": []
                                        }
                                      ]
                                    },
                                    {
                                      "id": "656eab79-6c99-4301-a794-615054a01b54",
                                      "name": "Loading Bay 3",
                                      "parentFolderId": "9ae3791a-3ab8-4f31-a8c6-01f14f48c3f6",
                                      "childCount": 452,
                                      "viewCount": 480,
                                      "children": [
                                        {
                                          "id": "302d7c24-0622-4a16-a478-96690276c3b8",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "953cb288-feea-4f8d-a234-6686f49bf36d",
                                          "childCount": 116,
                                          "viewCount": 210,
                                          "children": []
                                        },
                                        {
                                          "id": "687de038-49b1-4a58-a8d7-2130f7a6b29e",
                                          "name": "Lobby Entrance",
                                          "parentFolderId": "f815640f-2c09-42bb-a94f-fa5cddc50b7c",
                                          "childCount": 221,
                                          "viewCount": 78,
                                          "children": []
                                        }
                                      ]
                                    }
                                  ]
                                }
                              ]
                            }
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderTreeNodeDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderTreeNodeDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get the folder tree",
        "description": "The entire hierarchy, nested, in one call - what a sidebar renders.\nPrefer this over walking `?parentFolderId=` level by level.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getLiveFeedFoldersTree"
      }
    },
    "/api/configuration/basic/live-feed/folders/{id}": {
      "get": {
        "tags": [
          "LiveFeedFolder"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "f28419d6-8873-499d-a0ac-2606c2a0b0ce",
                        "name": "North Gate Camera",
                        "description": "Parking Level 2",
                        "parentFolderId": "be319bf9-387b-418a-a6ef-b6ab4321d2b1",
                        "userId": "b578d807-b825-4d59-a6ad-9be4a878f67b",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedFolderDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one folder",
        "description": "The folder itself. Its views come from\n`GET /api/configuration/basic/live-feed/views`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getLiveFeedFoldersById"
      },
      "put": {
        "tags": [
          "LiveFeedFolder"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLiveFeedFolderRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLiveFeedFolderRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLiveFeedFolderRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a folder",
        "description": "Rename or re-parent. `304` means nothing was written.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putLiveFeedFoldersById"
      },
      "delete": {
        "tags": [
          "LiveFeedFolder"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete a folder",
        "description": "`304` means nothing was deleted. What happens to views inside the folder\nis decided by the facade and is not visible in the response - move them\nout first if you need to be sure.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteLiveFeedFoldersById"
      }
    },
    "/api/configuration/basic/live-feed/views": {
      "get": {
        "tags": [
          "LiveFeedView"
        ],
        "parameters": [
          {
            "name": "FolderId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "Name",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "From",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "To",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 10000000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_LiveFeedViewDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "272b241f-ccb4-4fdc-af6a-aa8b95d9b5e8",
                          "name": "Loading Bay 3",
                          "description": "Perimeter West",
                          "folderId": "0e01933a-8627-4299-aaa2-97357e95e49d",
                          "gridRows": 594,
                          "gridColumns": 677,
                          "userId": "64a670f2-5287-4fc5-a062-130897037a54",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "slots": [
                            {
                              "id": "7d2e7811-6f9a-40f5-ab57-d5f981c105f1",
                              "viewId": "c6030b18-fc97-411f-ac76-dcd546a83d77",
                              "slotIndex": 614,
                              "mediaSourceId": "d7d4cfbb-57bb-40a3-a994-97e5e2809c4c",
                              "enabledModules": [
                                203,
                                102
                              ],
                              "includeNonFaceDetectedResults": true,
                              "includeNonPlateDetectedResults": false
                            },
                            {
                              "id": "2207c344-d0c8-4f8c-a4b2-575c91dc540f",
                              "viewId": "765f66d0-1961-47a5-a829-907cd79c1e7d",
                              "slotIndex": 656,
                              "mediaSourceId": "17350245-2648-4237-a81c-1d185074c940",
                              "enabledModules": [
                                202,
                                104
                              ],
                              "includeNonFaceDetectedResults": false,
                              "includeNonPlateDetectedResults": false
                            }
                          ]
                        },
                        {
                          "id": "12943c08-ccfa-4e42-ad2a-ae832c19ea30",
                          "name": "North Gate Camera",
                          "description": "Parking Level 2",
                          "folderId": "37224e13-7344-4dc9-a567-52516e5e09bf",
                          "gridRows": 828,
                          "gridColumns": 811,
                          "userId": "14d6d626-a064-4994-aa12-aa9f37383bbe",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "slots": [
                            {
                              "id": "c6a094b7-a611-4377-a758-c9d576a0eb9e",
                              "viewId": "e141b4f0-cd55-4510-ad29-380b15736281",
                              "slotIndex": 673,
                              "mediaSourceId": "2a941665-a914-41e6-a26a-2050f3a4a014",
                              "enabledModules": [
                                101,
                                102
                              ],
                              "includeNonFaceDetectedResults": false,
                              "includeNonPlateDetectedResults": false
                            },
                            {
                              "id": "d953bcd6-ad5d-42fd-ae0f-11b34fc418a9",
                              "viewId": "44075e20-223f-44de-aedc-515ee1a31b0b",
                              "slotIndex": 849,
                              "mediaSourceId": "64f91a5d-adeb-4238-aafc-46c3997493bd",
                              "enabledModules": [
                                103,
                                108
                              ],
                              "includeNonFaceDetectedResults": true,
                              "includeNonPlateDetectedResults": false
                            }
                          ]
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_LiveFeedViewDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_LiveFeedViewDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List live-feed views",
        "description": "Paged `FetchResponse`: `totalCount` beside `data`, `message` is the\ntiming string.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getLiveFeedViews"
      },
      "post": {
        "tags": [
          "LiveFeedView"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLiveFeedViewRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLiveFeedViewRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateLiveFeedViewRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedViewDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "456d193f-15f2-431f-af0a-157af3686ed2",
                        "name": "Lobby Entrance",
                        "description": "Parking Level 2",
                        "folderId": "d78a9b7e-dae9-436f-a8df-4571ad239718",
                        "gridRows": 812,
                        "gridColumns": 634,
                        "userId": "393de39b-4198-4620-a7cd-7fac2f8a95c6",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z",
                        "slots": [
                          {
                            "id": "b041c84c-5cd6-4f5f-ac87-4070b71ee64e",
                            "viewId": "94963d2b-8ca7-4689-a443-2cfc55e97dc9",
                            "slotIndex": 64,
                            "mediaSourceId": "9d2ce36c-12cb-403c-a2ef-ac7baae16f6f",
                            "enabledModules": [
                              302,
                              111
                            ],
                            "includeNonFaceDetectedResults": true,
                            "includeNonPlateDetectedResults": true
                          },
                          {
                            "id": "0f7213cd-2e94-4c15-a43f-983299e4c310",
                            "viewId": "92411cca-0180-4a6e-aeca-fa06f016ca54",
                            "slotIndex": 77,
                            "mediaSourceId": "5514bedd-a394-4f0e-a3c2-623cd1a5606b",
                            "enabledModules": [
                              302,
                              3
                            ],
                            "includeNonFaceDetectedResults": true,
                            "includeNonPlateDetectedResults": false
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedViewDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedViewDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a live-feed view",
        "description": "Returns the created view. Slots can be supplied here or set afterwards\nwith the `/slots` endpoint.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postLiveFeedViews"
      }
    },
    "/api/configuration/basic/live-feed/views/{id}": {
      "get": {
        "tags": [
          "LiveFeedView"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedViewDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "9422a668-04e4-4de2-a486-8fe56cbf42a2",
                        "name": "Parking Level 2",
                        "description": "Loading Bay 3",
                        "folderId": "f94909b6-c995-49fc-a4eb-c470896ed53c",
                        "gridRows": 281,
                        "gridColumns": 66,
                        "userId": "179fa75b-762f-4420-a69d-ee9e8d29b77b",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z",
                        "slots": [
                          {
                            "id": "0a084684-cafe-4069-aa57-09a68c7cbc31",
                            "viewId": "a32f19b4-437d-49e0-aeea-9694e73cae1b",
                            "slotIndex": 228,
                            "mediaSourceId": "6ac81f01-9604-493e-a24c-2dde5d7768f6",
                            "enabledModules": [
                              6,
                              3
                            ],
                            "includeNonFaceDetectedResults": false,
                            "includeNonPlateDetectedResults": false
                          },
                          {
                            "id": "afd60654-506c-4405-a12e-14837e446190",
                            "viewId": "22d7f583-e73e-4563-a0b8-c6ab7fca432e",
                            "slotIndex": 476,
                            "mediaSourceId": "30d3a2e2-0def-48dc-a5fe-585947ce3dc9",
                            "enabledModules": [
                              104,
                              105
                            ],
                            "includeNonFaceDetectedResults": false,
                            "includeNonPlateDetectedResults": true
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedViewDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedViewDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one live-feed view",
        "description": "The layout with its slots. Each slot names a media source; start\nstreaming for each with\n`POST /api/configuration/basic/mediasource/{mediaSourceId}/streaming/start`\nbefore you can render it.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getLiveFeedViewsById"
      },
      "put": {
        "tags": [
          "LiveFeedView"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLiveFeedViewRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLiveFeedViewRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateLiveFeedViewRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a live-feed view",
        "description": "Name, layout size and folder. Slot contents have their own endpoint.\n`304` means nothing was written.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putLiveFeedViewsById"
      },
      "delete": {
        "tags": [
          "LiveFeedView"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete a live-feed view",
        "description": "`304` with an empty body means nothing was deleted.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteLiveFeedViewsById"
      }
    },
    "/api/configuration/basic/live-feed/views/{id}/move": {
      "patch": {
        "tags": [
          "LiveFeedView"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MoveLiveFeedViewRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MoveLiveFeedViewRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MoveLiveFeedViewRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Move a view to another folder",
        "description": "Re-parents the view. `304` means it was already there.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchLiveFeedViewsByIdMove"
      }
    },
    "/api/configuration/basic/live-feed/views/{id}/slots": {
      "put": {
        "tags": [
          "LiveFeedView"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplaceLiveFeedViewSlotsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ReplaceLiveFeedViewSlotsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ReplaceLiveFeedViewSlotsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedViewDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "fe87b10f-5225-41b0-a208-a68929a4c903",
                        "name": "Parking Level 2",
                        "description": "Lobby Entrance",
                        "folderId": "9087606c-f1ec-4272-aba2-0aacee0ac1aa",
                        "gridRows": 488,
                        "gridColumns": 503,
                        "userId": "e43c988e-3731-4703-aa08-d0ba1851c787",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z",
                        "slots": [
                          {
                            "id": "aeb32122-cedb-4963-a55a-06086e0650a4",
                            "viewId": "d7c61bef-91c0-40e2-a0db-59da3100b321",
                            "slotIndex": 233,
                            "mediaSourceId": "6ca39a79-64e5-4e53-ab84-161abbef76f6",
                            "enabledModules": [
                              1,
                              203
                            ],
                            "includeNonFaceDetectedResults": true,
                            "includeNonPlateDetectedResults": true
                          },
                          {
                            "id": "8ce0e3ba-1caa-4758-ae20-c7b0ab29740f",
                            "viewId": "febe8d24-83a6-4dc5-ad47-60230ecb15ab",
                            "slotIndex": 912,
                            "mediaSourceId": "c3b3525b-e8fe-4aef-acce-f0f849d399f9",
                            "enabledModules": [
                              201,
                              105
                            ],
                            "includeNonFaceDetectedResults": false,
                            "includeNonPlateDetectedResults": false
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedViewDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_LiveFeedViewDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Replace a view's slots",
        "description": "**Wholesale replacement** - the body is the complete slot list, and any\nslot you omit is cleared. There is no per-slot endpoint, so read the\nview, change one slot, and send the whole set back.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putLiveFeedViewsByIdSlots"
      }
    },
    "/api/data/lpr/vehicle-info": {
      "get": {
        "tags": [
          "Lpr"
        ],
        "parameters": [
          {
            "name": "PlateNumber",
            "in": "query",
            "schema": {
              "maxLength": 50,
              "minLength": 3,
              "type": "string"
            }
          },
          {
            "name": "MediaSourceIds",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          {
            "name": "MediaSourceGroupIds",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          {
            "name": "AllMediaSources",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "MediaSourcesFqid",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "From",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "To",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 10000000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VehicleInfoDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "e2de1bf0-cd62-4555-a6c2-2abb97173692",
                        "mediaSourceId": "9df53360-c3ac-4f07-ad80-5ae30971ae83",
                        "mediaSourceName": "Lobby Entrance",
                        "zoneName": "Parking Level 2",
                        "recognized": false,
                        "licensePlate": {
                          "number": "consectetur ea",
                          "country": "non",
                          "state": "non consequat reprehenderit laboris exercitation",
                          "type": "nulla ut irure culpa",
                          "color": "Silver",
                          "confidence": 96,
                          "boundingBox": {
                            "left": 646,
                            "top": 807,
                            "right": 34,
                            "bottom": 935
                          },
                          "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                        },
                        "modelMakeRecognition": {
                          "make": {
                            "name": "Loading Bay 3",
                            "confidence": 83
                          },
                          "model": {
                            "name": "North Gate Camera",
                            "confidence": 97
                          },
                          "category": {
                            "name": "Perimeter West",
                            "confidence": 88
                          },
                          "color": {
                            "name": "Lobby Entrance",
                            "confidence": 82
                          }
                        },
                        "createdAt": "2026-07-27T09:14:33Z",
                        "occurredAt": "2026-07-27T09:14:33Z",
                        "triggerType": 2,
                        "hasFaceVehicleDetection": false,
                        "watchListIds": [
                          "fa70b142-e7a6-461e-a894-e638e763141b",
                          "467c30a4-59de-4c02-af2f-6f3f0f88782d"
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VehicleInfoDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VehicleInfoDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List plate reads",
        "description": "Paged `FetchResponse`: `totalCount` beside `data`, `message` is the\ntiming string. Query-string filters only - use the filtered `POST` below\nfor anything richer.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataLprVehicleInfo"
      }
    },
    "/api/data/lpr/vehicle-info-filtered": {
      "post": {
        "tags": [
          "Lpr"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/VehicleInfoFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/VehicleInfoFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/VehicleInfoFilterRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_VehicleInfoDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "7d2a0e88-c569-4a5e-a3a4-ca5ea4489fe7",
                          "mediaSourceId": "2ffaa9ba-9425-4b29-aac9-c579487947bb",
                          "mediaSourceName": "Lobby Entrance",
                          "zoneName": "Lobby Entrance",
                          "recognized": true,
                          "licensePlate": {
                            "number": "labore Excepteur incididunt fugiat ut",
                            "country": "mollit nostrud proident",
                            "state": "consequat",
                            "type": "voluptate id velit pariatur",
                            "color": "Red",
                            "confidence": 90,
                            "boundingBox": {
                              "left": 608,
                              "top": 359,
                              "right": 540,
                              "bottom": 722
                            },
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                          },
                          "modelMakeRecognition": {
                            "make": {
                              "name": "Parking Level 2",
                              "confidence": 97
                            },
                            "model": {
                              "name": "Loading Bay 3",
                              "confidence": 88
                            },
                            "category": {
                              "name": "North Gate Camera",
                              "confidence": 85
                            },
                            "color": {
                              "name": "Loading Bay 3",
                              "confidence": 91
                            }
                          },
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "triggerType": 3,
                          "hasFaceVehicleDetection": true,
                          "watchListIds": [
                            "2fb62312-8c74-4d7e-a981-ee228bfb7be5",
                            "efe96b95-9dbe-431b-a8c8-554f598bce13"
                          ]
                        },
                        {
                          "id": "4cac154b-a85a-4ede-a98d-a793816819b7",
                          "mediaSourceId": "06a8b857-b3d2-47d9-a7cc-e3bf4e05d7e7",
                          "mediaSourceName": "Lobby Entrance",
                          "zoneName": "Lobby Entrance",
                          "recognized": false,
                          "licensePlate": {
                            "number": "Lorem adipisicing commodo laboris",
                            "country": "culpa Duis sed sunt id",
                            "state": "ex Excepteur",
                            "type": "consectetur Duis ex nulla elit",
                            "color": "Black",
                            "confidence": 84,
                            "boundingBox": {
                              "left": 231,
                              "top": 625,
                              "right": 292,
                              "bottom": 673
                            },
                            "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                            "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                          },
                          "modelMakeRecognition": {
                            "make": {
                              "name": "Lobby Entrance",
                              "confidence": 91
                            },
                            "model": {
                              "name": "Parking Level 2",
                              "confidence": 89
                            },
                            "category": {
                              "name": "Loading Bay 3",
                              "confidence": 85
                            },
                            "color": {
                              "name": "Lobby Entrance",
                              "confidence": 81
                            }
                          },
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "triggerType": 1,
                          "hasFaceVehicleDetection": false,
                          "watchListIds": [
                            "05a47096-2b1e-4568-acf2-b9fab8f3b341",
                            "0757e60c-95ba-4d58-ad3d-13759207f9a9"
                          ]
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_VehicleInfoDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_VehicleInfoDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Search plate reads",
        "description": "The full search: a `POST` that reads, because the filter is too large for\na query string. Same `FetchResponse` shape as the listing.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataLprVehicleInfoFiltered"
      }
    },
    "/api/data/lpr/anpr-related-images": {
      "get": {
        "tags": [
          "Lpr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ANPRRelatedImagesDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "fullFrameRelatedImages": [
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                        ],
                        "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                        "plateImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ANPRRelatedImagesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ANPRRelatedImagesDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get images related to a plate read",
        "description": "Other captures the platform associates with the same read - a second\ncamera, a following frame. `id` is a query parameter here, unlike the\ntwo image endpoints above.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataLprAnprRelatedImages"
      }
    },
    "/api/data/lpr/image/{id}": {
      "get": {
        "tags": [
          "Lpr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Get a plate crop",
        "description": "The cropped plate image, base64 in `data`. Small - safe to fetch per row.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "getDataLprImageById"
      }
    },
    "/api/data/lpr/full-frame-image/{id}": {
      "get": {
        "tags": [
          "Lpr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Get a plate read's full frame",
        "description": "The whole frame the plate was read from, base64 in `data`. Large - fetch\non demand, not with the list.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "getDataLprFullFrameImageById"
      }
    },
    "/api/configuration/basic/mediasource/{id}": {
      "get": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "527d9947-b0ad-4185-a9fd-f3f1a901c7f4",
                        "mediaSourceFqid": "Duis sunt consectetur tempor",
                        "name": "Parking Level 2",
                        "serverId": "f16c1008-7e9c-43be-a66f-5c52a482c708",
                        "isActive": true,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "floorNumber": 101,
                        "plan": 3,
                        "buildingName": "Perimeter West",
                        "address": "dolor dolore est cupidatat",
                        "mediaSourceIp": "10.0.4.21",
                        "mediaSourcePort": 554,
                        "mediaSourceUsername": "Loading Bay 3",
                        "mediaSourcePassword": "culpa consectetur aliquip cupidatat ut",
                        "longitude": 83.34,
                        "streamQuality": 971,
                        "streamFramesPerSecond": 731,
                        "streamWidth": 345,
                        "streamHeight": 659,
                        "latitude": 87.69,
                        "streamUrl": "rtsp://10.0.4.21:554/stream1",
                        "snapshotPath": "nulla in",
                        "snapshotTakenAt": "2026-07-27T09:14:33Z",
                        "mediaSourceProviderType": 0
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one media source",
        "description": "Returns the full `MediaSourceDto`. `[NotEmptyGuid]` rejects an all-zero\nid with a validation `400`.\n\n`403` means the caller has no permission on the group this media source\nbelongs to - permissions live on groups, never on the source itself.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceById"
      }
    },
    "/api/configuration/basic/mediasource": {
      "patch": {
        "tags": [
          "MediaSource"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaSourceDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaSourceDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MediaSourceDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a media source",
        "description": "The id travels in the body. Returns `200`/`data: true`, or **`304` with\nan empty body** when nothing was written - which is also what an unknown\nid gives you, since no `404` is declared.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchMediasource"
      }
    },
    "/api/configuration/basic/mediasource/group": {
      "post": {
        "tags": [
          "MediaSource"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddMediaSourceGroupRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AddMediaSourceGroupRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AddMediaSourceGroupRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a media-source group",
        "description": "Returns `200`/`data: true`, or `400` with `Failed to add media source\ngroup` in `message`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceGroup"
      },
      "patch": {
        "tags": [
          "MediaSource"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EditMediaSourceGroupRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EditMediaSourceGroupRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EditMediaSourceGroupRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a media-source group",
        "description": "The id travels in the body. `200`/`data: true` on success, **`304` with\nan empty body** when nothing changed.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchMediasourceGroup"
      },
      "delete": {
        "tags": [
          "MediaSource"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete media-source groups",
        "description": "Ids travel as a repeated query parameter and are validated twice - by\n`[NotEmptyGuidList]`, then by `NotDefaultMediaSourceGroupAttribute`,\nwhich the action runs by hand.\n\n**The default group cannot be deleted.** Including it fails the whole\ncall with a validation `400` carrying a single `{field, error}` entry,\nand nothing is deleted. `304` means nothing matched.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteMediasourceGroup"
      },
      "get": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "searchName",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "8475b706-40c0-4ce8-af71-ad05c4127d60",
                          "name": "Perimeter West",
                          "isActive": true,
                          "isDefault": true,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "mediaSourceIds": [
                            "c4a92d52-09df-4069-ac6b-1e3731e1846e",
                            "e364b9ae-a8c4-4bdf-a133-c440e556a38f"
                          ]
                        },
                        {
                          "id": "6f02511c-e9c8-4da5-abfe-b29a3fdac579",
                          "name": "Parking Level 2",
                          "isActive": false,
                          "isDefault": false,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "mediaSourceIds": [
                            "7eca4f03-2f6a-4f9e-a220-fcf949d8e452",
                            "51bd19f3-9c8b-4047-af8a-8b5cfc8c95ff"
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List media-source groups",
        "description": "Both `mediaSourceId` and `searchName` are optional filters; with neither,\nyou get every group the caller can see.\n\nThis is the same action as\n`GET /api/configuration/basic/mediasource/{mediaSourceId}/group` - the\ncontroller declares two routes onto one method, so the two paths behave\nidentically.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceGroup"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/group": {
      "get": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "searchName",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "8660aa38-b95f-4414-a8d3-046774c899c0",
                          "name": "Perimeter West",
                          "isActive": false,
                          "isDefault": false,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "mediaSourceIds": [
                            "8831999a-49bf-47c4-a5c8-5fe215fa5148",
                            "476310b4-3f8c-49f1-a250-27777e376286"
                          ]
                        },
                        {
                          "id": "7a5ec528-8f85-4f54-aec5-3355cf83c728",
                          "name": "Perimeter West",
                          "isActive": true,
                          "isDefault": false,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "mediaSourceIds": [
                            "97125b6e-d1e2-42a5-a5ea-c30e07fe7f32",
                            "de6ca665-1fd9-4332-add8-07bbe3419db7"
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the groups a media source belongs to",
        "description": "Path-parameter form of `GET /api/configuration/basic/mediasource/group`.\nSame action, same response - a media source can be in more than one\ngroup, so this returns a list.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceByMediaSourceGroup"
      }
    },
    "/api/configuration/basic/mediasource-group/{groupMediaSourceId}": {
      "get": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "groupMediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "69c72c70-afe6-4348-a79e-e3b3e1457b35",
                          "name": "Parking Level 2",
                          "isActive": false,
                          "isDefault": false,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "mediaSourceIds": [
                            "3dadf1fe-3a81-4ec8-a4fb-e89c0c3a4e30",
                            "7c418e37-0741-4d4a-a6ea-224ba99b26fa"
                          ]
                        },
                        {
                          "id": "54fa9411-77f8-4337-a5f3-c7b4d6bf25fc",
                          "name": "Perimeter West",
                          "isActive": false,
                          "isDefault": false,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "mediaSourceIds": [
                            "421422ed-1566-4f06-a0a8-048b71234e96",
                            "ca662052-14b7-4482-ace8-d650a4918619"
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the media sources in a group",
        "description": "The inverse of the previous endpoint. Note the hyphenated prefix -\n`mediasource-group/{id}` reads a group's contents, while\n`mediasource/group` manages the groups themselves.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceGroupByGroupMediaSource"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/group/{groupId}/assign": {
      "post": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "groupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssignMediaSourceToGroupRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AssignMediaSourceToGroupRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AssignMediaSourceToGroupRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Assign a media source to a group",
        "description": "**The two ids appear in both the path and the body and must match.** A\nmismatch returns a validation `400` with field `MediaSourceId/GroupId`\nbefore the facade is called.\n\n`409` means it is already a member; `404` means one of the two does not\nexist.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `409` | `Prefer: code=409` | Conflict |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceByMediaSourceGroupByGroupAssign"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/group/{groupId}/remove": {
      "delete": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "groupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveMediaSourceFromGroupRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveMediaSourceFromGroupRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RemoveMediaSourceFromGroupRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Remove a media source from a group",
        "description": "Same path-versus-body id check as the assign, with the same\n`MediaSourceId/GroupId` validation `400` on mismatch.\n\n`304` with an empty body means it was not a member.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteMediasourceByMediaSourceGroupByGroupRemove"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/config": {
      "post": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMediaSourceConfigDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMediaSourceConfigDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GeneralMediaSourceConfigDto"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Save a media source's general configuration",
        "description": "Name, location, retention and the like - not the per-module analytics\nconfiguration, which lives under `/mediasource-module`.\n\n`200`/`data: true`, or **`304`** when nothing changed.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceByMediaSourceConfig"
      },
      "get": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GeneralMediaSourceConfigDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "maskInfo": "mollit ipsum ullamco veniam irure",
                        "isMaskActive": true,
                        "maskType": 0,
                        "maskBytes": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                        "maskZones": [
                          {
                            "id": "5f974b45-39e9-448e-ae61-4cd45905d717",
                            "name": "Lobby Entrance",
                            "zoneMode": 0,
                            "cmPerPixelRatio": 76.9,
                            "anchors": [
                              {
                                "ratioX": 78.61,
                                "ratioY": 94.53
                              },
                              {
                                "ratioX": 62.42,
                                "ratioY": 58.83
                              }
                            ]
                          },
                          {
                            "id": "f0e8825f-aecc-4d59-a62e-23399883a8e4",
                            "name": "Perimeter West",
                            "zoneMode": 1,
                            "cmPerPixelRatio": 19.23,
                            "anchors": [
                              {
                                "ratioX": 39.32,
                                "ratioY": 95.05
                              },
                              {
                                "ratioX": 73.36,
                                "ratioY": 88.13
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GeneralMediaSourceConfigDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GeneralMediaSourceConfigDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a media source's general configuration",
        "description": "The counterpart read for the general configuration. Per-module settings\ncome from\n`GET /api/configuration/basic/mediasource-module/{mediaSourceId}/mediasource-config`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceByMediaSourceConfig"
      }
    },
    "/api/configuration/basic/mediasource-links": {
      "get": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "Page",
            "in": "query",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "PageSize",
            "in": "query",
            "schema": {
              "maximum": 100,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "SearchName",
            "in": "query",
            "schema": {
              "maxLength": 100,
              "minLength": 0,
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_MediaSourceLinkDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "totalCount": 101,
                        "data": [
                          {
                            "id": "d0685289-5585-4e5f-af7b-7318f7273c89",
                            "name": "Lobby Entrance",
                            "isActive": false,
                            "createdAt": "2026-07-27T09:14:33Z",
                            "mediaSourceIds": [
                              "c51b26bb-e2a6-460b-abed-c18ab268512d",
                              "f43cb423-4f2e-42f8-a1d3-ae61c5a7e493"
                            ],
                            "configs": [
                              {
                                "id": "10788b44-1afb-42ef-a26f-496d246f02c4",
                                "type": 1,
                                "config": {
                                  "in_2": {
                                    "options": {
                                      "hasValue": true,
                                      "value": {
                                        "hasValue": true,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {
                                        "hasValue": true,
                                        "value": {}
                                      },
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": true,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "ullamcoad": {
                                    "options": {
                                      "hasValue": true,
                                      "value": {
                                        "hasValue": true,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": false,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  }
                                },
                                "isActive": true
                              },
                              {
                                "id": "ab486c7b-a214-4edb-ae18-a1a293a2d0e2",
                                "type": 1,
                                "config": {
                                  "officia0_": {
                                    "options": {
                                      "hasValue": true,
                                      "value": {
                                        "hasValue": false,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": false,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "culpa_8d": {
                                    "options": {
                                      "hasValue": false,
                                      "value": {
                                        "hasValue": true,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": false,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "in939": {
                                    "options": {
                                      "hasValue": false,
                                      "value": {
                                        "hasValue": false,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": false,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "in_eb": {
                                    "options": {
                                      "hasValue": true,
                                      "value": {
                                        "hasValue": false,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": true,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "exercitation_1": {
                                    "options": {
                                      "hasValue": false,
                                      "value": {
                                        "hasValue": false,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": true,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "sint_5": {
                                    "options": {
                                      "hasValue": true,
                                      "value": {
                                        "hasValue": false,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": true,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  }
                                },
                                "isActive": true
                              }
                            ]
                          },
                          {
                            "id": "a1e561d5-f72f-4ef0-a8a7-a5137c98e855",
                            "name": "Loading Bay 3",
                            "isActive": true,
                            "createdAt": "2026-07-27T09:14:33Z",
                            "mediaSourceIds": [
                              "e763c9d9-56a3-4490-aa4a-fa8216dea867",
                              "cdf592d0-18d5-4af3-a6ab-d3c0fa80255c"
                            ],
                            "configs": [
                              {
                                "id": "24b5576b-15d3-4f02-a2b5-02595eaacf8c",
                                "type": 1,
                                "config": {
                                  "ullamco_0": {
                                    "options": {
                                      "hasValue": false,
                                      "value": {
                                        "hasValue": true,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": false,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "laborum_a2": {
                                    "options": {
                                      "hasValue": false,
                                      "value": {
                                        "hasValue": true,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": false,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "auted": {
                                    "options": {
                                      "hasValue": false,
                                      "value": {
                                        "hasValue": false,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": false,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "nostrud_d7d": {
                                    "options": {
                                      "hasValue": true,
                                      "value": {
                                        "hasValue": true,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": true,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "nisieb": {
                                    "options": {
                                      "hasValue": false,
                                      "value": {
                                        "hasValue": true,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": false,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  }
                                },
                                "isActive": true
                              },
                              {
                                "id": "4dcaed7c-3fc9-42b4-aa7e-db7c5eeaaf19",
                                "type": 1,
                                "config": {
                                  "in_bcf": {
                                    "options": {
                                      "hasValue": false,
                                      "value": {
                                        "hasValue": true,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": true,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  },
                                  "proident5": {
                                    "options": {
                                      "hasValue": false,
                                      "value": {
                                        "hasValue": true,
                                        "value": {}
                                      }
                                    },
                                    "parent": {
                                      "options": {},
                                      "parent": {
                                        "options": {},
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      },
                                      "root": {
                                        "options": {
                                          "hasValue": true,
                                          "value": {}
                                        },
                                        "parent": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        },
                                        "root": {
                                          "options": {},
                                          "parent": {},
                                          "root": {}
                                        }
                                      }
                                    },
                                    "root": {
                                      "options": {},
                                      "parent": {},
                                      "root": {}
                                    }
                                  }
                                },
                                "isActive": true
                              }
                            ]
                          }
                        ],
                        "durationSeconds": 483
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_MediaSourceLinkDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_MediaSourceLinkDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List media-source links",
        "description": "**This one is a `PageResponse`, not a `FetchResponse`** - the only paging\nshape of its kind in this API. Read the page metadata off\n`data`, and note there is no timing string in `message`.\n\nLinks are directional relationships between two media sources; flow and\ncounting use them to follow an object from one camera to the next.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceLinks"
      },
      "post": {
        "tags": [
          "MediaSource"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMediaSourceLinkRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMediaSourceLinkRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateMediaSourceLinkRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "f6f50d00-643a-4870-a2e0-ed51a77e6aca",
                        "name": "Lobby Entrance",
                        "isActive": true,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "mediaSourceIds": [
                          "0cd1ebe5-8e01-4628-aaec-ac06e27e3b90",
                          "294e265f-49c5-4b14-ac74-770328a93411"
                        ],
                        "configs": [
                          {
                            "id": "fc46f9f2-29cc-489c-acfe-59168ff953f9",
                            "type": 1,
                            "config": {
                              "exercitation006": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "laborum95": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "in7": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              }
                            },
                            "isActive": false
                          },
                          {
                            "id": "1ef4678c-b2e7-4d78-ae9c-bbc647f4b44a",
                            "type": 1,
                            "config": {
                              "culpabbd": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "quisc_": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "aute_5": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "officia_f8c": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "ad6c": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "in_a97": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "consequat_ba": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "cupidatat_d": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              }
                            },
                            "isActive": true
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a media-source link",
        "description": "Returns the created `MediaSourceLinkDto`, including its server-assigned\nid. Configure the link's per-module behaviour afterwards with\n`PUT /api/configuration/basic/mediasource-links/{mediaSourceLinkId}/configs`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceLinks"
      },
      "delete": {
        "tags": [
          "MediaSource"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete media-source links",
        "description": "Ids travel in the body, validated by `[NotEmptyGuidList]`.\n\n**The spec is incomplete here.** The action uses\n`BuildOkOrNotModifiedResponse`, so a real instance answers **`304` with\nan empty body** when nothing was deleted - but `304` is not declared, so\nthe mock cannot serve it. Handle it anyway.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteMediasourceLinks"
      }
    },
    "/api/configuration/basic/mediasource-links/{mediaSourceLinkId}": {
      "get": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceLinkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "2dfa43c6-3880-42d3-aab8-6a1a08d3c474",
                        "name": "North Gate Camera",
                        "isActive": true,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "mediaSourceIds": [
                          "dd13720d-7c81-49cf-a54d-c08273fe2e7b",
                          "954de82a-b00c-4d39-ab9a-d51780399f00"
                        ],
                        "configs": [
                          {
                            "id": "381f3471-c474-4126-a1c4-37960d2a0c16",
                            "type": 1,
                            "config": {
                              "mollit_915": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "cillum599": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "eiusmod51": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              }
                            },
                            "isActive": true
                          },
                          {
                            "id": "9bc46d36-59f1-475e-a9aa-955d2876fd6c",
                            "type": 1,
                            "config": {
                              "dolorbc8": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "quis_4": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "ut851": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              }
                            },
                            "isActive": true
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one media-source link",
        "description": "Returns the link and its configuration. No `404` is declared - an\nunknown id surfaces as `200` with `data: null` unless the facade raises\n`NotFoundException`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceLinksByMediaSourceLink"
      },
      "put": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceLinkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMediaSourceLinkRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMediaSourceLinkRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateMediaSourceLinkRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "143af6df-48c4-43d5-a890-fd0e8f932df6",
                        "name": "North Gate Camera",
                        "isActive": true,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "mediaSourceIds": [
                          "953612c5-c40c-4797-aaee-0e7949991439",
                          "8cd40180-3dca-473f-a688-c1af9ed3f2a5"
                        ],
                        "configs": [
                          {
                            "id": "1ada4bd3-f2a3-411c-a5c6-fb756d3bc816",
                            "type": 1,
                            "config": {
                              "ad55c": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "Lorem2": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "eiusmod897": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              }
                            },
                            "isActive": true
                          },
                          {
                            "id": "1b8e7957-9db3-4f22-a79c-695fa535a381",
                            "type": 1,
                            "config": {
                              "Lorema": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "Excepteur_2": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "pariatur_3": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "pariatur1e": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              },
                              "sed_4c": {
                                "options": {},
                                "parent": {},
                                "root": {}
                              }
                            },
                            "isActive": true
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a media-source link",
        "description": "Full replacement of the link itself - endpoints, direction, name. Its\nmodule configurations are managed separately through `/configs`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putMediasourceLinksByMediaSourceLink"
      }
    },
    "/api/configuration/basic/mediasource-links/{mediaSourceLinkId}/configs": {
      "put": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceLinkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSaveMediaSourceLinkConfigRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSaveMediaSourceLinkConfigRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/BulkSaveMediaSourceLinkConfigRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkConfigDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "51308479-0631-49d2-ac9f-ddd4affd8d22",
                          "type": 1,
                          "config": {
                            "elit63": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            },
                            "Excepteur_0": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            },
                            "aliqua9d": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            },
                            "cupidatatb80": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            },
                            "incididunt93": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            },
                            "esse71": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            },
                            "sitc78": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            }
                          },
                          "isActive": false
                        },
                        {
                          "id": "42be06f7-018a-4e26-a382-d3d84cf8afc5",
                          "type": 1,
                          "config": {
                            "sint9": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            },
                            "minim7c5": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            },
                            "quif": {
                              "options": {},
                              "parent": {},
                              "root": {}
                            }
                          },
                          "isActive": false
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkConfigDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceLinkConfigDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Replace a link's module configurations",
        "description": "Bulk replace, not a merge: the body is the complete set of configurations\nfor this link, and the response is the set as stored.\n\n`409` means a configuration conflicts with one already on the link - the\nsame module configured twice, typically.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `409` | `Prefer: code=409` | Conflict |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putMediasourceLinksByMediaSourceLinkConfigs"
      }
    },
    "/api/configuration/basic/mediasource-links/{mediaSourceLinkId}/configs/{mediaSourceLinkConfigId}": {
      "delete": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceLinkId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "mediaSourceLinkConfigId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete one link configuration",
        "description": "Removes a single module configuration from a link, leaving the link\nitself in place.\n\nAs with the bulk link delete, the action can return **`304`** when\nnothing was removed even though the spec does not declare it.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteMediasourceLinksByMediaSourceLinkConfigsByMediaSourceLinkConfig"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/streaming/start": {
      "post": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "culpa sint quis cillum",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Start MediaMTX streaming for a media source",
        "description": "Returns the playback URL as a **string in `data`** - hand it to the\nplayer. This is what a live view calls before it can show anything.\n\nA failure to start is reported as **`500`** with `Failed to start\nMediaMtx streaming ... {id}`, not a `4xx`: the controller treats an empty\nURL as a server-side failure.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceByMediaSourceStreamingStart"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/streaming/stop": {
      "post": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "forceStop",
            "in": "query",
            "required": true,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Stop MediaMTX streaming for a media source",
        "description": "**`forceStop` is a required query parameter** (`[BindRequired]`) and it\ndecides the policy:\n\n| `forceStop` | Policy | Effect |\n| --- | --- | --- |\n| `false` | `RespectActiveViewers` | the stream stays up if anyone else is watching |\n| `true` | `Force` | the stream is torn down regardless |\n\nSend `false` when a single viewer closes a tile; `true` only for\nadministrative teardown. A failure to stop is reported as `500`, not a\n`4xx`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceByMediaSourceStreamingStop"
      }
    },
    "/api/configuration/basic/mediasource/snapshot/{providerMediaSourceId}": {
      "get": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "providerMediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "forceNewSnapshot",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a still snapshot from a media source",
        "description": "Note the identifier: this takes the **provider's** media-source id (a\nstring from the camera system), not the platform `DbId` every other\nendpoint here uses.\n\n`forceNewSnapshot=true` pulls a fresh frame from the camera instead of\nserving the cached one - slower, and it fails if the camera is offline.\n\nThe image comes back **base64-encoded inside `data`**, not as a binary\nbody. Two outcomes are not in the spec: an empty snapshot returns\n**`204` with an empty body**, and a null snapshot returns `200` with\n`data: null`. Check both before decoding.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceSnapshotByProviderMediaSource"
      }
    },
    "/api/configuration/basic/mediasource/group/{mediaSourceGroupId}/permission": {
      "post": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceGroupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaSourceGroupPermissionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaSourceGroupPermissionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MediaSourceGroupPermissionRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Grant media-source-group permissions",
        "description": "Permissions attach to the group, never to an individual media source -\nthe same model as watchlist groups. A rejection is `400` with the reason\nin `message`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceGroupByMediaSourceGroupPermission"
      },
      "get": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceGroupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupPermissionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "acea5197-96b9-4d71-af95-050335cef5eb",
                          "userId": "7d25523c-e125-4ac4-a984-2115bf5d7955",
                          "permissionId": "12cfa787-43d9-4109-a9e0-dfde8501b48b"
                        },
                        {
                          "id": "8a1de48a-1067-46c5-ae5b-56b66da3f3c3",
                          "userId": "e427f1c9-1003-46df-ac61-3e60816c48f7",
                          "permissionId": "7c056a82-d9e5-4f56-a839-5701db486966"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupPermissionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceGroupPermissionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List a media-source group's permissions",
        "description": "Who can see and edit the media sources in this group. This is what a\n`403` on any media-source endpoint traces back to.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceGroupByMediaSourceGroupPermission"
      },
      "patch": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceGroupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaSourceGroupPermissionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/MediaSourceGroupPermissionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/MediaSourceGroupPermissionRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update media-source-group permissions",
        "description": "`200`/`data: true`, or `400` with the reason in `message`. Unlike most\nPATCH endpoints here this one does not return `304` - it uses\n`BuildOkOrBadResponse`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchMediasourceGroupByMediaSourceGroupPermission"
      }
    },
    "/api/configuration/basic/mediasource/group/{mediaSourceGroupId}/permission/{permissionId}": {
      "delete": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceGroupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "permissionId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Revoke one media-source-group permission",
        "description": "Both ids are in the path and both are `[NotEmptyGuid]`-checked. Prefer\nthe bulk form below when revoking several.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteMediasourceGroupByMediaSourceGroupPermissionByPermission"
      }
    },
    "/api/configuration/basic/mediasource/group/{mediaSourceGroupId}/permissions": {
      "delete": {
        "tags": [
          "MediaSource"
        ],
        "parameters": [
          {
            "name": "mediaSourceGroupId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Revoke several media-source-group permissions",
        "description": "Note the plural path segment - this is a different endpoint from the\nsingle `permission/{permissionId}` above. Permission ids travel in the\n**body** of the `DELETE`, validated by `[NotEmptyGuidList]`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteMediasourceGroupByMediaSourceGroupPermissions"
      }
    },
    "/api/configuration/basic/mediasource-provider/events/{mediaSourceProviderType}": {
      "get": {
        "tags": [
          "MediaSourceProvider"
        ],
        "parameters": [
          {
            "name": "mediaSourceProviderType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/MediaSourceProviderType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EventTypeResponseDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "displayName": "Parking Level 2",
                          "id": "df6002f2-aa53-41d9-a126-0b6780838135",
                          "name": "Loading Bay 3",
                          "lastModified": "2026-07-27T09:14:33Z",
                          "description": "North Gate Camera"
                        },
                        {
                          "displayName": "Loading Bay 3",
                          "id": "5b82c3ce-b5ec-45a1-ab44-e77dae9b79d3",
                          "name": "North Gate Camera",
                          "lastModified": "2026-07-27T09:14:33Z",
                          "description": "North Gate Camera"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EventTypeResponseDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EventTypeResponseDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the event types a provider can emit",
        "description": "The provider's event vocabulary, for building alarm and event\ndefinitions. The parameter is nullable - omit it to get every provider's\nevents.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceProviderEventsByMediaSourceProviderType"
      }
    },
    "/api/configuration/basic/mediasource-provider": {
      "get": {
        "tags": [
          "MediaSourceProvider"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceProviderDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "hostUri": "rtsp://10.0.4.21:554/stream1",
                        "authUri": "rtsp://10.0.4.21:554/stream1",
                        "username": "North Gate Camera",
                        "password": "dolore est",
                        "authorization": 1,
                        "providerType": 0
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceProviderDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceProviderDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get the configured media-source provider",
        "description": "Which camera integration this installation runs - Onvif, Milestone,\nDahua, Hikvision and so on. On the license bypass list, so it answers on\nan unlicensed system.\n\nRead this before calling anything that takes a `mediaSourceProviderType`:\nthe enum has more values than any one installation supports.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceProvider"
      }
    },
    "/api/configuration/basic/mediasource-provider/mediasource/{mediaSourceProviderType}": {
      "delete": {
        "tags": [
          "MediaSourceProvider"
        ],
        "parameters": [
          {
            "name": "mediaSourceProviderType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/MediaSourceProviderType"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete media sources at the provider",
        "description": "Deletes at the **provider**, not just in the platform - the\n`providerMediaSourceIds` in the body are the provider's own string ids.\n\n**Only Onvif supports this.** Any other provider type returns `400` with\n`Provider type '<type>' does not support external media source\ndeletion.`, checked before the facade is called.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteMediasourceProviderMediasourceByMediaSourceProviderType"
      }
    },
    "/api/configuration/basic/mediasource/registry": {
      "post": {
        "tags": [
          "MediaSourceRegistry"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddMediaSourceRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AddMediaSourceRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AddMediaSourceRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Register a media source",
        "description": "Brings a camera under management. `409` means it is already registered;\n`400` with `Failed to register media source` means the facade refused it.\n\nDiscover what is available to register with\n`GET /api/configuration/basic/mediasource/registry`, filtered by\nprovider.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `409` | `Prefer: code=409` | Conflict |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceRegistry"
      },
      "get": {
        "tags": [
          "MediaSourceRegistry"
        ],
        "parameters": [
          {
            "name": "providerType",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/MediaSourceProviderType"
            }
          },
          {
            "name": "serverId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ProviderMediaSourceResponseDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "name": "North Gate Camera",
                          "id": "veniam quis ut eu commodo",
                          "mediaSourceIp": "10.0.4.21",
                          "mediaSourcePort": 554
                        },
                        {
                          "name": "Loading Bay 3",
                          "id": "est enim sunt nulla incididunt",
                          "mediaSourceIp": "10.0.4.21",
                          "mediaSourcePort": 554
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ProviderMediaSourceResponseDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ProviderMediaSourceResponseDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List a provider's media sources",
        "description": "Lists what a provider exposes, optionally narrowed to one server with\n`serverId`. `providerType` selects the integration - see\n`GET /api/configuration/basic/mediasource-provider` for the values this\ninstallation supports.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceRegistry"
      },
      "patch": {
        "tags": [
          "MediaSourceRegistry"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/EditMediaSourceRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/EditMediaSourceRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/EditMediaSourceRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a registered media source",
        "description": "Registration-level fields - credentials, address, provider identity - not\nthe operational configuration under `/mediasource/{id}/config`.\n\n`304` with an empty body means nothing changed.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchMediasourceRegistry"
      },
      "delete": {
        "tags": [
          "MediaSourceRegistry"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Unregister media sources",
        "description": "Removes cameras from management. Ids travel in the body, validated by\n`[NotEmptyGuidList]`. `304` means nothing was removed.\n\nThis is a platform-side removal. To delete the source at the provider\nitself use\n`DELETE /api/configuration/basic/mediasource-provider/mediasource/{mediaSourceProviderType}`,\nwhich only Onvif supports.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteMediasourceRegistry"
      }
    },
    "/api/configuration/basic/mediasource/registry/sync-assigned-mediasources": {
      "post": {
        "tags": [
          "MediaSourceRegistry"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SyncAssignedMediaSourcesRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/SyncAssignedMediaSourcesRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/SyncAssignedMediaSourcesRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SyncAssignedMediaSourcesResponseDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "assignedCount": 377,
                        "providerCount": 107,
                        "matchedCount": 380,
                        "updatedCount": 455,
                        "unchangedCount": 307,
                        "unmatchedCount": 465
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SyncAssignedMediaSourcesResponseDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SyncAssignedMediaSourcesResponseDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Reconcile assigned media sources with a provider",
        "description": "Re-reads the provider and reconciles the platform's view of which sources\nare assigned to which server. The response reports what the sync changed,\nso read `data` rather than assuming the `200` means \"no drift\".\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceRegistrySyncAssignedMediasources"
      }
    },
    "/api/configuration/basic/mediasource-module/defaults": {
      "get": {
        "tags": [
          "Module"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ModuleDefaultsDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "face": {
                          "active": true,
                          "maskZones": [
                            {
                              "id": "bb16d331-dfd7-4610-af0f-fc8254947d6c",
                              "name": "North Gate Camera",
                              "zoneMode": 1,
                              "cmPerPixelRatio": 11.57,
                              "anchors": [
                                {
                                  "ratioX": 9.17,
                                  "ratioY": 74.29
                                },
                                {
                                  "ratioX": 35.56,
                                  "ratioY": 60.94
                                }
                              ]
                            },
                            {
                              "id": "220dae52-71a3-4c8c-ad94-3fd8b24baa1f",
                              "name": "Parking Level 2",
                              "zoneMode": 1,
                              "cmPerPixelRatio": 47.93,
                              "anchors": [
                                {
                                  "ratioX": 13.98,
                                  "ratioY": 57.46
                                },
                                {
                                  "ratioX": 35.54,
                                  "ratioY": 85.86
                                }
                              ]
                            }
                          ],
                          "useGpu": false,
                          "height": 29.12,
                          "width": 41.26,
                          "personDetectionsConfidence": 88,
                          "detectionConfidence": 0.93,
                          "yawThreshold": 24.11,
                          "sharpnessConfidence": 0.75,
                          "pitchThreshold": 3.11,
                          "excludeBlackBorders": false,
                          "excludeNotAlive": true,
                          "saveUnknownFaces": false,
                          "recognitionConfidenceThreshold": 17.99,
                          "faceDeviceType": 1,
                          "faceDeviceConfiguration": "Lorem labore ut ipsum"
                        },
                        "ppe": {
                          "active": false,
                          "maskZones": [
                            {
                              "id": "543d0cd9-e3ac-4673-abcf-26a7c97e126c",
                              "name": "Lobby Entrance",
                              "zoneMode": 1,
                              "cmPerPixelRatio": 96.41,
                              "anchors": [
                                {
                                  "ratioX": 60.4,
                                  "ratioY": 90.31
                                },
                                {
                                  "ratioX": 52.31,
                                  "ratioY": 51.97
                                }
                              ]
                            },
                            {
                              "id": "44573f68-7474-4b40-a5bd-7a3479516d63",
                              "name": "North Gate Camera",
                              "zoneMode": 1,
                              "cmPerPixelRatio": 61.61,
                              "anchors": [
                                {
                                  "ratioX": 67.54,
                                  "ratioY": 25.75
                                },
                                {
                                  "ratioX": 54.62,
                                  "ratioY": 25.01
                                }
                              ]
                            }
                          ],
                          "maximumWidth": 738,
                          "maximumHeight": 26,
                          "minimumWidth": 815,
                          "minimumHeight": 820,
                          "providerEventId": "sint",
                          "modelConfigurations": {
                            "Food": {
                              "acceptedClassDictionary": {
                                "ex3": 569,
                                "Duis906": 260,
                                "Ut_6": 151
                              },
                              "cooldown": 416,
                              "frameSample": 706
                            },
                            "Industrial": {
                              "acceptedClassDictionary": {
                                "sit_95": 548,
                                "reprehenderit_9e9": 177,
                                "voluptate__b": 483,
                                "sint_6d7": 779,
                                "sit_01": 567,
                                "adipisicing_2c4": 350,
                                "enim_a": 3,
                                "sit_26": 764
                              },
                              "cooldown": 281,
                              "frameSample": 9
                            },
                            "Medical": {
                              "acceptedClassDictionary": {
                                "dolore_720": 211,
                                "irure_4": 993
                              },
                              "cooldown": 175,
                              "frameSample": 265
                            }
                          }
                        },
                        "perimeter": {
                          "active": true,
                          "maskZones": [
                            {
                              "id": "db5f11a9-f5a5-4473-ab58-fcd6e88a9f8a",
                              "name": "Parking Level 2",
                              "zoneMode": 1,
                              "cmPerPixelRatio": 69.61,
                              "anchors": [
                                {
                                  "ratioX": 84.48,
                                  "ratioY": 10.81
                                },
                                {
                                  "ratioX": 65,
                                  "ratioY": 71.88
                                }
                              ]
                            }
                          ],
                          "acceptedClasses": [
                            "labore commodo id veniam",
                            "qui laborum adipisicing sed amet"
                          ],
                          "includeTopLeft": false,
                          "includeTopRight": false,
                          "includeBottomLeft": true,
                          "includeBottomRight": false,
                          "includeCenter": false,
                          "providerEventId": "culpa sunt aliqua",
                          "coolDownSeconds": 999
                        },
                        "fireSmoke": {
                          "active": true,
                          "maskZones": [],
                          "smokeConfidenceThreshold": 231,
                          "fireConfidenceThreshold": 777,
                          "cooldown": 857,
                          "providerEventId": "consectetur laborum exercitation sint reprehenderit",
                          "minConsecutiveFrames": 891,
                          "locationTolerancePixels": 303,
                          "validationFrameWindow": 456,
                          "smokeMinConfidence": 0.88,
                          "fireMinConfidence": 0.88
                        },
                        "suddenStop": {
                          "active": true,
                          "maskZones": [],
                          "providerEventId": "sit aliquip",
                          "configurationMode": 0,
                          "scenario": 0,
                          "sensitivity": 0,
                          "detectionMode": 0,
                          "minSpeedPixelsPerSecond": 94.63,
                          "maxCurrentSpeedForAlarmPxPerSec": 3.21,
                          "minSpeedDropPercentOfReferenceSpeed": 89.15,
                          "maxSampleDisplacementBoxDiagonalMultiplier": 42.28,
                          "requiredDecelerationForAlarmPxPerSec2": 68.7,
                          "stationarySpeedThresholdPxPerSec": 85.77,
                          "speedEstimationWindowFrames": 640,
                          "speedChangeWindowFrames": 680,
                          "minConsecutiveStrongBrakingFrames": 590,
                          "stationaryDurationSeconds": 47.35,
                          "minTrackObservationSeconds": 68.79,
                          "eventCooldownSeconds": 98.68
                        },
                        "movementAnalysis": {
                          "active": false,
                          "maskZones": [
                            {
                              "id": "82e93a21-aabf-443e-afbe-c8d62a6cdcf9",
                              "name": "Loading Bay 3",
                              "zoneMode": 0,
                              "cmPerPixelRatio": 92.77,
                              "anchors": [
                                {
                                  "ratioX": 97.43,
                                  "ratioY": 76.48
                                },
                                {
                                  "ratioX": 12.59,
                                  "ratioY": 97.06
                                }
                              ],
                              "allowedObjectTypes": [
                                "consequat",
                                "aliquip"
                              ],
                              "allowedZoneDirection": 0,
                              "lineAnchors": [
                                {
                                  "ratioX": 63.07,
                                  "ratioY": 65.34
                                },
                                {
                                  "ratioX": 99.2,
                                  "ratioY": 29.23
                                }
                              ],
                              "deviationAngle": 44.69,
                              "cooldown": 76,
                              "mode": 0,
                              "suddenStopConfigurationMode": 1,
                              "suddenStopScenario": 2,
                              "suddenStopSensitivity": 0,
                              "suddenStopDetectionMode": 0,
                              "suddenStopMinSpeedPixelsPerSecond": 5.08,
                              "suddenStopMaxCurrentSpeedForAlarmPxPerSec": 79.25,
                              "suddenStopMinSpeedDropPercentOfReferenceSpeed": 79.32,
                              "suddenStopMaxSampleDisplacementBoxDiagonalMultiplier": 82.62,
                              "suddenStopRequiredDecelerationForAlarmPxPerSec2": 95.01,
                              "suddenStopStationarySpeedThresholdPxPerSec": 89.72,
                              "suddenStopSpeedEstimationWindowFrames": 679,
                              "suddenStopSpeedChangeWindowFrames": 556,
                              "suddenStopMinConsecutiveStrongBrakingFrames": 439,
                              "suddenStopStationaryDurationSeconds": 78.87,
                              "suddenStopMinTrackObservationSeconds": 91.48,
                              "suddenStopEventCooldownSeconds": 10.87
                            },
                            {
                              "id": "58f29c44-856e-4dd2-a878-cad2c689c924",
                              "name": "Loading Bay 3",
                              "zoneMode": 0,
                              "cmPerPixelRatio": 2.79,
                              "anchors": [
                                {
                                  "ratioX": 12.4,
                                  "ratioY": 64.94
                                },
                                {
                                  "ratioX": 62.23,
                                  "ratioY": 88.58
                                }
                              ],
                              "allowedObjectTypes": [
                                "tempor in elit ullamco",
                                "sit"
                              ],
                              "allowedZoneDirection": 2,
                              "lineAnchors": [
                                {
                                  "ratioX": 33.07,
                                  "ratioY": 74.38
                                },
                                {
                                  "ratioX": 41.47,
                                  "ratioY": 99.5
                                }
                              ],
                              "deviationAngle": 30.89,
                              "cooldown": 265,
                              "mode": 1,
                              "suddenStopConfigurationMode": 1,
                              "suddenStopScenario": 0,
                              "suddenStopSensitivity": 1,
                              "suddenStopDetectionMode": 0,
                              "suddenStopMinSpeedPixelsPerSecond": 21.45,
                              "suddenStopMaxCurrentSpeedForAlarmPxPerSec": 39.45,
                              "suddenStopMinSpeedDropPercentOfReferenceSpeed": 26.62,
                              "suddenStopMaxSampleDisplacementBoxDiagonalMultiplier": 10.64,
                              "suddenStopRequiredDecelerationForAlarmPxPerSec2": 98.79,
                              "suddenStopStationarySpeedThresholdPxPerSec": 92.02,
                              "suddenStopSpeedEstimationWindowFrames": 924,
                              "suddenStopSpeedChangeWindowFrames": 733,
                              "suddenStopMinConsecutiveStrongBrakingFrames": 836,
                              "suddenStopStationaryDurationSeconds": 51.93,
                              "suddenStopMinTrackObservationSeconds": 53.31,
                              "suddenStopEventCooldownSeconds": 98.69
                            }
                          ],
                          "providerEventId": "ipsum magna cillum"
                        },
                        "missingLeft": {
                          "active": true,
                          "maskZones": [],
                          "alarmThresholdSeconds": 720,
                          "calibrationTimeSeconds": 237,
                          "minWidthRatio": 42.15,
                          "maxWidthRatio": 41.65,
                          "compressionLevel": 3,
                          "pixelVariationThreshold": 878,
                          "autoRecalibrateEnabled": false,
                          "autoRecalibrateThreshold": 92.02,
                          "autoRecalibrateDelaySeconds": 648,
                          "providerEventId": "in"
                        },
                        "accr": {
                          "active": true,
                          "maskZones": [],
                          "minimumCharacterCount": 259,
                          "maximumCharacterCount": 4,
                          "providerEventId": "cupidatat aliquip eiusmod nisi adipisicing"
                        },
                        "anpr": {
                          "active": false,
                          "maskZones": [],
                          "mediaSourceDirection": 797,
                          "anprDeviceType": 0,
                          "anprMode": 0,
                          "integrationMode": 2,
                          "anprDeviceConfiguration": "ea ullamco eiusmod",
                          "plateHeight": 313,
                          "plateWidth": 536,
                          "frameWidth": 331,
                          "frameHeight": 559,
                          "minNumberOfCharacters": 438,
                          "maxNumberOfCharacters": 211,
                          "compression": 49
                        },
                        "pedestrianZoneDefaults": {
                          "id": "1831f343-ee37-49d4-a82b-1438e70fdf49",
                          "name": "Lobby Entrance",
                          "zoneMode": 1,
                          "cmPerPixelRatio": 48.11,
                          "anchors": [],
                          "cooldownSeconds": 371,
                          "confirmationDurationSeconds": 40.77,
                          "minZoneContainmentRatio": 49.66,
                          "enableBufferZone": true,
                          "bufferBehaviorMode": 1,
                          "edgeBuffers": [
                            {
                              "edgeIndex": 634,
                              "isBuffered": true,
                              "bufferDepthPixels": 50.67
                            },
                            {
                              "edgeIndex": 131,
                              "isBuffered": true,
                              "bufferDepthPixels": 6.69
                            }
                          ]
                        },
                        "occupancyZoneDefaults": {
                          "id": "02474b29-ac1c-41f6-afdb-5dfff12728a3",
                          "name": "Parking Level 2",
                          "zoneMode": 0,
                          "cmPerPixelRatio": 97.56,
                          "anchors": [],
                          "providerEventId": "laborum anim",
                          "occupancyType": 0,
                          "toleranceRate": 191,
                          "usePercentages": false,
                          "aboveThresholdValue": 581,
                          "sendAboveThresholdAlarm": true,
                          "belowThresholdValue": 212,
                          "sendBelowThresholdAlarm": false,
                          "processingIntervalSeconds": 345
                        },
                        "countingZoneDefaults": {
                          "id": "63b8d915-8752-4094-a088-d19c18a68f43",
                          "name": "Perimeter West",
                          "zoneMode": 0,
                          "cmPerPixelRatio": 65.69,
                          "anchors": [],
                          "allowedObjectTypes": [
                            "nisi aliquip labore",
                            "ut in commodo"
                          ],
                          "lineAnchors": [],
                          "allowedLineDirections": [
                            1,
                            0
                          ],
                          "cooldown": 824,
                          "mode": 0,
                          "advancedIdentitySource": 0,
                          "advancedScopeMediaSourceGroupId": "32259b5d-6362-42ce-ab06-bdd5389d07d1"
                        },
                        "movementAnalysisZoneDefaults": {
                          "id": "7d476896-a6bf-4216-a118-fe59c4021967",
                          "name": "Lobby Entrance",
                          "zoneMode": 0,
                          "cmPerPixelRatio": 57.19,
                          "anchors": [],
                          "allowedObjectTypes": [
                            "tempor exercitation cillum aliqua nisi",
                            "cillum"
                          ],
                          "allowedZoneDirection": 3,
                          "lineAnchors": [],
                          "deviationAngle": 57.83,
                          "cooldown": 961,
                          "mode": 0,
                          "suddenStopConfigurationMode": 1,
                          "suddenStopScenario": 2,
                          "suddenStopSensitivity": 1,
                          "suddenStopDetectionMode": 0,
                          "suddenStopMinSpeedPixelsPerSecond": 48.9,
                          "suddenStopMaxCurrentSpeedForAlarmPxPerSec": 15.77,
                          "suddenStopMinSpeedDropPercentOfReferenceSpeed": 4.51,
                          "suddenStopMaxSampleDisplacementBoxDiagonalMultiplier": 98.91,
                          "suddenStopRequiredDecelerationForAlarmPxPerSec2": 21.32,
                          "suddenStopStationarySpeedThresholdPxPerSec": 46.32,
                          "suddenStopSpeedEstimationWindowFrames": 826,
                          "suddenStopSpeedChangeWindowFrames": 787,
                          "suddenStopMinConsecutiveStrongBrakingFrames": 485,
                          "suddenStopStationaryDurationSeconds": 53.57,
                          "suddenStopMinTrackObservationSeconds": 1.89,
                          "suddenStopEventCooldownSeconds": 60.25
                        }
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ModuleDefaultsDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ModuleDefaultsDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get default module configuration",
        "description": "The factory defaults for every module, keyed by module. Use it to seed a\nconfiguration form so the user starts from something valid rather than\nempty.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceModuleDefaults"
      }
    },
    "/api/configuration/basic/mediasource-module/{mediaSourceId}/mediasource-config": {
      "get": {
        "tags": [
          "Module"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ZenModuleMediaSourceModuleConfigurationDtoDictionary"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "HeatMap": {
                          "mediaSourceModuleId": "5526c749-a738-4eec-a4bb-e6f1d9571af8",
                          "mediaSourceId": "8f5c5084-e51c-4d3e-a7cc-b0a58d638dd6",
                          "module": 107,
                          "config": "fugiat",
                          "isActive": false
                        },
                        "CrowdDensity": {
                          "mediaSourceModuleId": "8a9592d5-adf3-4dd5-ad90-28ab69b157ee",
                          "mediaSourceId": "9b1aba93-1838-4529-a1f9-6de47b2a0058",
                          "module": 303,
                          "config": "dolor magna mollit dolore ipsum",
                          "isActive": false
                        },
                        "TrafficDensity": {
                          "mediaSourceModuleId": "53a6a40c-7a21-4c0a-a073-7e077675f92f",
                          "mediaSourceId": "0f8c829f-1509-497a-ac70-3d90c6984c5c",
                          "module": 202,
                          "config": "quis aliqua minim",
                          "isActive": true
                        },
                        "VehicleCountCategorization": {
                          "mediaSourceModuleId": "816eafe9-731e-46ec-a8bb-b1e558367d0c",
                          "mediaSourceId": "3449c5ef-997d-43f0-ae1f-29434695492d",
                          "module": 103,
                          "config": "fugiat exercitation velit qui reprehenderit",
                          "isActive": true
                        },
                        "Occupancy": {
                          "mediaSourceModuleId": "40b9cc21-603c-4658-a0a3-281c908b6123",
                          "mediaSourceId": "70fe12f5-5c76-438c-a8a1-e0d4541a4924",
                          "module": 107,
                          "config": "consequat nostrud velit",
                          "isActive": true
                        },
                        "FireSmokeDetection": {
                          "mediaSourceModuleId": "cc15874e-54ff-4b51-a409-f2873fe6a85f",
                          "mediaSourceId": "9e5d86f5-adee-48b1-a56f-abc423af7690",
                          "module": 301,
                          "config": "dolor consectetur eiusmod anim do",
                          "isActive": false
                        },
                        "MissingLeft": {
                          "mediaSourceModuleId": "7b29241f-1b9a-4092-a935-5bf1f96a2e72",
                          "mediaSourceId": "a6ae35e8-cb09-471c-a4c8-e3de456eff7f",
                          "module": 110,
                          "config": "ipsum deserunt",
                          "isActive": true
                        },
                        "SlipAndFall": {
                          "mediaSourceModuleId": "44c5dc1e-af3c-4b24-a0c1-b96f2203a0f5",
                          "mediaSourceId": "a02d9138-ca1d-401a-acfa-117b64413395",
                          "module": 2,
                          "config": "sit dolor qui et",
                          "isActive": true
                        },
                        "PersonalProtectiveEquipment": {
                          "mediaSourceModuleId": "978790de-4d54-4672-a9da-4377632ea0a2",
                          "mediaSourceId": "87ce076c-38c9-4ed8-a75f-f9a2d0377140",
                          "module": 1,
                          "config": "commodo do officia",
                          "isActive": true
                        },
                        "LoiteringMonitoring": {
                          "mediaSourceModuleId": "005d70d4-c265-42c6-a3e5-24b2baa6a575",
                          "mediaSourceId": "e7b23277-841e-4505-aedf-4de8eb837137",
                          "module": 101,
                          "config": "Lorem non",
                          "isActive": true
                        },
                        "PerimeterMonitoring": {
                          "mediaSourceModuleId": "b02dc072-a5a0-4de9-a0a2-de9c9538580b",
                          "mediaSourceId": "d2e7c0d1-f2c5-4df0-ad3a-5e3b7e9bfb93",
                          "module": 204,
                          "config": "dolor Duis dolor",
                          "isActive": true
                        },
                        "TripwireTriggeredMonitoring": {
                          "mediaSourceModuleId": "37506dde-b771-4148-a794-04b18bd41e63",
                          "mediaSourceId": "f87c04b3-342b-4e4c-a1e1-712fd839f466",
                          "module": 106,
                          "config": "anim eu dolor sunt",
                          "isActive": true
                        },
                        "SpeedDetection": {
                          "mediaSourceModuleId": "3347c41e-c489-48ed-acaa-7b79bcd13806",
                          "mediaSourceId": "7f5b9908-def5-4e92-a66f-7c336a2d8ce6",
                          "module": 6,
                          "config": "sunt ut",
                          "isActive": false
                        },
                        "MovementAnalysis": {
                          "mediaSourceModuleId": "bbc7eda7-0684-4d19-a77c-230dd807944d",
                          "mediaSourceId": "3b71bba9-d8ef-428b-a5dc-03e6f36ffd5a",
                          "module": 1,
                          "config": "dolore nostrud velit laborum ullamco",
                          "isActive": false
                        },
                        "Counting": {
                          "mediaSourceModuleId": "c4a352e4-da57-4ab2-a924-fd3a43dced53",
                          "mediaSourceId": "20dc6c45-d4ef-44ce-a23b-d3e9a2ed5e43",
                          "module": 303,
                          "config": "dolor laborum",
                          "isActive": false
                        },
                        "IllegalParking": {
                          "mediaSourceModuleId": "36b0fca8-8625-41ad-a5dc-32aa33b9ead9",
                          "mediaSourceId": "ae958bf0-e171-407a-a0e7-789d74ee62e1",
                          "module": 5,
                          "config": "ex et reprehenderit qui",
                          "isActive": false
                        },
                        "FaceRecognition": {
                          "mediaSourceModuleId": "4b85998d-6f9c-40ef-aeb7-9bb43bd33a15",
                          "mediaSourceId": "1285f124-f382-48c7-aac9-e8c05763a60d",
                          "module": 3,
                          "config": "quis sit laboris",
                          "isActive": false
                        },
                        "AuthorizedParking": {
                          "mediaSourceModuleId": "2c024d90-9a99-4b77-aa31-923e990babd9",
                          "mediaSourceId": "f7ae7994-8e17-4100-a288-8fd759d41754",
                          "module": 104,
                          "config": "quis incididunt laborum eu Duis",
                          "isActive": false
                        },
                        "AutomaticContainerCodeRecognition": {
                          "mediaSourceModuleId": "4d4f1305-92a7-40b2-a877-76991f5980cc",
                          "mediaSourceId": "9bb259dd-338c-40ac-ab2e-2cb52d4420f6",
                          "module": 304,
                          "config": "dolor laborum do amet exercitation",
                          "isActive": true
                        },
                        "AutomaticNumberPlateRecognition": {
                          "mediaSourceModuleId": "3cfa7c17-6c0d-44e0-aa66-463d838d18d2",
                          "mediaSourceId": "8c5aab0c-c318-4f91-a0f4-0dc1343f094f",
                          "module": 5,
                          "config": "laboris cillum occaecat enim eiusmod",
                          "isActive": true
                        },
                        "PedestrianDetection": {
                          "mediaSourceModuleId": "cec5c0db-9743-40b9-acb8-dabce505eeaf",
                          "mediaSourceId": "fb7376f1-645d-479f-aeff-c5357c10d1b9",
                          "module": 204,
                          "config": "aute incididunt non ut",
                          "isActive": true
                        },
                        "VehicleMakeModelRecognition": {
                          "mediaSourceModuleId": "6b83cbb6-b25c-4780-ac39-c1a67d9be20d",
                          "mediaSourceId": "3122c5e9-a71c-421a-a337-0fc072cc6517",
                          "module": 102,
                          "config": "eu",
                          "isActive": true
                        },
                        "ObjectDetectionClassification": {
                          "mediaSourceModuleId": "a60749e0-9ed6-4e7b-a5ca-04629ff7eccf",
                          "mediaSourceId": "bb972185-e354-45ee-a095-ab739ba49791",
                          "module": -1,
                          "config": "exercitation aliquip adipisicing dolor",
                          "isActive": true
                        },
                        "PrivacyRemove": {
                          "mediaSourceModuleId": "c9ad501b-ff6b-4d31-a681-6f85177fb39d",
                          "mediaSourceId": "7756cdd4-9fce-4ff0-af9f-207434707a12",
                          "module": 301,
                          "config": "ad occaecat",
                          "isActive": true
                        },
                        "Events": {
                          "mediaSourceModuleId": "e8da98f9-1108-4099-ab4b-469e930af168",
                          "mediaSourceId": "088695ac-5251-4f63-a995-3638b0fb217b",
                          "module": 6,
                          "config": "in",
                          "isActive": true
                        }
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ZenModuleMediaSourceModuleConfigurationDtoDictionary"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ZenModuleMediaSourceModuleConfigurationDtoDictionary"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get all module configurations for a media source",
        "description": "Returns a **dictionary keyed by module name** - not an array. The same\naction serves the single-module route below; omitting `module` is what\ngets you all of them.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceModuleByMediaSourceMediasourceConfig"
      }
    },
    "/api/configuration/basic/mediasource-module/{module}/{mediaSourceId}/mediasource-config": {
      "get": {
        "tags": [
          "Module"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "module",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/ZenModule"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ZenModuleMediaSourceModuleConfigurationDtoDictionary"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "HeatMap": {
                          "mediaSourceModuleId": "c6fd3b71-938f-44cc-acd4-adee666b1b71",
                          "mediaSourceId": "bf04e7e7-44b3-45fe-aae9-55c38c2c00d4",
                          "module": 204,
                          "config": "esse et ullamco sed ea",
                          "isActive": false
                        },
                        "CrowdDensity": {
                          "mediaSourceModuleId": "64a54468-0e80-46ad-a47c-5d174c0bac34",
                          "mediaSourceId": "a3f7db4a-86b3-4120-a715-3763dd10e6fd",
                          "module": 204,
                          "config": "proident",
                          "isActive": false
                        },
                        "TrafficDensity": {
                          "mediaSourceModuleId": "410e31a6-6b37-497d-a97c-ff8590109985",
                          "mediaSourceId": "99659f3d-31a7-43bb-ab21-3a78808ff79d",
                          "module": 1,
                          "config": "sed mollit",
                          "isActive": false
                        },
                        "VehicleCountCategorization": {
                          "mediaSourceModuleId": "3ff3d4fb-4995-4293-a047-0a5a7fa69ca5",
                          "mediaSourceId": "716f5c8d-0fd6-462d-a209-c69ecf981415",
                          "module": 108,
                          "config": "minim sint eu id",
                          "isActive": true
                        },
                        "Occupancy": {
                          "mediaSourceModuleId": "2d4269d0-7220-41eb-a0c7-09ad6e7c53c7",
                          "mediaSourceId": "e537c013-3329-49d1-a1dc-819075b5b88f",
                          "module": 304,
                          "config": "ut pariatur veniam Ut",
                          "isActive": true
                        },
                        "FireSmokeDetection": {
                          "mediaSourceModuleId": "723cdc0e-c664-4489-acd4-c1e167e55ef3",
                          "mediaSourceId": "cfbd16d9-1eec-465d-a9e2-0cc801d6fb65",
                          "module": 204,
                          "config": "reprehenderit eiusmod in irure",
                          "isActive": false
                        },
                        "MissingLeft": {
                          "mediaSourceModuleId": "c679f83a-002d-499c-a305-709ef3b9c672",
                          "mediaSourceId": "0685cc4f-65f4-4c86-a0fa-7789d238137b",
                          "module": 2,
                          "config": "do",
                          "isActive": true
                        },
                        "SlipAndFall": {
                          "mediaSourceModuleId": "e0537898-0566-4805-aa50-e46d6f75b5b6",
                          "mediaSourceId": "7b3a4b68-4092-424e-aa27-7d8e28951f12",
                          "module": 109,
                          "config": "reprehenderit id ea commodo in",
                          "isActive": true
                        },
                        "PersonalProtectiveEquipment": {
                          "mediaSourceModuleId": "0a38708b-84c5-47b5-ac03-67a5ace0d948",
                          "mediaSourceId": "a06e2933-fb64-46ed-ab23-940d6d1815f6",
                          "module": 111,
                          "config": "non",
                          "isActive": false
                        },
                        "LoiteringMonitoring": {
                          "mediaSourceModuleId": "6e970640-1469-4f74-a463-004185002ef4",
                          "mediaSourceId": "cc014535-c6b8-40e0-acf7-d99d86d4e2f2",
                          "module": 201,
                          "config": "ut Excepteur reprehenderit",
                          "isActive": false
                        },
                        "PerimeterMonitoring": {
                          "mediaSourceModuleId": "c2c82ce7-5f6b-4e14-a454-b00e25672ee7",
                          "mediaSourceId": "242c42c5-f28b-4f64-a35a-7076a91cb723",
                          "module": 111,
                          "config": "fugiat dolor pariatur elit",
                          "isActive": false
                        },
                        "TripwireTriggeredMonitoring": {
                          "mediaSourceModuleId": "37f34cf3-9c55-4ae2-aa30-66c7e0a9ca8d",
                          "mediaSourceId": "9fc4273e-ebef-48f4-a59a-d77bf1997301",
                          "module": 6,
                          "config": "irure dolore sed",
                          "isActive": false
                        },
                        "SpeedDetection": {
                          "mediaSourceModuleId": "82cfb379-8555-4ab0-afae-ca87666e3747",
                          "mediaSourceId": "a44f1fa0-5cad-43cd-acc6-5e7d18035302",
                          "module": 204,
                          "config": "nisi voluptate labore Duis dolor",
                          "isActive": false
                        },
                        "MovementAnalysis": {
                          "mediaSourceModuleId": "3334aad9-438f-4ce9-a718-b1336a289993",
                          "mediaSourceId": "70a0409b-469e-4520-abd0-a67bb84b4abf",
                          "module": 303,
                          "config": "irure cupidatat",
                          "isActive": false
                        },
                        "Counting": {
                          "mediaSourceModuleId": "0b167fe1-8e33-495a-a2ce-2b3ca891d778",
                          "mediaSourceId": "be89d528-b8c7-4126-a11c-1be1c945b060",
                          "module": 6,
                          "config": "incididunt cupidatat pariatur deserunt aute",
                          "isActive": false
                        },
                        "IllegalParking": {
                          "mediaSourceModuleId": "4d136460-1590-4d93-a243-aa2fb52f5009",
                          "mediaSourceId": "fce5e66a-fa05-4f06-a08f-bb700af1b114",
                          "module": 203,
                          "config": "labore laboris dolor ut",
                          "isActive": true
                        },
                        "FaceRecognition": {
                          "mediaSourceModuleId": "cfc76ccc-74cc-4f04-a184-dd1ff77044b0",
                          "mediaSourceId": "3cacd13c-37d5-4a1f-aee8-45ac81359ec7",
                          "module": 111,
                          "config": "pariatur id eu aute Duis",
                          "isActive": false
                        },
                        "AuthorizedParking": {
                          "mediaSourceModuleId": "c0db09ba-55e8-4ba5-aad0-807498c4316d",
                          "mediaSourceId": "1bb33568-2338-47c8-a2db-791a6a3852b8",
                          "module": 203,
                          "config": "mollit enim aliquip laborum quis",
                          "isActive": true
                        },
                        "AutomaticContainerCodeRecognition": {
                          "mediaSourceModuleId": "9f3a766b-a0c0-4ada-a931-0d37a96c73e8",
                          "mediaSourceId": "3be70543-27b7-429c-a2cd-fe69602b5682",
                          "module": -1,
                          "config": "et voluptate",
                          "isActive": true
                        },
                        "AutomaticNumberPlateRecognition": {
                          "mediaSourceModuleId": "21745923-7191-4a3c-a7f3-b76b4e674c72",
                          "mediaSourceId": "e8175971-1ce7-4584-a398-cf62d523129e",
                          "module": 202,
                          "config": "dolor ipsum",
                          "isActive": false
                        },
                        "PedestrianDetection": {
                          "mediaSourceModuleId": "12de7d64-9bea-4f33-a7aa-e711990707c5",
                          "mediaSourceId": "ef09a49c-834e-4ed3-a047-b6cfea0c42ee",
                          "module": 204,
                          "config": "in Lorem",
                          "isActive": false
                        },
                        "VehicleMakeModelRecognition": {
                          "mediaSourceModuleId": "e4ef260d-79da-4ed7-a21f-bdcca35a703f",
                          "mediaSourceId": "06da0f34-473f-4baa-aad7-3e5a3b5db15f",
                          "module": 106,
                          "config": "consequat Lorem commodo",
                          "isActive": true
                        },
                        "ObjectDetectionClassification": {
                          "mediaSourceModuleId": "d6abdd58-16ab-41ae-aa49-f1185b624c88",
                          "mediaSourceId": "826accc5-390f-4e60-add5-2a1d488819a6",
                          "module": 111,
                          "config": "non",
                          "isActive": false
                        },
                        "PrivacyRemove": {
                          "mediaSourceModuleId": "00adbe9a-7744-44a1-a44e-79774c6338de",
                          "mediaSourceId": "e48d2f48-3b5f-45af-a838-0e41ba0bc40e",
                          "module": 203,
                          "config": "officia sint nostrud quis Excepteur",
                          "isActive": true
                        },
                        "Events": {
                          "mediaSourceModuleId": "c4916028-00bc-4f5f-a160-9125f6ea9020",
                          "mediaSourceId": "81f0fc71-d1ec-4d41-a5da-26575854925e",
                          "module": 301,
                          "config": "cupidatat aute fugiat eiusmod",
                          "isActive": true
                        }
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ZenModuleMediaSourceModuleConfigurationDtoDictionary"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ZenModuleMediaSourceModuleConfigurationDtoDictionary"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one module's configuration for a media source",
        "description": "Same action as the route above, with `module` supplied. The response is\nstill a single-entry dictionary keyed by module, not the bare\nconfiguration object.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceModuleByModuleByMediaSourceMediasourceConfig"
      },
      "put": {
        "tags": [
          "Module"
        ],
        "parameters": [
          {
            "name": "module",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/ZenModule"
            }
          },
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {}
            },
            "text/json": {
              "schema": {}
            },
            "application/*+json": {
              "schema": {}
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Save one module's configuration for a media source",
        "description": "**The body is polymorphic**: its shape depends on `{module}`, and the\ncontroller picks the concrete type from an internal module-to-DTO map.\nThat is why the spec shows it only as a generic JSON object.\n\nTwo distinct `400`s come from that dispatch, both before the facade runs:\n\n- `Invalid configuration object or module key.` - `{module}` has no\n  mapped configuration type;\n- `Invalid configuration data provided.` - the body did not deserialize\n  into that type.\n\nStart from `GET /api/configuration/basic/mediasource-module/defaults` to\nsee the right shape for each module. `304` means nothing changed.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putMediasourceModuleByModuleByMediaSourceMediasourceConfig"
      }
    },
    "/api/configuration/basic/mediasource-module/counting/advanced-scope-policy": {
      "get": {
        "tags": [
          "Module"
        ],
        "parameters": [
          {
            "name": "scopeMediaSourceGroupId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "identitySource",
            "in": "query",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AdvancedCountingIdentitySource"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AdvancedCountingScopePolicyDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "scopeMediaSourceGroupId": "012c5734-3b8f-4257-a077-8f82f0221234",
                        "identitySource": 0,
                        "dedupeWindowSeconds": 994,
                        "similarityThreshold": 30.21,
                        "exists": false
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AdvancedCountingScopePolicyDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AdvancedCountingScopePolicyDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get the advanced counting scope policy",
        "description": "Counting-specific. Both `scopeMediaSourceGroupId` and `identitySource`\nare required - the scope is a **media-source group**, so advanced\ncounting is configured per group rather than per camera.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceModuleCountingAdvancedScopePolicy"
      }
    },
    "/api/configuration/basic/mediasource-module/{module}/{mediaSourceId}/propagate-mediasource-config": {
      "put": {
        "tags": [
          "Module"
        ],
        "parameters": [
          {
            "name": "module",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/ZenModule"
            }
          },
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Copy one media source's module configuration to others",
        "description": "Copies `{mediaSourceId}`'s configuration for `{module}` onto every id in\nthe body. The bulk-configuration shortcut.\n\n**The declared response schema is wrong.** The spec says\n`BaseResponse<bool>`, but on success the action returns the **list of\nmedia-source ids actually propagated to** - which is what tells you\nwhether every target took the change. `304` with an empty body means\nnone did.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putMediasourceModuleByModuleByMediaSourcePropagateMediasourceConfig"
      }
    },
    "/api/configuration/basic/module": {
      "get": {
        "tags": [
          "Module"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ModuleDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "moduleType": 303
                        },
                        {
                          "moduleType": -1
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ModuleDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ModuleDtoList"
                }
              }
            }
          },
          "204": {
            "description": "No Content"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the modules available on a media source",
        "description": "Which analytics this camera can run, given its provider and the license.\n\n**An empty result is `204` with an empty body**, not a `200` with an\nempty array. Handle the `204`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `204` | `Prefer: code=204` | No Content |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getModule"
      }
    },
    "/api/configuration/basic/mediasource-module/{id}/activate": {
      "patch": {
        "tags": [
          "Module"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "410": {
            "description": "Gone",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "type": "do ut incididunt",
                      "title": "Perimeter West",
                      "status": 295,
                      "detail": "incididunt esse fugiat",
                      "instance": "consectetur id deserunt cupidatat"
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Activate a media-source module",
        "description": "`{id}` is the **media-source-module** id from\n`GET /api/configuration/basic/module`, not a media-source id.\n\n**The declared response schema is wrong**: the action returns the\n**count** of modules changed, not `true`. Nothing changed is **`410` with\nan empty body** - an unusual choice, and the reason no `404` exists here.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `410` | `Prefer: code=410` | Gone |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchMediasourceModuleByIdActivate"
      }
    },
    "/api/configuration/basic/mediasource-module/{id}/deactivate": {
      "patch": {
        "tags": [
          "Module"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "410": {
            "description": "Gone",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "type": "nulla deserunt dolore",
                      "title": "Lobby Entrance",
                      "status": 665,
                      "detail": "irure ut sint",
                      "instance": "nisi enim laboris commodo"
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Deactivate a media-source module",
        "description": "The mirror of activate, with the same two quirks: `data` is a **count**,\nnot a boolean, and \"nothing changed\" is **`410` with an empty body**.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `410` | `Prefer: code=410` | Gone |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchMediasourceModuleByIdDeactivate"
      }
    },
    "/api/configuration/basic/module/classes": {
      "post": {
        "tags": [
          "Module"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetModuleClassesRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetModuleClassesRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetModuleClassesRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AllowedClassDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "displayName": "Lobby Entrance",
                          "valueName": "Loading Bay 3"
                        },
                        {
                          "displayName": "Parking Level 2",
                          "valueName": "Loading Bay 3"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AllowedClassDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AllowedClassDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the object classes a module can detect",
        "description": "A `POST` that reads - the query is in the body because it carries the\nmodule and its scope. Returns the allowed classes (person, car, truck …)\nfor building a class filter.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postModuleClasses"
      }
    },
    "/api/data/object-classification/filter": {
      "post": {
        "tags": [
          "ObjectClassification"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ObjectClassificationFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ObjectClassificationFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ObjectClassificationFilterRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FrameDetectionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "76a47d3a-7c12-493c-a90a-63c4ec5f94fd",
                          "mediaSourceId": "9f8a7384-057d-4eb3-a893-ccb7260e9021",
                          "mediaSourceName": "North Gate Camera",
                          "detectionCount": 452,
                          "frameWidth": 17,
                          "frameHeight": 744,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "objectDetectionCounts": [
                            {
                              "id": "67a95872-3459-4fab-a42b-0b01d7cb0962",
                              "class": 111,
                              "label": "Parking Level 2",
                              "count": 208,
                              "createdAt": "2026-07-27T09:14:33Z",
                              "modifiedAt": "2026-07-27T09:14:33Z",
                              "occurredAt": "2026-07-27T09:14:33Z"
                            },
                            {
                              "id": "054ce973-429d-4721-a86e-4ce7aaba0d93",
                              "class": 99,
                              "label": "Parking Level 2",
                              "count": 439,
                              "createdAt": "2026-07-27T09:14:33Z",
                              "modifiedAt": "2026-07-27T09:14:33Z",
                              "occurredAt": "2026-07-27T09:14:33Z"
                            }
                          ]
                        },
                        {
                          "id": "a717bcf0-d7d8-433d-a89d-0287d20b6e41",
                          "mediaSourceId": "20d43e53-4379-4699-a077-9a31b05afd45",
                          "mediaSourceName": "Parking Level 2",
                          "detectionCount": 473,
                          "frameWidth": 629,
                          "frameHeight": 774,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "objectDetectionCounts": [
                            {
                              "id": "d16891a0-a57d-43b6-a2bc-dc4a722a936d",
                              "class": 14,
                              "label": "North Gate Camera",
                              "count": 355,
                              "createdAt": "2026-07-27T09:14:33Z",
                              "modifiedAt": "2026-07-27T09:14:33Z",
                              "occurredAt": "2026-07-27T09:14:33Z"
                            },
                            {
                              "id": "10bfb5f1-a53e-443c-afc3-5da44d62070a",
                              "class": 593,
                              "label": "North Gate Camera",
                              "count": 484,
                              "createdAt": "2026-07-27T09:14:33Z",
                              "modifiedAt": "2026-07-27T09:14:33Z",
                              "occurredAt": "2026-07-27T09:14:33Z"
                            }
                          ]
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FrameDetectionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FrameDetectionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Search object detections",
        "description": "Paged `FetchResponse`: `totalCount` beside `data`, `message` is the\ntiming string.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataObjectClassificationFilter"
      }
    },
    "/api/data/object-classification/detections/{objectId}": {
      "post": {
        "tags": [
          "ObjectClassification"
        ],
        "parameters": [
          {
            "name": "objectId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FrameDetectionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "4d64744e-fb51-4aae-adfc-780b218d9505",
                          "mediaSourceId": "b55ed2e7-65c2-4bfe-a109-ddafa102f6ca",
                          "mediaSourceName": "North Gate Camera",
                          "detectionCount": 5,
                          "frameWidth": 765,
                          "frameHeight": 33,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "objectDetectionCounts": [
                            {
                              "id": "7cea5c2b-61a7-43bb-ac1e-76da81708b37",
                              "class": 16,
                              "label": "Loading Bay 3",
                              "count": 77,
                              "createdAt": "2026-07-27T09:14:33Z",
                              "modifiedAt": "2026-07-27T09:14:33Z",
                              "occurredAt": "2026-07-27T09:14:33Z"
                            },
                            {
                              "id": "bdf6251d-2cf5-4254-a75c-3e36b02a7098",
                              "class": 738,
                              "label": "Loading Bay 3",
                              "count": 191,
                              "createdAt": "2026-07-27T09:14:33Z",
                              "modifiedAt": "2026-07-27T09:14:33Z",
                              "occurredAt": "2026-07-27T09:14:33Z"
                            }
                          ]
                        },
                        {
                          "id": "4fa45d7d-45b6-451b-a314-2908451f5109",
                          "mediaSourceId": "4fbfc755-b4c8-47d4-a14e-767c94a1ab90",
                          "mediaSourceName": "Lobby Entrance",
                          "detectionCount": 29,
                          "frameWidth": 476,
                          "frameHeight": 853,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "objectDetectionCounts": [
                            {
                              "id": "296c2c1a-a369-4303-abda-c849528a6130",
                              "class": 511,
                              "label": "North Gate Camera",
                              "count": 262,
                              "createdAt": "2026-07-27T09:14:33Z",
                              "modifiedAt": "2026-07-27T09:14:33Z",
                              "occurredAt": "2026-07-27T09:14:33Z"
                            },
                            {
                              "id": "277eed27-8046-4485-aa98-ee75c4d8bdd9",
                              "class": 587,
                              "label": "Parking Level 2",
                              "count": 354,
                              "createdAt": "2026-07-27T09:14:33Z",
                              "modifiedAt": "2026-07-27T09:14:33Z",
                              "occurredAt": "2026-07-27T09:14:33Z"
                            }
                          ]
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FrameDetectionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FrameDetectionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get every frame a tracked object appears in",
        "description": "The full track for one object - each frame it was seen in, with its box.\nA `POST` because the time window is in the body.\n\nThis action catches its own exceptions and returns **`500` with the\ninternal exception message in `message`**. Log it, never display it.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataObjectClassificationDetectionsByObject"
      }
    },
    "/api/data/object-classification/classes": {
      "get": {
        "tags": [
          "ObjectClassification"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ObjectClassificationColorResponseList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "module": "incididunt ad",
                          "items": [
                            {
                              "type": {},
                              "name": "Lobby Entrance",
                              "color": "White"
                            },
                            {
                              "type": {},
                              "name": "Perimeter West",
                              "color": "Red"
                            }
                          ]
                        },
                        {
                          "module": "dolore",
                          "items": [
                            {
                              "type": {},
                              "name": "Loading Bay 3",
                              "color": "Black"
                            },
                            {
                              "type": {},
                              "name": "North Gate Camera",
                              "color": "Black"
                            }
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ObjectClassificationColorResponseList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ObjectClassificationColorResponseList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List detectable object classes",
        "description": "Every class the classifier can report - person, car, bicycle and so on.\nReference data for building a filter; the per-module subset comes from\n`POST /api/configuration/basic/module/classes`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataObjectClassificationClasses"
      }
    },
    "/api/data/object-classification/zone-names": {
      "post": {
        "tags": [
          "ObjectClassification"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ZoneFetchRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ZoneFetchRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ZoneFetchRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        "eu laboris aliquip",
                        "laborum ea eu proident"
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List zone names",
        "description": "The named regions configured on the media sources in the request - the\nlabels detections are tagged with. A `POST` because the media-source\nlist is in the body.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataObjectClassificationZoneNames"
      }
    },
    "/api/data/object-classification/full-frame-image/{id}": {
      "get": {
        "tags": [
          "ObjectClassification"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get an object detection's full frame",
        "description": "The whole frame, base64 in `data`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataObjectClassificationFullFrameImageById"
      }
    },
    "/api/configuration/basic/occupancy/types": {
      "get": {
        "tags": [
          "Occupancy"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnumOptionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "value": 489,
                          "name": "Lobby Entrance"
                        },
                        {
                          "value": 381,
                          "name": "North Gate Camera"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnumOptionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnumOptionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List occupancy types",
        "description": "Static reference data, built from an enum at request time - no database\naccess. Safe to cache for the life of the session.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getOccupancyTypes"
      }
    },
    "/api/configuration/basic/output/vms": {
      "post": {
        "tags": [
          "OutputConfiguration"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FetchVmsOutputsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FetchVmsOutputsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FetchVmsOutputsRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VmsOutputDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "outputId": "sunt in sed ut minim",
                          "outputName": "Perimeter West",
                          "hardwareId": "non do et",
                          "hardwareName": "Loading Bay 3"
                        },
                        {
                          "outputId": "laboris",
                          "outputName": "Parking Level 2",
                          "hardwareId": "sed et reprehenderit dolore nulla",
                          "hardwareName": "North Gate Camera"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VmsOutputDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VmsOutputDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the outputs a VMS exposes",
        "description": "A `POST` that reads - it takes VMS connection details in the body, so it\ncannot be a `GET`. This discovers what the VMS offers; the result is\nwhat you then register through `POST /api/configuration/basic/output`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postOutputVms"
      }
    },
    "/api/configuration/basic/output": {
      "get": {
        "tags": [
          "OutputConfiguration"
        ],
        "parameters": [
          {
            "name": "WatchListId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "WatchListGroupId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_OutputDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "e247f225-e238-472e-aca3-529dc9ceea26",
                          "outputId": "do ullamco esse in deserunt",
                          "outputName": "Perimeter West",
                          "hardwareId": "officia",
                          "hardwareName": "Loading Bay 3"
                        },
                        {
                          "id": "bf42ca3c-ae16-4936-abee-8f0501e8c9a7",
                          "outputId": "minim",
                          "outputName": "Loading Bay 3",
                          "hardwareId": "adipisicing ut dolore",
                          "hardwareName": "North Gate Camera"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_OutputDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_OutputDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List configured outputs",
        "description": "The outputs this system can drive, filtered by the query. Not paged\ndespite the volume - there is no `totalCount`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getOutput"
      },
      "post": {
        "tags": [
          "OutputConfiguration"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/AddOutputRequest"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/AddOutputRequest"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/AddOutputRequest"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GuidList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        "e9808bd5-5f57-41aa-ac75-9dfa260630aa",
                        "b623562f-c879-4330-a5fe-3c09fb1f1696"
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GuidList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GuidList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Register outputs",
        "description": "**The body is an array**, not a single object - even to add one output.\nReturns what was created.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postOutput"
      },
      "delete": {
        "tags": [
          "OutputConfiguration"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete outputs",
        "description": "Ids travel in the body as a plain array. `304` means nothing was\ndeleted.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteOutput"
      }
    },
    "/api/configuration/basic/output/{outputId}/trigger": {
      "post": {
        "tags": [
          "OutputConfiguration"
        ],
        "parameters": [
          {
            "name": "outputId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Fire an output",
        "description": "Drives the output immediately - the \"test\" button, and also how an\nintegration triggers a relay by hand.\n\nNote that `outputId` is a **string** here, not a GUID: it is the\noutput's native identifier at the device or VMS. `304` means the output\ndid not fire.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postOutputByOutputTrigger"
      }
    },
    "/api/configuration/basic/role": {
      "post": {
        "tags": [
          "Role"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoleDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RoleDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RoleDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create an application role",
        "description": "Returns `200` with `data: true`. A rejected role - duplicate name,\nunknown permission string - comes back as `400` with the reason in\n`message`, because the controller uses `BuildOkOrBadResponse`.\n\nPermission strings must match those in `permissions.json`; there is no\nendpoint that enumerates the valid set, so read `GET\n/api/configuration/basic/user/permissions` on an admin account to see\nwhat exists.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postRole"
      },
      "patch": {
        "tags": [
          "Role"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoleDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/RoleDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/RoleDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update an application role",
        "description": "The id travels in the body. Returns `200`/`data: true` on success and\n**`304` with an empty body** when nothing was written - an unknown id\nlands here rather than on a `404`.\n\nChanging a role's permissions takes effect on the next request from\nanyone holding it; there is no cache to flush and no re-login needed.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchRole"
      },
      "get": {
        "tags": [
          "Role"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_RoleDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "86629494-f574-4e1b-a342-73e1b0fb8570",
                          "name": "Parking Level 2"
                        },
                        {
                          "id": "872e9b7e-6167-4f03-a34c-465aa99148b7",
                          "name": "Loading Bay 3"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_RoleDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_RoleDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List application roles",
        "description": "Returns every role with its permission set.\n\nNote that `message` is the literal string `\"Roles retrieved\nsuccessfully\"` - the controller passes it to `BuildOkResponse`. It is\nstatus text, not something to display. The generated example on this page\nshows an empty `message`; the running instance sends that sentence.\n\nApplication roles here are **not** the ASP.NET Identity roles exposed\nunder `/api/configuration/basic/identity-role`. The two are separate\nconcepts on separate tables.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getRole"
      }
    },
    "/api/configuration/basic/role/delete": {
      "post": {
        "tags": [
          "Role"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteRoleRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteRoleRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/DeleteRoleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete application roles",
        "description": "A `POST` that deletes: the body is `{ \"idsToDelete\": [...] }`. Returns\n`200`/`data: true`, or `400` with the reason in `message` - typically\nbecause a role is still assigned to a user.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postRoleDelete"
      }
    },
    "/api/saved-queries": {
      "get": {
        "tags": [
          "SavedQueries"
        ],
        "parameters": [
          {
            "name": "FilterType",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/SavedQueryFilterType"
            }
          },
          {
            "name": "ModuleType",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/ZenModule"
            }
          },
          {
            "name": "SearchText",
            "in": "query",
            "schema": {
              "maxLength": 100,
              "minLength": 0,
              "type": "string"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_SavedQueryDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "d36c8af8-7936-4f2f-a2df-8b8d63fccbcb",
                          "name": "Lobby Entrance",
                          "description": "Perimeter West",
                          "isShared": false,
                          "moduleType": 103,
                          "ownerId": "6d550eff-3214-479f-a0d9-6219601590ac",
                          "ownerName": "Loading Bay 3",
                          "isOwned": true,
                          "filterPayload": "anim non reprehenderit id",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "4f0b9954-9cf4-45a2-af9a-bf735d6b4c86",
                          "name": "North Gate Camera",
                          "description": "North Gate Camera",
                          "isShared": false,
                          "moduleType": 108,
                          "ownerId": "14b6deb1-d2a3-4d22-ac6a-b1147658ac3d",
                          "ownerName": "North Gate Camera",
                          "isOwned": false,
                          "filterPayload": "ut culpa do laborum",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_SavedQueryDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_SavedQueryDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List saved queries",
        "description": "Paged `FetchResponse`: `totalCount` sits beside `data` at the top level,\nnot inside it, and `message` is the timing string.\n\nSaved queries are the stored filter sets behind the search screens. The\n`query` field is an opaque blob the search endpoints understand; do not\nconstruct it by hand.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getSavedQueries"
      },
      "post": {
        "tags": [
          "SavedQueries"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddSavedQueryRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AddSavedQueryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AddSavedQueryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SavedQueryDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "d1a2805e-54e2-4458-a041-c795e95997b5",
                        "name": "Parking Level 2",
                        "description": "North Gate Camera",
                        "isShared": false,
                        "moduleType": 201,
                        "ownerId": "7dba0b44-d5ba-4be7-a0c0-cfb9b734b688",
                        "ownerName": "Parking Level 2",
                        "isOwned": true,
                        "filterPayload": "minim tempor officia",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SavedQueryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SavedQueryDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a saved query",
        "description": "Returns the created `SavedQueryDto`, including the server-assigned `id`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postSavedQueries"
      }
    },
    "/api/saved-queries/{id}": {
      "put": {
        "tags": [
          "SavedQueries"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSavedQueryRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSavedQueryRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateSavedQueryRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SavedQueryDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "781533bc-c010-4a2e-a2d6-ed5ecb78246c",
                        "name": "Lobby Entrance",
                        "description": "North Gate Camera",
                        "isShared": true,
                        "moduleType": 204,
                        "ownerId": "98476bf1-36c7-4b24-a263-97d9cb659520",
                        "ownerName": "Perimeter West",
                        "isOwned": true,
                        "filterPayload": "ut dolore in sint",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SavedQueryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SavedQueryDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a saved query",
        "description": "Full replacement, not a patch - send the whole object. Returns the\nupdated `SavedQueryDto`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putSavedQueriesById"
      },
      "delete": {
        "tags": [
          "SavedQueries"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete a saved query",
        "description": "Returns `200`/`data: true` when a row was removed and **`304` with an\nempty body** when none was - which is what an already-deleted id gives\nyou. The declared `404` comes from the facade, not this action.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteSavedQueriesById"
      },
      "get": {
        "tags": [
          "SavedQueries"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SavedQueryDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "4157dc00-8e38-40f4-acfe-e3954fdcd77f",
                        "name": "Parking Level 2",
                        "description": "Loading Bay 3",
                        "isShared": true,
                        "moduleType": 1,
                        "ownerId": "7980a06e-d20b-4c7f-ad10-d4640ce98f81",
                        "ownerName": "North Gate Camera",
                        "isOwned": true,
                        "filterPayload": "sed nostrud tempor ipsum irure",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SavedQueryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SavedQueryDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one saved query",
        "description": "`[NotEmptyGuid]` rejects an all-zero id with a validation `400`.\n\nThe action calls `BuildOkResponse` unconditionally, so an id that does\nnot exist returns **`200` with `data: null`** unless the facade raises\n`NotFoundException`. Check `data`, not just the status.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getSavedQueriesById"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/schedules": {
      "get": {
        "tags": [
          "Schedule"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "521215d9-de9b-4273-ac37-1f7fbf4ca0c3",
                          "mediaSourceId": "ffd1642b-cd42-4fc3-ac22-9c2c8ae9233f",
                          "moduleType": 201,
                          "name": "Lobby Entrance",
                          "isEnabled": true,
                          "startTime": "08:00:00Z",
                          "endTime": "08:00:00Z",
                          "monday": false,
                          "tuesday": false,
                          "wednesday": true,
                          "thursday": true,
                          "friday": false,
                          "saturday": true,
                          "sunday": false,
                          "timeZoneId": "sint mollit non laboris magna",
                          "createdAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "05ea27e7-642c-4aad-ad05-82738a013c11",
                          "mediaSourceId": "216d991c-1655-4d01-a1cb-6dfa68440aed",
                          "moduleType": 304,
                          "name": "Loading Bay 3",
                          "isEnabled": true,
                          "startTime": "08:00:00Z",
                          "endTime": "08:00:00Z",
                          "monday": false,
                          "tuesday": true,
                          "wednesday": true,
                          "thursday": true,
                          "friday": false,
                          "saturday": true,
                          "sunday": false,
                          "timeZoneId": "deserunt magna qui ut reprehenderit",
                          "createdAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List a media source's schedules",
        "description": "A media source can hold several schedules, typically one per module.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceByMediaSourceSchedules"
      }
    },
    "/api/configuration/basic/schedules": {
      "get": {
        "tags": [
          "Schedule"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "6d8dff3b-dbdf-4930-a8e6-1ce1ab7040d6",
                          "mediaSourceId": "f4c4f108-b088-4c6a-af7d-0a72eb04a18b",
                          "moduleType": 106,
                          "name": "Loading Bay 3",
                          "isEnabled": true,
                          "startTime": "08:00:00Z",
                          "endTime": "08:00:00Z",
                          "monday": false,
                          "tuesday": false,
                          "wednesday": false,
                          "thursday": false,
                          "friday": false,
                          "saturday": false,
                          "sunday": true,
                          "timeZoneId": "dolor",
                          "createdAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "4bcab2a5-d1a8-4975-a1d0-5af196fb72e3",
                          "mediaSourceId": "9d89b761-4fdb-4696-a317-40b6958c05e4",
                          "moduleType": 6,
                          "name": "Loading Bay 3",
                          "isEnabled": false,
                          "startTime": "08:00:00Z",
                          "endTime": "08:00:00Z",
                          "monday": true,
                          "tuesday": true,
                          "wednesday": true,
                          "thursday": false,
                          "friday": true,
                          "saturday": false,
                          "sunday": true,
                          "timeZoneId": "Excepteur",
                          "createdAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List all schedules",
        "description": "Every schedule the caller may see - already filtered by media-source-group\npermission, so two users can get different lists from the same system.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getSchedules"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/schedule": {
      "post": {
        "tags": [
          "Schedule"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateScheduleRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/CreateScheduleRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/CreateScheduleRequest"
              }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Created",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "a820d762-8988-483f-a0d5-2bb98ca67c17",
                        "mediaSourceId": "1dafae3b-dd2c-4998-a570-a8522a050c9d",
                        "moduleType": 3,
                        "name": "North Gate Camera",
                        "isEnabled": false,
                        "startTime": "08:00:00Z",
                        "endTime": "08:00:00Z",
                        "monday": false,
                        "tuesday": true,
                        "wednesday": true,
                        "thursday": false,
                        "friday": true,
                        "saturday": false,
                        "sunday": false,
                        "timeZoneId": "non sit",
                        "createdAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 201
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a schedule",
        "description": "**Returns `201`, not `200`** - the only creation endpoint in this API\nthat does. The body is the created `MediaSourceScheduleDto`.\n\n`mediaSourceId` appears in both the path and the body and **must match**;\na mismatch is a validation `400` with field `MediaSourceId` before the\nfacade runs. `409` means a schedule already covers that window.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `201` | `Prefer: code=201` | Created |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `409` | `Prefer: code=409` | Conflict |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postMediasourceByMediaSourceSchedule"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/schedule/{scheduleId}": {
      "patch": {
        "tags": [
          "Schedule"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "scheduleId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateScheduleRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateScheduleRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateScheduleRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "a4b83d8f-4807-4531-aeb4-da145bf08059",
                        "mediaSourceId": "d8809b8a-86f6-4882-a72f-e962345688a4",
                        "moduleType": 302,
                        "name": "Parking Level 2",
                        "isEnabled": false,
                        "startTime": "08:00:00Z",
                        "endTime": "08:00:00Z",
                        "monday": true,
                        "tuesday": true,
                        "wednesday": false,
                        "thursday": true,
                        "friday": false,
                        "saturday": false,
                        "sunday": false,
                        "timeZoneId": "fugiat irure",
                        "createdAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_MediaSourceScheduleDto"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a schedule",
        "description": "Partial update. `scheduleId` must match the `id` in the body - a mismatch\nis a validation `400` with field `Id`.\n\nOn success the response carries the **updated schedule**, not a boolean.\n`409` means the change would overlap an existing window.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `409` | `Prefer: code=409` | Conflict |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchMediasourceByMediaSourceScheduleBySchedule"
      },
      "delete": {
        "tags": [
          "Schedule"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "scheduleId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete a schedule",
        "description": "Soft delete - the row is marked, not removed. `304` with an empty body\nmeans nothing was deleted.\n\nNote that `mediaSourceId` is required by the route but not actually used\nto resolve the schedule; `scheduleId` alone identifies it.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteMediasourceByMediaSourceScheduleBySchedule"
      }
    },
    "/api/configuration/basic/mediasource/{mediaSourceId}/schedule/status": {
      "get": {
        "tags": [
          "Schedule"
        ],
        "parameters": [
          {
            "name": "mediaSourceId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "moduleType",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/ZenModule"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Check whether a media source is inside its schedule window",
        "description": "`data: true` means the media source should be active **right now**, for\nthe given `moduleType`.\n\n**No schedule, or a disabled schedule, also returns `true`** - the\nabsence of a schedule means always-on, not never-on. Do not read `false`\nas \"unscheduled\".\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getMediasourceByMediaSourceScheduleStatus"
      }
    },
    "/api/configuration/basic/schedules/status": {
      "post": {
        "tags": [
          "Schedule"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ScheduleStatusBulkRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ScheduleStatusBulkRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ScheduleStatusBulkRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GuidBooleanIDictionary"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "fugiatf2": true
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GuidBooleanIDictionary"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_GuidBooleanIDictionary"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Check schedule status for several media sources",
        "description": "The bulk form of the endpoint above, for painting a whole camera wall in\none call. Returns a **map of media-source id to boolean**, with the same\n\"no schedule means `true`\" rule.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postSchedulesStatus"
      }
    },
    "/api/configuration/basic/server": {
      "get": {
        "tags": [
          "Server"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "5c700942-1f8b-455f-aef3-6d7f51e59243",
                          "serverName": "Loading Bay 3",
                          "serverUUID": "ipsum reprehenderit",
                          "serverIP": "10.0.4.21",
                          "serverPort": 554,
                          "serverSecurePort": 554,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "isActive": true,
                          "type": 5,
                          "dbConnectionString": "do magna pariatur"
                        },
                        {
                          "id": "763be31f-1c5b-4240-abf0-cd40089d7da8",
                          "serverName": "Lobby Entrance",
                          "serverUUID": "sunt dolor ipsum sed veniam",
                          "serverIP": "10.0.4.21",
                          "serverPort": 554,
                          "serverSecurePort": 554,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "isActive": false,
                          "type": 1,
                          "dbConnectionString": "laboris"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List registered servers",
        "description": "Returns every registered Management and Analytics server. This and the\ntwo filtered variants below are the same controller action\n(`ServerController.FetchServers`) reached through three routes, so they\nshare a response shape.\n\nOn the license bypass list, so it answers on an unlicensed system - which\nis what makes first-time provisioning possible.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getServer"
      }
    },
    "/api/configuration/basic/server/{id}": {
      "get": {
        "tags": [
          "Server"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "6ee9893b-6ce3-4dca-a898-7e0c0c5f6022",
                          "serverName": "Parking Level 2",
                          "serverUUID": "minim exercitation aute",
                          "serverIP": "10.0.4.21",
                          "serverPort": 554,
                          "serverSecurePort": 554,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "isActive": true,
                          "type": 1,
                          "dbConnectionString": "magna ad occaecat aliquip"
                        },
                        {
                          "id": "6ba9eaf7-c7df-4944-a21b-8fffcf6ac9d6",
                          "serverName": "North Gate Camera",
                          "serverUUID": "Ut velit sed amet",
                          "serverIP": "10.0.4.21",
                          "serverPort": 554,
                          "serverSecurePort": 554,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "isActive": true,
                          "type": 2,
                          "dbConnectionString": "sint amet deserunt quis"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one registered server by id",
        "description": "Same action as `GET /api/configuration/basic/server`, filtered by id. The\npayload is still a **list** - a match returns a one-element array, no\nmatch returns an empty one. There is no `404` here.\n\n`id` is validated by `[NotEmptyGuid]`: an all-zero GUID is rejected with\n`400` carrying `data` as an array of `{field, error}`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getServerById"
      }
    },
    "/api/configuration/basic/server/type/{serverType}": {
      "get": {
        "tags": [
          "Server"
        ],
        "parameters": [
          {
            "name": "serverType",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/ServerType"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "da84083e-9668-4b7e-a410-16e0cdf89235",
                          "serverName": "Parking Level 2",
                          "serverUUID": "Lorem in adipisicing",
                          "serverIP": "10.0.4.21",
                          "serverPort": 554,
                          "serverSecurePort": 554,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "isActive": false,
                          "type": 0,
                          "dbConnectionString": "in Duis"
                        },
                        {
                          "id": "d36015b0-7c03-40dd-a005-8793ed358ce7",
                          "serverName": "Perimeter West",
                          "serverUUID": "consectetur fugiat sunt",
                          "serverIP": "10.0.4.21",
                          "serverPort": 554,
                          "serverSecurePort": 554,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "isActive": false,
                          "type": 6,
                          "dbConnectionString": "officia incididunt aliqua esse"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List registered servers of one type",
        "description": "Same action as `GET /api/configuration/basic/server`, filtered by\n`ServerType`. Returns an empty list when no server of that type is\nregistered.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getServerTypeByServerType"
      }
    },
    "/api/configuration/basic/server/server-configuration": {
      "post": {
        "tags": [
          "Server"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerConfigRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerConfigRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ServerConfigRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Set a server's general configuration",
        "description": "Returns `200`/`data: true` on success and **`304` with an empty body**\nwhen nothing was written. Do not treat `304` as an error and do not\nretry it unchanged.\n\nOn the license bypass list.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postServerServerConfiguration"
      }
    },
    "/api/configuration/basic/server/{id}/delete": {
      "delete": {
        "tags": [
          "Server"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Unregister a server",
        "description": "Returns `200` with `data: true` when the server was removed, and\n**`304 Not Modified` with an empty body** when it was not - typically\nbecause the id does not exist or the server still has assigned media\nsources. The `304` is an application signal, not an HTTP cache response.\n\nNot on the license bypass list: this returns `402` on an unlicensed\nsystem.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteServerByIdDelete"
      }
    },
    "/api/configuration/basic/server/{id}/configuration": {
      "get": {
        "tags": [
          "Server"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerConfigurationDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "ed7d5284-4906-4e0f-ad0d-32b004089003",
                        "dataSourceProvider": {
                          "id": "d69a25df-bea9-4210-a058-eab7af77e6c2",
                          "providerType": 0,
                          "hostUri": "rtsp://10.0.4.21:554/stream1",
                          "authUri": "rtsp://10.0.4.21:554/stream1",
                          "username": "North Gate Camera",
                          "password": "Lorem aliqua quis et Ut",
                          "authorization": 1
                        },
                        "analyticsDataDestination": {
                          "id": "dc1462d5-ae94-4f9c-acea-26a682c72f39",
                          "dataDestinationType": 2,
                          "connectionString": "nulla sed commodo culpa",
                          "serverRetentionPeriod": 690,
                          "ftpServerPath": "aliquip veniam ipsum do",
                          "databaseLag": 158,
                          "binaryPath": "occaecat",
                          "backupInterval": 470,
                          "dataBackupPath": "consequat nulla",
                          "notifyNoResultsAfter": 845,
                          "username": "Perimeter West",
                          "password": "sed deserunt",
                          "archiveData": true,
                          "archivedBinaryPath": "quis",
                          "archivedUsername": "Perimeter West",
                          "archivedPassword": "consectetur",
                          "archivedRetentionPeriod": 69
                        },
                        "imagesDataDestination": {
                          "id": "a914d1b1-03de-4a76-a3a3-98dbd2fbbaf8",
                          "dataDestinationType": 1,
                          "connectionString": "ut",
                          "serverRetentionPeriod": 276,
                          "ftpServerPath": "anim quis",
                          "databaseLag": 966,
                          "binaryPath": "aliquip",
                          "backupInterval": 689,
                          "dataBackupPath": "ut",
                          "notifyNoResultsAfter": 614,
                          "username": "Parking Level 2",
                          "password": "aliqua ad",
                          "archiveData": false,
                          "archivedBinaryPath": "est ex Lorem",
                          "archivedUsername": "Perimeter West",
                          "archivedPassword": "consequat velit",
                          "archivedRetentionPeriod": 94
                        },
                        "dataDistributionProvider": {
                          "id": "a30c3993-09be-4c10-a16f-e79d6c23d4f1",
                          "providerType": 1,
                          "hostAddress": "ut consequat minim ut ad",
                          "hostPort": "qui",
                          "mqttHostPort": 554,
                          "mqttScheme": "magna",
                          "username": "Loading Bay 3",
                          "password": "tempor et dolor Lorem ullamco"
                        }
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerConfigurationDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ServerConfigurationDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Read a server's configuration",
        "description": "Returns the full `ServerConfigurationDto` for one server. `[NotEmptyGuid]`\nrejects an all-zero id with a validation `400`.\n\nNot on the license bypass list - the six-segment path does not match any\nbypass template - so this returns `402` on an unlicensed system even\nthough the plain server listing does not.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getServerByIdConfiguration"
      }
    },
    "/api/configuration/basic/server/active-configuration": {
      "get": {
        "tags": [
          "Server"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ActiveServerMediaSourceProviderDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "serverConfigurationId": "f34267ff-378b-4da4-ac71-6700249c673a",
                        "activeServerMediaSourceProviderParams": {
                          "id": "2b8ded8b-a1fe-408c-a9c6-00409221f1ec",
                          "providerType": 1,
                          "hostUri": "rtsp://10.0.4.21:554/stream1",
                          "authUri": "rtsp://10.0.4.21:554/stream1",
                          "username": "Perimeter West",
                          "password": "reprehenderit",
                          "authorization": 1
                        }
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ActiveServerMediaSourceProviderDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ActiveServerMediaSourceProviderDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Read the active media-source provider configuration",
        "description": "Returns which media-source provider (VMS integration or direct) the\nplatform is currently configured against, and its parameters.\n\nThe only declared failure is `500`; the action takes no input, so there\nis nothing to reject with a `400`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getServerActiveConfiguration"
      },
      "post": {
        "tags": [
          "Server"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ActiveServerMediaSourceProviderConfigRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ActiveServerMediaSourceProviderConfigRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ActiveServerMediaSourceProviderConfigRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Set the active media-source provider configuration",
        "description": "Switches the platform's media-source provider. Returns `200` with\n`data: true`.\n\nChanging the provider changes what\n`GET /api/configuration/basic/mediasource-provider` and the registry\nendpoints return. Expect existing provider media-source ids to stop\nresolving.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postServerActiveConfiguration"
      }
    },
    "/api/configuration/basic/server/{id}/assign-mediasource": {
      "post": {
        "tags": [
          "Server"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "minItems": 1,
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/MediaSourceDto"
                }
              }
            },
            "text/json": {
              "schema": {
                "minItems": 1,
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/MediaSourceDto"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "minItems": 1,
                "type": "array",
                "items": {
                  "$ref": "#/components/schemas/MediaSourceDto"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "409": {
            "description": "Conflict",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Conflict",
                    "value": {
                      "data": null,
                      "message": "A media source with this name already exists.",
                      "resultCode": 409
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Assign media sources to a server",
        "description": "Assigns one or more media sources to the server named by `{id}`. The body\nmust contain at least one entry (`[MinLength(1)]`); an empty array is a\nvalidation `400`.\n\n`409` means at least one media source is already assigned elsewhere.\nA rejected assignment that is not a conflict comes back as `400` with the\nreason in `message`, because the controller uses `BuildOkOrBadResponse`.\n\nNot on the license bypass list: `402` on an unlicensed system.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `409` | `Prefer: code=409` | Conflict |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postServerByIdAssignMediasource"
      }
    },
    "/api/configuration/basic/server/unassign-mediasource": {
      "post": {
        "tags": [
          "Server"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Unassign media sources from their servers",
        "description": "Takes a list of media-source ids, validated by `[NotEmptyGuidList]` - any\nall-zero GUID in the list is a validation `400`.\n\nReturns `200`/`data: true` on success and **`304` with an empty body**\nwhen nothing changed. `403` means the caller lacks permission on one of\nthe media-source groups involved.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postServerUnassignMediasource"
      }
    },
    "/api/configuration/basic/server/assigned-mediaSources": {
      "get": {
        "tags": [
          "Server"
        ],
        "parameters": [
          {
            "name": "ServerId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "MediaSourceId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "ActiveOnly",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "MediaSourceName",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ModuleFilter.ModuleTypes",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/ZenModule"
              }
            }
          },
          {
            "name": "ModuleFilter.ActiveOnly",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "ModuleFilter.RequireConfiguration",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "From",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "To",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 10000000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_MediaSourceDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "71fe0f86-c24e-4b25-a078-1824776ed8f1",
                          "mediaSourceFqid": "deserunt commodo proident",
                          "name": "Lobby Entrance",
                          "serverId": "ca2e5942-bc40-48df-acc1-77bc8d6e7fd0",
                          "isActive": true,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "floorNumber": 528,
                          "plan": 0,
                          "buildingName": "Lobby Entrance",
                          "address": "esse in ullamco elit",
                          "mediaSourceIp": "10.0.4.21",
                          "mediaSourcePort": 554,
                          "mediaSourceUsername": "North Gate Camera",
                          "mediaSourcePassword": "est mollit",
                          "longitude": 44.61,
                          "streamQuality": 872,
                          "streamFramesPerSecond": 706,
                          "streamWidth": 476,
                          "streamHeight": 583,
                          "latitude": 2.67,
                          "streamUrl": "rtsp://10.0.4.21:554/stream1",
                          "snapshotPath": "aute cillum anim ullamco",
                          "snapshotTakenAt": "2026-07-27T09:14:33Z",
                          "mediaSourceProviderType": 2
                        },
                        {
                          "id": "ed50ad63-50ca-48cc-afd8-16cefa28ba5c",
                          "mediaSourceFqid": "in consequat deserunt",
                          "name": "Parking Level 2",
                          "serverId": "e07c5ae1-c1f8-4d03-aa7f-c60769c5639c",
                          "isActive": false,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "floorNumber": 783,
                          "plan": 2,
                          "buildingName": "Perimeter West",
                          "address": "sit est",
                          "mediaSourceIp": "10.0.4.21",
                          "mediaSourcePort": 554,
                          "mediaSourceUsername": "Parking Level 2",
                          "mediaSourcePassword": "amet consectetur sunt fugiat pariatur",
                          "longitude": 28.22,
                          "streamQuality": 524,
                          "streamFramesPerSecond": 79,
                          "streamWidth": 594,
                          "streamHeight": 209,
                          "latitude": 67.33,
                          "streamUrl": "rtsp://10.0.4.21:554/stream1",
                          "snapshotPath": "aliquip ut tempor incididunt",
                          "snapshotTakenAt": "2026-07-27T09:14:33Z",
                          "mediaSourceProviderType": 0
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_MediaSourceDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_MediaSourceDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List media sources assigned to servers",
        "description": "Paged. This is a **`FetchResponse`**, so `totalCount` sits beside `data` at\nthe top level and `message` is the timing string `\"This request took N\nseconds\"` - not prose. Page through with the query parameters rather than reading\n`data.length`.\n\n`403` means the caller lacks permission on a media-source group in the\nresult set.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getServerAssignedMediaSources"
      }
    },
    "/api/configuration/basic/server/{id}/update": {
      "put": {
        "tags": [
          "Server"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateServerRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateServerRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateServerRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a registered server",
        "description": "Returns `200`/`data: true` on success. A failed update returns **`400`,\nnot `404`** - the declared `404` comes from the facade raising\n`NotFoundException`, while the controller's own failure path is\n`BuildOkOrBadResponse`, which produces `400`.\n\nOn the license bypass list.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putServerByIdUpdate"
      }
    },
    "/api/configuration/basic/server/add": {
      "post": {
        "tags": [
          "Server"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerAddRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ServerAddRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ServerAddRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Register a server",
        "description": "Registers a Management or Analytics server with the platform. Returns\n`200` with `data: true` on success; a rejected registration returns\n`400` with the reason in `message` (`BuildOkOrBadResponse`), not a `409`.\n\nOn the license bypass list - a server can be registered before a license\nis installed.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postServerAdd"
      }
    },
    "/api/configuration/basic/system/version": {
      "get": {
        "tags": [
          "System"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SystemVersionInfo"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "management": {
                          "version": "deserunt nisi",
                          "buildNumber": "in culpa sint laboris officia",
                          "fullVersion": "tempor sunt"
                        },
                        "monitoring": {
                          "version": "nisi magna anim",
                          "buildNumber": "pariatur cupidatat dolore",
                          "fullVersion": "quis tempor"
                        },
                        "analytics": [
                          {
                            "serverId": "c13ac272-4f12-4565-afaa-034164baa485",
                            "serverName": "North Gate Camera",
                            "serverIp": "10.0.4.21",
                            "status": 1,
                            "version": {
                              "version": "exercitation minim",
                              "buildNumber": "cillum minim magna sint velit",
                              "fullVersion": "sunt do nostrud velit"
                            }
                          },
                          {
                            "serverId": "a8107c7b-7546-40dd-a294-9053d1852a86",
                            "serverName": "Loading Bay 3",
                            "serverIp": "10.0.4.21",
                            "status": 0,
                            "version": {
                              "version": "ullamco",
                              "buildNumber": "commodo",
                              "fullVersion": "voluptate"
                            }
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SystemVersionInfo"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SystemVersionInfo"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Read platform component versions",
        "description": "Returns the Management and Monitoring versions plus one entry per\nregistered Analytics server, so a client can check compatibility before\ndoing anything else.\n\nOn the license bypass list - it answers on an unlicensed system, which\nmakes it the safest first call for a health or discovery probe. It still\nrequires authentication.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "getSystemVersion"
      }
    },
    "/api/configuration/basic/certificates/system/current": {
      "get": {
        "tags": [
          "System"
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Download the system certificate",
        "description": "**The `200` is a file, not the envelope** - the certificate is streamed\nwith `Content-Disposition`. The spec declares no schema for it, so the\nmock answers with an empty body.\n\nEvery failure is a **`400`** carrying one of five fixed messages, which\nis unusually precise for this API:\n\n| `message` | Meaning |\n| --- | --- |\n| `System certificate path is not configured.` | the install never set a path |\n| `System certificate file was not found.` | configured, but missing on disk |\n| `Unsupported certificate file type.` | the file is not a certificate format |\n| `System certificate file is invalid.` | unreadable or corrupt |\n| `System certificate could not be resolved.` | fallback |\n\nAll five are deployment problems, not request problems - retrying will\nnot help.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "getCertificatesSystemCurrent"
      }
    },
    "/api/data/triggered-alarms/{triggeredAlarmId}/snapshots": {
      "get": {
        "tags": [
          "TriggeredAlarm"
        ],
        "parameters": [
          {
            "name": "triggeredAlarmId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteListList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                        "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteListList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteListList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get an alarm's snapshot images",
        "description": "The frames captured when the alarm fired, **base64-encoded in an\narray** - not binary bodies, and potentially several megabytes. Fetch\nlazily rather than with the alarm list.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataTriggeredAlarmsByTriggeredAlarmSnapshots"
      }
    },
    "/api/data/triggered-alarms/status/{status}": {
      "get": {
        "tags": [
          "TriggeredAlarm"
        ],
        "parameters": [
          {
            "name": "status",
            "in": "path",
            "required": true,
            "schema": {
              "$ref": "#/components/schemas/AlarmStatus"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredAlarmSummaryDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "bfb258f1-e342-4140-a916-15820a5f0826",
                          "message": "laboris laborum aliqua est ut",
                          "status": 1,
                          "severity": 2,
                          "category": "anim occaecat",
                          "assignedUserName": "Loading Bay 3",
                          "mediaSourceName": "Lobby Entrance",
                          "definedAlarmName": "Parking Level 2",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "updatedAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "79a0167e-56be-43e3-a8f8-a6f5f9db5b96",
                          "message": "officia consequat sunt quis in",
                          "status": 2,
                          "severity": 0,
                          "category": "sint elit esse minim",
                          "assignedUserName": "Loading Bay 3",
                          "mediaSourceName": "Parking Level 2",
                          "definedAlarmName": "North Gate Camera",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "updatedAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredAlarmSummaryDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredAlarmSummaryDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List alarms in a given status",
        "description": "Unpaged, unfiltered - the whole set in that status. For an operator\nqueue that could be thousands of rows, use\n`POST /api/data/triggered-alarms/filter` instead.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataTriggeredAlarmsStatusByStatus"
      }
    },
    "/api/data/triggered-alarms/filter": {
      "post": {
        "tags": [
          "TriggeredAlarm"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredAlarmFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredAlarmFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredAlarmFilterRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_TriggeredAlarmSummaryDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "efe14f97-becb-4cfc-a84d-3675fc5253b3",
                          "message": "labore voluptate sed est aliquip",
                          "status": 4,
                          "severity": 3,
                          "category": "sint esse",
                          "assignedUserName": "North Gate Camera",
                          "mediaSourceName": "Perimeter West",
                          "definedAlarmName": "Perimeter West",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "updatedAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "9af93efe-a115-4d1b-a85b-e7698ca5527f",
                          "message": "magna nisi",
                          "status": 0,
                          "severity": 3,
                          "category": "consequat",
                          "assignedUserName": "Loading Bay 3",
                          "mediaSourceName": "North Gate Camera",
                          "definedAlarmName": "Perimeter West",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "updatedAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_TriggeredAlarmSummaryDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_TriggeredAlarmSummaryDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Search triggered alarms",
        "description": "The paged, filterable search behind the alarm list. A `POST` that reads,\nbecause the filter is too large for a query string.\n\nReturns a `FetchResponse`: `totalCount` sits beside `data` and `message`\nis the timing string.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataTriggeredAlarmsFilter"
      }
    },
    "/api/data/triggered-alarms/statuses": {
      "get": {
        "tags": [
          "TriggeredAlarm"
        ],
        "parameters": [
          {
            "name": "status",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/AlarmStatus"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AlarmStatusList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        5,
                        3
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AlarmStatusList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AlarmStatusList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the statuses an alarm can move to",
        "description": "With no `status`, every status in the workflow. With one, **the statuses\nreachable from it** - which is how you build a status dropdown that only\noffers legal transitions.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataTriggeredAlarmsStatuses"
      }
    },
    "/api/data/triggered-alarms/{triggeredAlarmId}": {
      "post": {
        "tags": [
          "TriggeredAlarm"
        ],
        "parameters": [
          {
            "name": "triggeredAlarmId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredAlarmUpdateRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredAlarmUpdateRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredAlarmUpdateRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AlarmHistoryDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "af0d00b8-85c5-48e7-ab85-677fcbfeb91a",
                        "action": 1,
                        "fromStatus": 3,
                        "toStatus": 3,
                        "performedByUserName": "Perimeter West",
                        "oldNote": "sunt nostrud",
                        "newNote": "in ut velit consectetur",
                        "oldAssignedUserName": "North Gate Camera",
                        "newAssignedUserName": "Loading Bay 3",
                        "occurredAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AlarmHistoryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AlarmHistoryDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a triggered alarm",
        "description": "A `POST` to the resource itself, not a `PATCH`. Status changes, comments\nand assignment all go through here.\n\nThe response is the resulting **`AlarmHistoryDto`** - the new history\nentry, not the alarm. Re-read the alarm if you need its current state.\nAn illegal status transition is a `400`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataTriggeredAlarmsByTriggeredAlarm"
      }
    },
    "/api/data/triggered-alarms/{triggeredAlarmId}/history": {
      "get": {
        "tags": [
          "TriggeredAlarm"
        ],
        "parameters": [
          {
            "name": "triggeredAlarmId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AlarmHistoryDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "18835145-0f2b-4bf1-a126-be68e1c192bd",
                          "action": 2,
                          "fromStatus": 5,
                          "toStatus": 2,
                          "performedByUserName": "North Gate Camera",
                          "oldNote": "adipisicing",
                          "newNote": "in sit amet consectetur officia",
                          "oldAssignedUserName": "Loading Bay 3",
                          "newAssignedUserName": "Lobby Entrance",
                          "occurredAt": "2026-07-27T09:14:33Z"
                        },
                        {
                          "id": "f3952e19-22af-47e0-af60-d09843443db5",
                          "action": 3,
                          "fromStatus": 5,
                          "toStatus": 4,
                          "performedByUserName": "Parking Level 2",
                          "oldNote": "esse non",
                          "newNote": "ut cupidatat occaecat qui Excepteur",
                          "oldAssignedUserName": "Loading Bay 3",
                          "newAssignedUserName": "North Gate Camera",
                          "occurredAt": "2026-07-27T09:14:33Z"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AlarmHistoryDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_AlarmHistoryDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get an alarm's history",
        "description": "The audit trail: every status change, comment and acknowledgement, with\nwho and when. This is the record an operator review reads.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataTriggeredAlarmsByTriggeredAlarmHistory"
      }
    },
    "/api/data/triggered-alarms/{triggeredAlarmId}/defined-events": {
      "get": {
        "tags": [
          "TriggeredAlarm"
        ],
        "parameters": [
          {
            "name": "triggeredAlarmId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredEventDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "47161f4d-3641-4b29-af9a-634bb89fe06a",
                          "referencedObjectId": "25e5f1f1-927d-4451-ae61-9215ba250faa",
                          "fullFrameImagePath": "reprehenderit",
                          "referencedObject": {},
                          "triggeredBy": "id dolor nostrud",
                          "mediaSourceId": "f8349c87-f336-4fe5-ad35-e3fc41048acf",
                          "mediaSourceName": "Parking Level 2",
                          "watchListId": "c3ba127b-2279-4ca2-af21-bf6815a51a27",
                          "definedEventId": "ba95cfb9-9a49-4e84-a762-9e424f603d35",
                          "moduleType": 204,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "definedEventName": "Parking Level 2",
                          "watchListName": "Loading Bay 3"
                        },
                        {
                          "id": "b7fcc3b4-3851-477e-a194-75d5fa22e867",
                          "referencedObjectId": "37897a38-aa2b-45c9-a635-2a6665f89981",
                          "fullFrameImagePath": "sed tempor fugiat",
                          "referencedObject": {},
                          "triggeredBy": "dolor aliquip est",
                          "mediaSourceId": "56b4bbee-458b-4f81-ad28-1b244fa8ab04",
                          "mediaSourceName": "Lobby Entrance",
                          "watchListId": "f398b248-a67a-412d-a851-81c5fc6404ec",
                          "definedEventId": "4f312bff-1f4a-4158-a225-5ce70349988f",
                          "moduleType": 102,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "definedEventName": "Loading Bay 3",
                          "watchListName": "Lobby Entrance"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredEventDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredEventDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get the events that triggered an alarm",
        "description": "The `TriggeredEvent`s that caused this alarm - one alarm can be raised by\nseveral. Follow each into `/api/data/triggered-events/{id}` for its\ndetections and imagery.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataTriggeredAlarmsByTriggeredAlarmDefinedEvents"
      }
    },
    "/api/data/triggered-alarms/{triggeredAlarmId}/acknowledge": {
      "post": {
        "tags": [
          "TriggeredAlarm"
        ],
        "parameters": [
          {
            "name": "triggeredAlarmId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredAlarmSummaryDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "e20c4236-260e-45d4-a7dd-ad19f9a35bd7",
                        "message": "nostrud velit ipsum incididunt",
                        "status": 0,
                        "severity": 3,
                        "category": "aliquip magna",
                        "assignedUserName": "Parking Level 2",
                        "mediaSourceName": "Perimeter West",
                        "definedAlarmName": "Lobby Entrance",
                        "occurredAt": "2026-07-27T09:14:33Z",
                        "updatedAt": "2026-07-27T09:14:33Z"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredAlarmSummaryDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredAlarmSummaryDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Acknowledge a triggered alarm",
        "description": "Marks the alarm acknowledged by the calling user and returns the updated\nsummary - the one-click operator action, distinct from the general\nupdate above.\n\nNo body. Acknowledging an already-acknowledged alarm is not rejected.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataTriggeredAlarmsByTriggeredAlarmAcknowledge"
      }
    },
    "/api/data/triggered-events": {
      "post": {
        "tags": [
          "TriggeredEvent"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredEventDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredEventDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredEventDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "417": {
            "description": "Expectation Failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Expectation Failed",
                    "value": {
                      "data": null,
                      "message": "Failed to publish the triggered event.",
                      "resultCode": 417
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Record a triggered event",
        "description": "Normally written by the analytics pipeline rather than by an integrator -\nthis endpoint exists for external detectors feeding the platform.\n\n`400` with `TriggeredEvent not added` means the facade refused it; `417`\nmeans it broke a business rule.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `417` | `Prefer: code=417` | Expectation Failed |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataTriggeredEvents"
      }
    },
    "/api/data/triggered-events/{id}": {
      "delete": {
        "tags": [
          "TriggeredEvent"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "417": {
            "description": "Expectation Failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Expectation Failed",
                    "value": {
                      "data": null,
                      "message": "Failed to publish the triggered event.",
                      "resultCode": 417
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete a triggered event",
        "description": "`304` with an empty body means nothing was deleted. `417` means a\nbusiness rule blocked it - an alarm still references the event, most\noften.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `417` | `Prefer: code=417` | Expectation Failed |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteDataTriggeredEventsById"
      },
      "get": {
        "tags": [
          "TriggeredEvent"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredEventDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "ef02359a-f47a-492a-a40f-47e2edc820d0",
                        "referencedObjectId": "58f90f5a-4fda-453f-a7af-94e3796b8b2c",
                        "fullFrameImagePath": "sed laboris adipisicing dolore",
                        "referencedObject": {},
                        "triggeredBy": "ipsum proident sit in",
                        "mediaSourceId": "d6ca3aa1-326c-44ec-aea1-a6ab1677c4fa",
                        "mediaSourceName": "Perimeter West",
                        "watchListId": "018525ae-d157-49a1-adf8-f365c1971964",
                        "definedEventId": "b1affa85-bd35-4874-a0f5-bd90b7b27221",
                        "moduleType": 204,
                        "createdAt": "2026-07-27T09:14:33Z",
                        "occurredAt": "2026-07-27T09:14:33Z",
                        "definedEventName": "North Gate Camera",
                        "watchListName": "Lobby Entrance"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredEventDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_TriggeredEventDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one triggered event",
        "description": "No `404` is declared - an unknown id returns `200` with `data: null`\nunless the facade raises `NotFoundException`. Check `data`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataTriggeredEventsById"
      }
    },
    "/api/data/triggered-events/bulk-delete": {
      "post": {
        "tags": [
          "TriggeredEvent"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "417": {
            "description": "Expectation Failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Expectation Failed",
                    "value": {
                      "data": null,
                      "message": "Failed to publish the triggered event.",
                      "resultCode": 417
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete several triggered events",
        "description": "Ids in the body, validated by `[NotEmptyGuidList]`. `304` means nothing\nmatched; `417` means a rule blocked the batch.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `417` | `Prefer: code=417` | Expectation Failed |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataTriggeredEventsBulkDelete"
      }
    },
    "/api/data/triggered-events/{id}/full-frame-image": {
      "get": {
        "tags": [
          "TriggeredEvent"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get an event's full-frame image",
        "description": "The uncropped frame, **base64-encoded in `data`**. The event DTO itself\ncarries only the cropped detection, so fetch this when the operator\nwants context.\n\nA missing image is `200` with `data: null`, not a `404`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataTriggeredEventsByIdFullFrameImage"
      }
    },
    "/api/data/triggered-events/filter": {
      "post": {
        "tags": [
          "TriggeredEvent"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredEventFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredEventFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/TriggeredEventFilterRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_TriggeredEventDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "6b58dc2e-eae2-446b-ace3-084e6cebcc27",
                          "referencedObjectId": "1e208c79-425d-4ce1-a8d3-689a4d6be8ce",
                          "fullFrameImagePath": "cupidatat enim",
                          "referencedObject": {},
                          "triggeredBy": "reprehenderit",
                          "mediaSourceId": "bced041c-f8fa-416d-a25d-ee6818c33bfb",
                          "mediaSourceName": "Loading Bay 3",
                          "watchListId": "7450c2cb-84da-49df-a350-2ae61824d397",
                          "definedEventId": "da59d0c0-ca45-4690-ae54-e680bb4c150c",
                          "moduleType": 107,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "definedEventName": "Perimeter West",
                          "watchListName": "Perimeter West"
                        },
                        {
                          "id": "e4b38763-1e11-4a2c-a798-c311bd1705f6",
                          "referencedObjectId": "1979d7c8-8e8b-4fe3-acdb-cfd06eaf2362",
                          "fullFrameImagePath": "Lorem ut sit adipisicing",
                          "referencedObject": {},
                          "triggeredBy": "consequat reprehenderit amet",
                          "mediaSourceId": "71603e64-e7bf-4cfb-af7a-f82c1f257bda",
                          "mediaSourceName": "Perimeter West",
                          "watchListId": "4c540cb6-2d50-40da-af3b-1ae1fabd45ac",
                          "definedEventId": "61ef67d7-3a31-4c35-a14e-a9f30a741fa4",
                          "moduleType": 303,
                          "createdAt": "2026-07-27T09:14:33Z",
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "definedEventName": "Lobby Entrance",
                          "watchListName": "Loading Bay 3"
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_TriggeredEventDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_TriggeredEventDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Search triggered events",
        "description": "The paged, filterable search behind the events list. Returns a\n`FetchResponse`: `totalCount` sits beside `data`, `message` is the timing\nstring.\n\n`403` means the filter reached a media-source group the caller has no\npermission on.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataTriggeredEventsFilter"
      }
    },
    "/api/configuration/basic/user": {
      "post": {
        "tags": [
          "User"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddUserRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AddUserRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AddUserRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "f88d682b-38a7-49d5-a6c6-7f3341abb271",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a user",
        "description": "Returns the new user's id in `data`. This is the supported way to create\nan account; `POST /auth/register` is intercepted and returns `404`.\n\nTwo different `400` shapes are possible here. Model-binding failures come\nfrom `InvalidModelStateResponseFactory` and put an **array** of\n`{field, error}` in `data`. Business failures (duplicate email, password\npolicy) come from the facade and put a **string** in `message` with\n`data: null`. Handle both.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postUser"
      },
      "get": {
        "tags": [
          "User"
        ],
        "parameters": [
          {
            "name": "From",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "To",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "SessionId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "SortOrder",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/SearchSortOrder"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_UserDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "c383aa7c-e4fb-4b1a-a76b-e751c23c0519",
                          "userName": "Perimeter West",
                          "email": "operator@example.com",
                          "phoneNumber": "commodo",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "lastLoginAt": "2026-07-27T09:14:33Z",
                          "role": "cillum"
                        },
                        {
                          "id": "8b234fac-4d98-408b-a42a-a328457d8930",
                          "userName": "Loading Bay 3",
                          "email": "operator@example.com",
                          "phoneNumber": "deserunt voluptate ex mollit",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "lastLoginAt": "2026-07-27T09:14:33Z",
                          "role": "id enim est ut"
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_UserDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_UserDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List users",
        "description": "Paged `FetchResponse`: `totalCount` sits beside `data` at the top level,\nnot inside it, and `message` is the timing string, not prose.\n\nThe only declared failure is `500` - the query parameters are all\noptional, so there is nothing to reject.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getUser"
      },
      "put": {
        "tags": [
          "User"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateUserRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "361e1e80-5463-4498-ac8d-a8a693447519",
                        "userName": "Perimeter West",
                        "email": "operator@example.com",
                        "phoneNumber": "minim",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z",
                        "lastLoginAt": "2026-07-27T09:14:33Z",
                        "role": "minim amet ullamco adipisicing"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a user",
        "description": "The id travels in the body, not the path. Returns the updated `UserDto`.\n\nDeactivating a user by setting `isActive: false` has a side effect worth\nknowing: `AccessInterceptorMiddleware` checks that flag on `/auth/login`\nand, when it is false, returns **`200` with an empty body** instead of a\ntoken. See `POST /auth/login`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "putUser"
      }
    },
    "/api/configuration/basic/user/change-password": {
      "post": {
        "tags": [
          "User"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeUserPasswordRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeUserPasswordRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/ChangeUserPasswordRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "c444ef02-1fc4-4687-aa65-e06fff2664f5",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Change a user's password",
        "description": "Administrative password change, distinct from `POST /auth/manage/info`,\nwhich only changes the caller's own password and requires `oldPassword`.\n\nPassword-policy rejections arrive as `400` with the reason in `message`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postUserChangePassword"
      }
    },
    "/api/configuration/basic/user/{id}": {
      "get": {
        "tags": [
          "User"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "72fd301a-9989-4e29-a3d4-f2f13a0149ed",
                        "userName": "Parking Level 2",
                        "email": "operator@example.com",
                        "phoneNumber": "dolor",
                        "createdAt": "2026-07-27T09:14:33Z",
                        "modifiedAt": "2026-07-27T09:14:33Z",
                        "lastLoginAt": "2026-07-27T09:14:33Z",
                        "role": "magna"
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get one user",
        "description": "Returns a single `UserDto`. The status comes from the facade, so a\nmissing user surfaces as **`400` with the reason in `message`**, not\n`404` - the controller declares no `404` at all.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getUserById"
      },
      "delete": {
        "tags": [
          "User"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete one user",
        "description": "Returns `200` with `data: true`. A failure - unknown id, or a user that\ncannot be removed - comes back as `400` with the reason in `message`.\nThere is no `404`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteUserById"
      }
    },
    "/api/configuration/basic/users/assignable": {
      "get": {
        "tags": [
          "User"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "caba9215-beb7-4022-aeb2-59e8f15921f8",
                          "userName": "Loading Bay 3",
                          "email": "operator@example.com",
                          "phoneNumber": "ullamco reprehenderit ad id",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "lastLoginAt": "2026-07-27T09:14:33Z",
                          "role": "officia"
                        },
                        {
                          "id": "37d79b4e-d12a-441c-a649-3e6332a9ccce",
                          "userName": "Lobby Entrance",
                          "email": "operator@example.com",
                          "phoneNumber": "ex quis laborum eu voluptate",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "modifiedAt": "2026-07-27T09:14:33Z",
                          "lastLoginAt": "2026-07-27T09:14:33Z",
                          "role": "occaecat"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDtoList"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_UserDtoList"
                }
              }
            }
          }
        },
        "summary": "List users an alarm or task can be assigned to",
        "description": "A filtered user list - only those the caller is allowed to assign work\nto. Not the same as `GET /api/configuration/basic/user`, which is the\nfull administrative list.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getUsersAssignable"
      }
    },
    "/api/configuration/basic/users": {
      "post": {
        "tags": [
          "User"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete several users",
        "description": "A `POST` that deletes: the body is the list of ids, validated by\n`[NotEmptyGuidList]`, so an all-zero GUID anywhere in the list is a\nvalidation `400` and nothing is deleted.\n\nAll-or-nothing is not guaranteed; `data: true` means the facade reported\nsuccess overall.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postUsers"
      }
    },
    "/api/configuration/basic/user/permissions": {
      "get": {
        "tags": [
          "User"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        "nulla ex laboris exercitation enim",
                        "irure Ut commodo"
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StringList"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the calling user's effective permissions",
        "description": "Returns the flat list of permission strings\n(`Configuration.Server.Management.Edit`, `Export.Perform`, …) that apply\nto the bearer token's own user. Front-ends call this immediately after\nlogin to decide what to render.\n\nOn the license bypass list, so it answers on an unlicensed system - which\nis what lets a client show a \"license required\" screen with the right\nnavigation.\n\n`401` means the token is absent or expired; `404` means the token\nauthenticated but its user record is gone.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getUserPermissions"
      }
    },
    "/api/data/face/filtered": {
      "post": {
        "tags": [
          "Vfr"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FaceFilterRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/FaceFilterRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/FaceFilterRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceJoinWatchListDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "1c3f2087-3ea0-49d3-ad52-32096de2f54c",
                          "minAge": 713,
                          "maxAge": 585,
                          "gender": 2,
                          "featureVector": "ad",
                          "detectionConfidence": 86,
                          "boundingBox": "id nisi",
                          "personRecognitionConfidence": 82,
                          "analyzerIdentifier": "in aliquip consectetur enim",
                          "mediaSourceId": "4065a5bd-169e-4f0d-a2ff-ade591b12060",
                          "mediaSourceName": "Parking Level 2",
                          "enrolledPersonId": "fcf5b10e-f56c-49b5-ae17-fa978956901d",
                          "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "imageId": "ca557cf0-c562-4b9d-a1ef-e1532fa91099",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "triggerType": 3,
                          "hasFaceVehicleDetection": false,
                          "watchListIds": [
                            "4d108574-ccad-4602-a81f-29f78c8d1185",
                            "2fb9fd06-9df9-44e4-acd3-519eafbfcbf8"
                          ],
                          "firstName": "North Gate Camera",
                          "lastName": "Perimeter West",
                          "detectionDate": 844,
                          "enrolledPerson": {
                            "id": "211d31a3-d738-4f6a-aefb-1c554e9566f6",
                            "firstName": "Parking Level 2",
                            "lastName": "Parking Level 2",
                            "customField1": "aliquip",
                            "customField2": "aliqua incididunt sed in fugiat",
                            "customField3": "est",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "birthYear": 446,
                            "status": 1,
                            "relatedFaces": [
                              {
                                "id": "b489e30f-130c-41fb-ac5c-25d6da757cb6",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 539,
                                "maxAge": 198,
                                "gender": 0,
                                "recognized": false,
                                "isDefault": true,
                                "faceImageName": "North Gate Camera",
                                "featureVector": "amet sint irure ut ad",
                                "detectionConfidence": 72,
                                "enrolledPersonId": "d8ca37ed-b53b-4aa2-acf6-b481e1c5aabe",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              },
                              {
                                "id": "309fe2f7-184a-47d7-ab3c-69dfab4b99b8",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 38,
                                "maxAge": 363,
                                "gender": 0,
                                "recognized": true,
                                "isDefault": false,
                                "faceImageName": "Perimeter West",
                                "featureVector": "nulla culpa ex eu sunt",
                                "detectionConfidence": 73,
                                "enrolledPersonId": "ba865e52-c2e0-4893-aa51-ae90392f494c",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              }
                            ],
                            "groups": [
                              {
                                "id": "e5dfba34-b42f-44b7-a832-bde895f97a82",
                                "name": "Lobby Entrance",
                                "alertOnCapture": true,
                                "isDefault": false
                              },
                              {
                                "id": "959eba07-bb03-402a-a0ff-cd305529e98a",
                                "name": "Loading Bay 3",
                                "alertOnCapture": false,
                                "isDefault": true
                              }
                            ],
                            "roles": [
                              {
                                "id": "153736f2-7990-4669-a072-eebdb8581529",
                                "name": "Loading Bay 3"
                              },
                              {
                                "id": "2f67e16b-a4de-4dd1-a065-d2247d48182a",
                                "name": "Parking Level 2"
                              }
                            ],
                            "vehicles": [
                              {
                                "id": "9a208e11-84d1-402e-ac2e-8512bc7ea751",
                                "licensePlate": "B 227 HK",
                                "plateType": "aliqua quis in id",
                                "category": "Lorem",
                                "make": "Hyundai",
                                "model": "ea",
                                "color": "Black",
                                "newPlateCode": "esse Lorem nostrud anim in",
                                "diplomaticCode": "laboris proident minim",
                                "minorColor": "Silver",
                                "code": "eu amet enim cillum",
                                "description": "Loading Bay 3",
                                "vinNumber": "in eu Duis",
                                "yearOfManufacture": 915,
                                "wanted": false,
                                "stolen": false,
                                "referenceNumber": "veniam",
                                "nationalNumber": "elit",
                                "method": 2,
                                "department": "Lorem proident",
                                "customField1": "in ad sit",
                                "customField2": "consequat esse do culpa",
                                "customField3": "deserunt voluptate aute occaecat",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "nisi dolor",
                                  "commodo incididunt"
                                ]
                              },
                              {
                                "id": "4f8dcf50-2e6f-4162-a4c1-bd8162ae2c26",
                                "licensePlate": "B 227 HK",
                                "plateType": "amet id enim aliqua ex",
                                "category": "ullamco occaecat consequat",
                                "make": "Hyundai",
                                "model": "non",
                                "color": "Silver",
                                "newPlateCode": "laboris in",
                                "diplomaticCode": "dolor sit dolore eiusmod",
                                "minorColor": "Black",
                                "code": "aliqua qui dolor magna",
                                "description": "Parking Level 2",
                                "vinNumber": "anim nisi eu aliqua enim",
                                "yearOfManufacture": 248,
                                "wanted": false,
                                "stolen": true,
                                "referenceNumber": "magna est",
                                "nationalNumber": "deserunt Ut consectetur elit",
                                "method": 2,
                                "department": "aliqua ex labore",
                                "customField1": "dolor",
                                "customField2": "in sunt dolor in dolore",
                                "customField3": "Excepteur",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "et minim Lorem sunt in",
                                  "quis adipisicing veniam"
                                ]
                              }
                            ]
                          },
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "recognized": false
                        },
                        {
                          "id": "984edd2a-f0f9-442a-ab0a-c6ee8be0dc19",
                          "minAge": 817,
                          "maxAge": 8,
                          "gender": 2,
                          "featureVector": "laborum esse",
                          "detectionConfidence": 81,
                          "boundingBox": "enim Duis irure",
                          "personRecognitionConfidence": 86,
                          "analyzerIdentifier": "id voluptate Ut",
                          "mediaSourceId": "6e88aa8b-7f1c-4a3b-a9c7-08c0d17a0f5e",
                          "mediaSourceName": "Loading Bay 3",
                          "enrolledPersonId": "35df626b-4499-4d32-a340-95c0028d0726",
                          "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "imageId": "4a5e4419-ca64-4d46-a753-99b7f90c0565",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "triggerType": 1,
                          "hasFaceVehicleDetection": true,
                          "watchListIds": [
                            "789a74d0-56cc-40d2-a9f1-d1c42633e6a5",
                            "663154f4-6f58-4eed-aa3b-5a06ccfcb4ef"
                          ],
                          "firstName": "Loading Bay 3",
                          "lastName": "Loading Bay 3",
                          "detectionDate": 421,
                          "enrolledPerson": {
                            "id": "fb4e03bf-94b7-486f-a909-3265778e3aac",
                            "firstName": "North Gate Camera",
                            "lastName": "Lobby Entrance",
                            "customField1": "occaecat mollit Lorem et",
                            "customField2": "elit incididunt irure",
                            "customField3": "quis dolore labore",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "birthYear": 928,
                            "status": 1,
                            "relatedFaces": [
                              {
                                "id": "51317d1c-1b7e-4ebb-a279-d294fd269548",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 153,
                                "maxAge": 643,
                                "gender": 0,
                                "recognized": false,
                                "isDefault": true,
                                "faceImageName": "Loading Bay 3",
                                "featureVector": "quis sed",
                                "detectionConfidence": 73,
                                "enrolledPersonId": "c388e097-16ba-4091-a2e4-b2c7526b0f8e",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              },
                              {
                                "id": "8beff694-a2fa-4e6c-a6f3-b80b59f50823",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 376,
                                "maxAge": 454,
                                "gender": 0,
                                "recognized": false,
                                "isDefault": true,
                                "faceImageName": "Loading Bay 3",
                                "featureVector": "eiusmod enim quis in sed",
                                "detectionConfidence": 86,
                                "enrolledPersonId": "35d857c8-6855-4935-adf3-d39284b04d38",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              }
                            ],
                            "groups": [
                              {
                                "id": "78089abd-87a4-4444-ab4c-195748a606f7",
                                "name": "Lobby Entrance",
                                "alertOnCapture": true,
                                "isDefault": true
                              },
                              {
                                "id": "879cb591-15f9-45c9-a1fe-4eef9b39e537",
                                "name": "North Gate Camera",
                                "alertOnCapture": true,
                                "isDefault": false
                              }
                            ],
                            "roles": [
                              {
                                "id": "9cd7541e-6c06-440d-aa51-95016d74cf0d",
                                "name": "Lobby Entrance"
                              },
                              {
                                "id": "8d5c13da-961c-4fee-a195-96d670122d50",
                                "name": "Loading Bay 3"
                              }
                            ],
                            "vehicles": [
                              {
                                "id": "ed1297ed-6b85-484e-a376-9b162451b6d1",
                                "licensePlate": "LT-4471",
                                "plateType": "officia elit nulla veniam",
                                "category": "dolor labore consectetur fugiat officia",
                                "make": "Toyota",
                                "model": "consequat laboris in Lorem",
                                "color": "Silver",
                                "newPlateCode": "laboris fugiat nulla quis dolor",
                                "diplomaticCode": "sed",
                                "minorColor": "White",
                                "code": "ex",
                                "description": "North Gate Camera",
                                "vinNumber": "irure",
                                "yearOfManufacture": 8,
                                "wanted": false,
                                "stolen": false,
                                "referenceNumber": "nostrud dolor tempor occaecat et",
                                "nationalNumber": "dolor irure occaecat est",
                                "method": 4,
                                "department": "laborum labore commodo sunt",
                                "customField1": "Lorem",
                                "customField2": "in adipisicing Excepteur",
                                "customField3": "minim",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "esse",
                                  "quis nulla"
                                ]
                              },
                              {
                                "id": "8787d2b4-25c7-4b99-a089-157e82f2284b",
                                "licensePlate": "ZH 88231",
                                "plateType": "consequat",
                                "category": "est sint qui",
                                "make": "Volkswagen",
                                "model": "tempor ea ut ad",
                                "color": "Silver",
                                "newPlateCode": "anim pariatur quis",
                                "diplomaticCode": "Ut ut eu exercitation",
                                "minorColor": "White",
                                "code": "in ea",
                                "description": "Perimeter West",
                                "vinNumber": "ut in commodo",
                                "yearOfManufacture": 338,
                                "wanted": true,
                                "stolen": false,
                                "referenceNumber": "cillum",
                                "nationalNumber": "dolor",
                                "method": 3,
                                "department": "incididunt in consectetur sed",
                                "customField1": "ex",
                                "customField2": "veniam et incididunt magna est",
                                "customField3": "incididunt ad aute ut eiusmod",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "enim",
                                  "exercitation dolore qui nulla deserunt"
                                ]
                              }
                            ]
                          },
                          "occurredAt": "2026-07-27T09:14:33Z",
                          "recognized": false
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceJoinWatchListDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceJoinWatchListDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Search face detections",
        "description": "The full search, including watchlist-match criteria. The payload joins\neach detection to the watchlist it matched, which the plain listing does\nnot.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataFaceFiltered"
      }
    },
    "/api/data/face/{id}/related-images/{confidence}": {
      "get": {
        "tags": [
          "Vfr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "confidence",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VFRRelatedImagesDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "fullFrameRelatedImages": [
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                        ],
                        "enrolledFaceImages": [
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                        ],
                        "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                        "faceImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VFRRelatedImagesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VFRRelatedImagesDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get related images (confidence variant)",
        "description": "**`{confidence}` is accepted and ignored.** Both routes point at the\nsame action, and that action's signature takes only `id` - so this path\nreturns exactly what `/related-images` returns, whatever you put in the\nsegment. Use the shorter form.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataFaceByIdRelatedImagesByConfidence"
      }
    },
    "/api/data/face/{id}/related-images": {
      "get": {
        "tags": [
          "Vfr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VFRRelatedImagesDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "fullFrameRelatedImages": [
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                        ],
                        "enrolledFaceImages": [
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                        ],
                        "fullFrameImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                        "faceImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VFRRelatedImagesDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_VFRRelatedImagesDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get images related to a face detection",
        "description": "Other detections the platform associates with the same face.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataFaceByIdRelatedImages"
      }
    },
    "/api/data/face": {
      "get": {
        "tags": [
          "Vfr"
        ],
        "parameters": [
          {
            "name": "GroupId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "PersonId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "AgeMin",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "AgeMax",
            "in": "query",
            "schema": {
              "type": "number",
              "format": "double"
            }
          },
          {
            "name": "Genders",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/Gender"
              }
            }
          },
          {
            "name": "MediaSourceIds",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          {
            "name": "MediaSourceGroupIds",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string",
                "format": "uuid"
              }
            }
          },
          {
            "name": "AllMediaSources",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "MediaSourcesFqid",
            "in": "query",
            "schema": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          {
            "name": "From",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "To",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 10000000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "mediaSource": {
                            "id": "a00948ef-4f07-446f-a19a-3cfeee818338",
                            "mediaSourceFqid": "consequat",
                            "name": "Loading Bay 3",
                            "serverId": "7ebc8213-6c63-4bf0-a183-124b565febc4",
                            "isActive": false,
                            "createdAt": "2026-07-27T09:14:33Z",
                            "floorNumber": 13,
                            "plan": 2,
                            "buildingName": "Parking Level 2",
                            "address": "pariatur consectetur voluptate",
                            "mediaSourceIp": "10.0.4.21",
                            "mediaSourcePort": 554,
                            "mediaSourceUsername": "Lobby Entrance",
                            "mediaSourcePassword": "anim dolore deserunt ipsum",
                            "longitude": 60.14,
                            "streamQuality": 263,
                            "streamFramesPerSecond": 663,
                            "streamWidth": 515,
                            "streamHeight": 414,
                            "latitude": 35.09,
                            "streamUrl": "rtsp://10.0.4.21:554/stream1",
                            "snapshotPath": "sint pariatur in",
                            "snapshotTakenAt": "2026-07-27T09:14:33Z",
                            "mediaSourceProviderType": 0
                          },
                          "detectionDate": 455,
                          "id": "0c4368c9-6c43-428a-a2b4-a2765f5ae4f6",
                          "minAge": 193,
                          "maxAge": 673,
                          "gender": 0,
                          "featureVector": "Excepteur velit",
                          "detectionConfidence": 80,
                          "recognized": false,
                          "boundingBox": "ullamco Excepteur",
                          "personRecognitionConfidence": 92,
                          "analyzerIdentifier": "nisi aliqua in voluptate nulla",
                          "mediaSourceId": "ec71e1dc-5db5-494e-a104-132a5102884f",
                          "mediaSourceName": "Loading Bay 3",
                          "enrolledPersonId": "703b4a9b-8d3c-48d1-aeaf-8d225c0c3267",
                          "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "imageId": "6e7ec033-9aee-4424-af12-c41e9d2afc06",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "triggerType": 0,
                          "hasFaceVehicleDetection": false,
                          "person": {
                            "id": "c039a36e-10b2-4b19-ac86-01477f8930f1",
                            "firstName": "Loading Bay 3",
                            "lastName": "Parking Level 2",
                            "customField1": "dolore esse et Lorem tempor",
                            "customField2": "quis tempor",
                            "customField3": "consectetur",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "birthYear": 7,
                            "status": 0,
                            "relatedFaces": [
                              {
                                "id": "65d873fb-58b5-402d-a951-92cbf979b01e",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 522,
                                "maxAge": 687,
                                "gender": 1,
                                "recognized": true,
                                "isDefault": false,
                                "faceImageName": "Loading Bay 3",
                                "featureVector": "nulla laboris occaecat",
                                "detectionConfidence": 88,
                                "enrolledPersonId": "86280416-2c18-4578-aa87-86676fc86e9e",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              },
                              {
                                "id": "d714a94e-96c7-4935-a5c6-b1a4e8af3d32",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 78,
                                "maxAge": 813,
                                "gender": 0,
                                "recognized": false,
                                "isDefault": false,
                                "faceImageName": "Perimeter West",
                                "featureVector": "Duis",
                                "detectionConfidence": 85,
                                "enrolledPersonId": "a5096340-3997-4947-a238-6ea05a339f1f",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              }
                            ],
                            "groups": [
                              {
                                "id": "045760f9-b81b-439a-af8f-069fa07062b4",
                                "name": "Lobby Entrance",
                                "alertOnCapture": true,
                                "isDefault": true
                              },
                              {
                                "id": "31e05d97-87bf-4624-aee3-be88c4d87464",
                                "name": "Perimeter West",
                                "alertOnCapture": false,
                                "isDefault": false
                              }
                            ],
                            "roles": [
                              {
                                "id": "4e480c12-cfea-4ac5-ab07-bd18e10a4f0e",
                                "name": "Loading Bay 3"
                              },
                              {
                                "id": "bfc48380-2ab2-4950-a017-ed992b562fa2",
                                "name": "Loading Bay 3"
                              }
                            ],
                            "vehicles": [
                              {
                                "id": "d7c63c3c-9642-4976-ac15-aed0c6e818b9",
                                "licensePlate": "LT-4471",
                                "plateType": "pariatur commodo ex",
                                "category": "minim",
                                "make": "Toyota",
                                "model": "labore quis veniam ullamco",
                                "color": "Black",
                                "newPlateCode": "elit ut aliqua sed",
                                "diplomaticCode": "nulla occaecat dolore",
                                "minorColor": "Blue",
                                "code": "occaecat consequat tempor",
                                "description": "Loading Bay 3",
                                "vinNumber": "consequat nulla",
                                "yearOfManufacture": 695,
                                "wanted": true,
                                "stolen": false,
                                "referenceNumber": "Lorem fugiat occaecat Duis",
                                "nationalNumber": "adipisicing sint enim reprehenderit minim",
                                "method": 2,
                                "department": "nisi consectetur",
                                "customField1": "sunt",
                                "customField2": "eiusmod sint magna",
                                "customField3": "incididunt sint",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "ut veniam",
                                  "est fugiat et aliqua"
                                ]
                              },
                              {
                                "id": "d6eec02d-efb0-4c77-a752-22e293cc6cc1",
                                "licensePlate": "M-QT-2048",
                                "plateType": "quis aliqua in adipisicing",
                                "category": "sint proident elit dolore amet",
                                "make": "Volkswagen",
                                "model": "occaecat proident",
                                "color": "White",
                                "newPlateCode": "ad",
                                "diplomaticCode": "proident reprehenderit",
                                "minorColor": "Silver",
                                "code": "elit",
                                "description": "Lobby Entrance",
                                "vinNumber": "eu",
                                "yearOfManufacture": 591,
                                "wanted": true,
                                "stolen": false,
                                "referenceNumber": "eu",
                                "nationalNumber": "magna deserunt officia quis",
                                "method": 4,
                                "department": "elit amet commodo adipisicing",
                                "customField1": "do fugiat ut",
                                "customField2": "ut voluptate nostrud",
                                "customField3": "exercitation ad dolor",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "incididunt ipsum in",
                                  "dolore sunt"
                                ]
                              }
                            ]
                          }
                        },
                        {
                          "mediaSource": {
                            "id": "e8595b37-a3f5-4ab3-a6d0-85f997860432",
                            "mediaSourceFqid": "occaecat minim dolor eu velit",
                            "name": "Perimeter West",
                            "serverId": "6741f942-3a28-4049-a9d9-4d4289ee4789",
                            "isActive": false,
                            "createdAt": "2026-07-27T09:14:33Z",
                            "floorNumber": 57,
                            "plan": 2,
                            "buildingName": "Lobby Entrance",
                            "address": "exercitation aliqua consequat quis dolore",
                            "mediaSourceIp": "10.0.4.21",
                            "mediaSourcePort": 554,
                            "mediaSourceUsername": "Perimeter West",
                            "mediaSourcePassword": "consectetur Lorem magna",
                            "longitude": 38.07,
                            "streamQuality": 407,
                            "streamFramesPerSecond": 417,
                            "streamWidth": 441,
                            "streamHeight": 107,
                            "latitude": 12.86,
                            "streamUrl": "rtsp://10.0.4.21:554/stream1",
                            "snapshotPath": "ipsum aliqua Ut",
                            "snapshotTakenAt": "2026-07-27T09:14:33Z",
                            "mediaSourceProviderType": 0
                          },
                          "detectionDate": 214,
                          "id": "56425ece-7898-47a5-a6c1-61243fcdbd69",
                          "minAge": 947,
                          "maxAge": 802,
                          "gender": 1,
                          "featureVector": "cupidatat enim quis",
                          "detectionConfidence": 76,
                          "recognized": false,
                          "boundingBox": "ex fugiat Excepteur",
                          "personRecognitionConfidence": 72,
                          "analyzerIdentifier": "elit",
                          "mediaSourceId": "daccfe65-ad58-46ac-af61-1913878e1d0c",
                          "mediaSourceName": "Perimeter West",
                          "enrolledPersonId": "5f83cd9c-9895-4e44-a04e-36f542156c57",
                          "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                          "imageId": "a458beb1-aff2-48c4-ad47-02a48a8d9e63",
                          "createdAt": "2026-07-27T09:14:33Z",
                          "triggerType": 0,
                          "hasFaceVehicleDetection": false,
                          "person": {
                            "id": "0b10c31f-258c-42ad-ad9f-fef020b7d62a",
                            "firstName": "Lobby Entrance",
                            "lastName": "Perimeter West",
                            "customField1": "aliqua sit minim nulla dolor",
                            "customField2": "id reprehenderit nisi veniam et",
                            "customField3": "voluptate dolor",
                            "createdAt": "2026-07-27T09:14:33Z",
                            "birthYear": 378,
                            "status": 0,
                            "relatedFaces": [
                              {
                                "id": "956589da-485e-4ee0-ab3e-077bb970ff7f",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 300,
                                "maxAge": 85,
                                "gender": 1,
                                "recognized": true,
                                "isDefault": true,
                                "faceImageName": "Parking Level 2",
                                "featureVector": "occaecat labore reprehenderit esse laboris",
                                "detectionConfidence": 72,
                                "enrolledPersonId": "e0e0b300-ba4f-44ab-a11c-634155b4e853",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              },
                              {
                                "id": "3228c7d0-b523-465c-a23f-c6f5d67b96bc",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "minAge": 56,
                                "maxAge": 74,
                                "gender": 0,
                                "recognized": true,
                                "isDefault": true,
                                "faceImageName": "Perimeter West",
                                "featureVector": "amet non incididunt",
                                "detectionConfidence": 81,
                                "enrolledPersonId": "ad1e17c2-cde9-4f2a-af97-7e713e9ee95b",
                                "analyzedImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg=="
                              }
                            ],
                            "groups": [
                              {
                                "id": "16f871a9-324e-47da-a105-5287936b1f6c",
                                "name": "Loading Bay 3",
                                "alertOnCapture": true,
                                "isDefault": true
                              },
                              {
                                "id": "c5517809-8870-4c30-ac90-491c7a38b5ef",
                                "name": "North Gate Camera",
                                "alertOnCapture": false,
                                "isDefault": true
                              }
                            ],
                            "roles": [
                              {
                                "id": "1303aa13-afc7-407d-a82f-4338fbf13f8c",
                                "name": "Perimeter West"
                              },
                              {
                                "id": "a4b7c6b8-357e-42a1-a194-e797f51a6715",
                                "name": "Perimeter West"
                              }
                            ],
                            "vehicles": [
                              {
                                "id": "8611d8a5-b302-4543-a9cc-257bd17aa668",
                                "licensePlate": "M-QT-2048",
                                "plateType": "mollit laborum sunt minim voluptate",
                                "category": "ex esse sint",
                                "make": "Mercedes-Benz",
                                "model": "cupidatat adipisicing dolor et",
                                "color": "Black",
                                "newPlateCode": "exercitation esse adipisicing",
                                "diplomaticCode": "eiusmod consectetur ut Ut ullamco",
                                "minorColor": "Blue",
                                "code": "sint tempor dolore",
                                "description": "North Gate Camera",
                                "vinNumber": "ipsum ut exercitation",
                                "yearOfManufacture": 872,
                                "wanted": false,
                                "stolen": true,
                                "referenceNumber": "ullamco cillum dolor nostrud ut",
                                "nationalNumber": "labore officia culpa",
                                "method": 2,
                                "department": "consectetur nulla exercitation",
                                "customField1": "ut in",
                                "customField2": "adipisicing labore dolore dolor ipsum",
                                "customField3": "laborum proident in exercitation irure",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "dolor magna ad",
                                  "elit"
                                ]
                              },
                              {
                                "id": "b8a75f73-8d48-48b1-ad06-f3db2043a5b8",
                                "licensePlate": "7-XKR-903",
                                "plateType": "adipisicing tempor magna laborum Duis",
                                "category": "dolor enim pariatur aliqua et",
                                "make": "Toyota",
                                "model": "dolore culpa voluptate aliqua deserunt",
                                "color": "White",
                                "newPlateCode": "culpa laboris in ut officia",
                                "diplomaticCode": "aliquip esse anim incididunt consequat",
                                "minorColor": "Black",
                                "code": "cupidatat sed laboris",
                                "description": "North Gate Camera",
                                "vinNumber": "magna amet sint elit anim",
                                "yearOfManufacture": 28,
                                "wanted": false,
                                "stolen": true,
                                "referenceNumber": "tempor anim velit incididunt ex",
                                "nationalNumber": "mollit aliquip sunt nisi",
                                "method": 3,
                                "department": "dolor consequat et esse dolore",
                                "customField1": "id ex labore laboris",
                                "customField2": "aute",
                                "customField3": "pariatur est commodo irure cillum",
                                "vehicleImage": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                                "createdAt": "2026-07-27T09:14:33Z",
                                "modifiedAt": "2026-07-27T09:14:33Z",
                                "enrolledPersonNames": [
                                  "sint velit",
                                  "aute consectetur aliqua sed id"
                                ]
                              }
                            ]
                          }
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_FaceDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List face detections",
        "description": "Paged `FetchResponse`: `totalCount` beside `data`, `message` is the\ntiming string. Biometric data - treat responses accordingly.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataFace"
      }
    },
    "/api/data/face/{id}/image": {
      "get": {
        "tags": [
          "Vfr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a face crop",
        "description": "The cropped face, base64 in `data`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataFaceByIdImage"
      }
    },
    "/api/data/face/{id}/full-frame-image": {
      "get": {
        "tags": [
          "Vfr"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ByteList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_ValidationErrorList"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a face detection's full frame",
        "description": "The whole frame, base64 in `data`. Same facade call as the crop with a\ndifferent flag - the only difference is how much of the scene you get.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getDataFaceByIdFullFrameImage"
      }
    },
    "/api/data/vfr/widgets/{dashboardWidgetId}/kpi": {
      "post": {
        "tags": [
          "VfrDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "value": 35.57,
                        "previousValue": 61.3,
                        "deltaPct": 37.99,
                        "label": "Lobby Entrance",
                        "status": "ad",
                        "timestamp": "2026-07-27T09:14:33Z",
                        "sparkline": [
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 98.46
                          },
                          {
                            "timestamp": "2026-07-27T09:14:33Z",
                            "value": 93.73
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_KpiPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a KPI widget's value (face-recognition)",
        "description": "A single headline number with its comparison against the previous period - what a KPI tile renders.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataVfrWidgetsByDashboardWidgetKpi"
      }
    },
    "/api/data/vfr/widgets/{dashboardWidgetId}/series": {
      "post": {
        "tags": [
          "VfrDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "series": [
                          {
                            "name": "Perimeter West",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 92.19
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 61
                              }
                            ]
                          },
                          {
                            "name": "Loading Bay 3",
                            "points": [
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 26.27
                              },
                              {
                                "timestamp": "2026-07-27T09:14:33Z",
                                "value": 19.14
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_SeriesPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a time-series widget's data (face-recognition)",
        "description": "Points over time, already bucketed by the interval the widget is configured with. Do not re-aggregate client-side.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataVfrWidgetsByDashboardWidgetSeries"
      }
    },
    "/api/data/vfr/widgets/{dashboardWidgetId}/buckets": {
      "post": {
        "tags": [
          "VfrDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "Ut aute do ut officia",
                            "label": "North Gate Camera",
                            "value": 41.76,
                            "durationSeconds": 76.83
                          },
                          {
                            "key": "id aute Excepteur",
                            "label": "Parking Level 2",
                            "value": 96.98,
                            "durationSeconds": 32.28
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_BucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a bucketed widget's data (face-recognition)",
        "description": "Counts grouped by a categorical dimension - by camera, by class, by hour of day - for a bar or pie chart.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataVfrWidgetsByDashboardWidgetBuckets"
      }
    },
    "/api/data/vfr/widgets/{dashboardWidgetId}/stacked-buckets": {
      "post": {
        "tags": [
          "VfrDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetDataRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "buckets": [
                          {
                            "key": "officia tempor veniam Excepteur sunt",
                            "label": "Perimeter West",
                            "segments": [
                              {
                                "name": "Loading Bay 3",
                                "value": 60.47
                              },
                              {
                                "name": "Loading Bay 3",
                                "value": 37.47
                              }
                            ]
                          },
                          {
                            "key": "proident consectetur",
                            "label": "Perimeter West",
                            "segments": [
                              {
                                "name": "North Gate Camera",
                                "value": 15
                              },
                              {
                                "name": "North Gate Camera",
                                "value": 67.45
                              }
                            ]
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_StackedBucketsPayload"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a stacked-bucket widget's data (face-recognition)",
        "description": "Buckets split by a second dimension, for a stacked bar chart. The extra series come back inside the payload, not as separate calls.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataVfrWidgetsByDashboardWidgetStackedBuckets"
      }
    },
    "/api/data/vfr/widgets/{dashboardWidgetId}/rows": {
      "post": {
        "tags": [
          "VfrDashboard"
        ],
        "parameters": [
          {
            "name": "dashboardWidgetId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetRowsRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetRowsRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/GetVfrWidgetRowsRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "totalCount": 434,
                        "data": [
                          {
                            "columns": {
                              "non_9b": {},
                              "mollit35": {},
                              "in_c_d": {},
                              "dolor1": {},
                              "ipsum58e": {},
                              "sit_de8": {},
                              "pariatur__": {},
                              "adipisicing_3": {},
                              "officia_a06": {},
                              "eiusmod_fff": {}
                            }
                          },
                          {
                            "columns": {
                              "do_c8": {},
                              "laboruma": {},
                              "elit_a16": {},
                              "qui_4": {}
                            }
                          }
                        ],
                        "durationSeconds": 140
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_PageResponse_WidgetRowDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get a table widget's rows (face-recognition)",
        "description": "The detail rows behind a table widget. This is the largest payload on the tag - expect it to dominate dashboard load time.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postDataVfrWidgetsByDashboardWidgetRows"
      }
    },
    "/api/configuration/basic/watchlist": {
      "post": {
        "tags": [
          "Watchlist"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AddWatchListRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/AddWatchListRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/AddWatchListRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a watchlist",
        "description": "**The declared response schema is wrong.** The spec says\n`BaseResponse<bool>`, but the controller returns\n`BuildOkResponse(watchlistId)` - so on a real instance `data` is the new\nwatchlist's **GUID string**, not `true`. The mock serves the declared\n(boolean) shape. Code against the GUID.\n\nA rejected create returns `400` with `Failed to add watchlist` in\n`message`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postWatchlist"
      },
      "patch": {
        "tags": [
          "Watchlist"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWatchListRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWatchListRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWatchListRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "417": {
            "description": "Expectation Failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Expectation Failed",
                    "value": {
                      "data": null,
                      "message": "Failed to publish the triggered event.",
                      "resultCode": 417
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a watchlist",
        "description": "The id travels in the body. Returns `200`/`data: true`, or **`304` with\nan empty body** when nothing was written.\n\n`417 Expectation Failed` is unusual and specific: the facade raises it\nthrough `BusinessRuleException` when the update would violate a\nwatchlist rule - for example changing the matching attributes in a way\nthe existing entries cannot satisfy.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `404` | `Prefer: code=404` | Not Found |\n| `417` | `Prefer: code=417` | Expectation Failed |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchWatchlist"
      },
      "delete": {
        "tags": [
          "Watchlist"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete one watchlist",
        "description": "The id travels as a query parameter, not in the path. Internally this is\nthe bulk delete with a single-element list.\n\nReturns `200`/`data: true`, or **`304` with an empty body** when nothing\nwas deleted - which is what an unknown id gives you.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteWatchlist"
      },
      "get": {
        "tags": [
          "Watchlist"
        ],
        "parameters": [
          {
            "name": "Page",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "schema": {
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "ExcludeDefault",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "TextSearch",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_WatchListDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "c592a3e7-c8a7-4ad5-acd2-bcfe35923722",
                          "name": "Lobby Entrance",
                          "isActive": true,
                          "isDefault": false,
                          "triggerAllOutputs": true,
                          "isDeleted": true,
                          "watchListGroupId": "f76c22ec-edfb-46fd-a122-98fee94e80d7",
                          "outputIds": [
                            "68a052ce-4dec-41e1-aa67-f037e1f3eed2",
                            "4baa4895-d0ee-429d-af94-e5ab9efc5aac"
                          ],
                          "vehicleSubjects": [
                            {
                              "id": "a66536b5-b215-4a9e-ad9d-7d6cb7f5c9a3",
                              "plateNumber": "AB-12-CD",
                              "vehicleColor": "Silver",
                              "vehicleMake": "Volkswagen",
                              "vehicleModel": "reprehenderit fugiat dolore",
                              "vehicleCategory": "Lorem",
                              "newPlateCode": "ipsum dolor magna Duis quis",
                              "diplomaticCode": "ex",
                              "minorColor": "Silver",
                              "code": "aute et do commodo ut",
                              "description": "Parking Level 2",
                              "vinNumber": "aute pariatur Lorem ad eu",
                              "yearOfManufacture": 565,
                              "wanted": true,
                              "stolen": true,
                              "referenceNumber": "eu",
                              "nationalNumber": "irure et pariatur in dolor",
                              "method": 3,
                              "department": "pariatur Ut",
                              "matchingAttributes": [
                                5,
                                6
                              ]
                            },
                            {
                              "id": "186cfbbd-0793-4358-ad31-ed5042838240",
                              "plateNumber": "ZH 88231",
                              "vehicleColor": "White",
                              "vehicleMake": "Hyundai",
                              "vehicleModel": "proident nostrud",
                              "vehicleCategory": "adipisicing aliquip laborum commodo",
                              "newPlateCode": "eiusmod voluptate Duis",
                              "diplomaticCode": "in",
                              "minorColor": "Blue",
                              "code": "dolor minim officia",
                              "description": "Lobby Entrance",
                              "vinNumber": "anim",
                              "yearOfManufacture": 599,
                              "wanted": false,
                              "stolen": false,
                              "referenceNumber": "mollit consectetur",
                              "nationalNumber": "exercitation laborum laboris",
                              "method": 1,
                              "department": "sit ipsum non dolore esse",
                              "matchingAttributes": [
                                3,
                                6
                              ]
                            }
                          ],
                          "zoneName": "Perimeter West",
                          "vehicleMatchingAttributes": [
                            1,
                            6
                          ],
                          "module": 304,
                          "personTriggerMode": 0,
                          "vehicleTriggerMode": 0,
                          "containerTriggerMode": 3,
                          "vehicleMatchOperator": 0,
                          "andOrVehicle": 1,
                          "enrolledVehicles": [
                            {
                              "enrolledVehicleId": "a1f10427-7f3e-44da-af3f-85bae0efcab0",
                              "matchingAttributes": [
                                7,
                                2
                              ]
                            },
                            {
                              "enrolledVehicleId": "1d39bd6e-3cec-4488-accc-17d53a4ab975",
                              "matchingAttributes": [
                                3,
                                2
                              ]
                            }
                          ],
                          "personIds": [
                            "575de8a1-fff7-4f38-af1a-eb274006c2d7",
                            "0e2f45ca-aa84-42b7-a34f-e80dcd113a90"
                          ],
                          "andOrContainer": 1,
                          "containerCodes": [
                            "Ut aliquip est irure cillum",
                            "magna esse in eiusmod"
                          ],
                          "watchListGroup": {
                            "id": "598b7780-a43b-402d-af91-e18c2b36ec5f",
                            "name": "North Gate Camera",
                            "isActive": false,
                            "isDefault": true,
                            "triggerAllOutputs": true,
                            "triggerType": 0,
                            "isDeleted": false,
                            "mediaSourceIds": [
                              "307386b5-5e50-4654-aca1-e1a0b77b0bec",
                              "73899150-abfe-42aa-a674-2fcbf718dfee"
                            ],
                            "mediaSourceGroupIds": [
                              "0b870a42-96f5-47b1-a7ba-5d0a1d6337f8",
                              "75349540-54ed-4fb6-a23e-b46ff7afef69"
                            ],
                            "outputIds": [
                              "60b1e3a7-b0d1-4265-aae5-73abd8a911a7",
                              "92e483df-635e-4e57-af63-7f2cc7e86e32"
                            ],
                            "permissions": [
                              {
                                "id": "9045b20b-e7ba-4b24-a200-a1819b72c65e",
                                "name": "Loading Bay 3",
                                "permission": 718,
                                "watchListGroupId": "5a0a7171-6a01-4d5b-a4bc-0cc4378fd57a"
                              },
                              {
                                "id": "dd0629e0-06a2-45be-a7b8-2123427c1609",
                                "name": "Lobby Entrance",
                                "permission": 765,
                                "watchListGroupId": "e2daccb5-5dfa-42a8-a5af-0e91c0b9a208"
                              }
                            ]
                          }
                        },
                        {
                          "id": "12e2e4fa-ba94-4df0-ad77-52e2c688ceee",
                          "name": "Perimeter West",
                          "isActive": false,
                          "isDefault": false,
                          "triggerAllOutputs": false,
                          "isDeleted": false,
                          "watchListGroupId": "3fd6add1-814a-49a8-a4fa-7890808387cf",
                          "outputIds": [
                            "e612adfe-600c-48a9-a7da-acb2b3acd59c",
                            "1122b651-1579-43e9-a986-d5e225bf8e3f"
                          ],
                          "vehicleSubjects": [
                            {
                              "id": "c0942d55-f183-4e01-a767-b25631f5b798",
                              "plateNumber": "AB-12-CD",
                              "vehicleColor": "White",
                              "vehicleMake": "Volkswagen",
                              "vehicleModel": "non velit est",
                              "vehicleCategory": "ut cupidatat laboris sed",
                              "newPlateCode": "est anim proident",
                              "diplomaticCode": "cupidatat commodo sint consequat",
                              "minorColor": "Silver",
                              "code": "laboris mollit ea",
                              "description": "North Gate Camera",
                              "vinNumber": "sint Excepteur ad nisi est",
                              "yearOfManufacture": 523,
                              "wanted": false,
                              "stolen": true,
                              "referenceNumber": "eiusmod nisi esse",
                              "nationalNumber": "qui cupidatat voluptate Ut incididunt",
                              "method": 4,
                              "department": "commodo voluptate officia sit sed",
                              "matchingAttributes": [
                                5,
                                3
                              ]
                            },
                            {
                              "id": "1b7c19bf-8891-41ae-a77f-f39b4c413546",
                              "plateNumber": "M-QT-2048",
                              "vehicleColor": "Black",
                              "vehicleMake": "Volkswagen",
                              "vehicleModel": "Ut pariatur",
                              "vehicleCategory": "mollit",
                              "newPlateCode": "nostrud",
                              "diplomaticCode": "et dolore voluptate",
                              "minorColor": "Blue",
                              "code": "laborum",
                              "description": "Parking Level 2",
                              "vinNumber": "ut laborum",
                              "yearOfManufacture": 975,
                              "wanted": false,
                              "stolen": false,
                              "referenceNumber": "sint reprehenderit non qui dolor",
                              "nationalNumber": "tempor nulla qui cupidatat amet",
                              "method": 1,
                              "department": "ut ad sunt elit",
                              "matchingAttributes": [
                                7,
                                1
                              ]
                            }
                          ],
                          "zoneName": "North Gate Camera",
                          "vehicleMatchingAttributes": [
                            3,
                            4
                          ],
                          "module": 302,
                          "personTriggerMode": 1,
                          "vehicleTriggerMode": 2,
                          "containerTriggerMode": 2,
                          "vehicleMatchOperator": 1,
                          "andOrVehicle": 1,
                          "enrolledVehicles": [
                            {
                              "enrolledVehicleId": "a8b1474a-2250-4a7e-a769-76cc30f8eeb9",
                              "matchingAttributes": [
                                6,
                                1
                              ]
                            },
                            {
                              "enrolledVehicleId": "e178b916-986d-40b7-abba-c2d5e753af31",
                              "matchingAttributes": [
                                1,
                                2
                              ]
                            }
                          ],
                          "personIds": [
                            "f0d0b925-22db-4357-ac47-362eb1800dba",
                            "b04c13c7-ea32-4986-a0e7-bcd794905c6d"
                          ],
                          "andOrContainer": 1,
                          "containerCodes": [
                            "ad",
                            "veniam enim pariatur dolore"
                          ],
                          "watchListGroup": {
                            "id": "ab5e3a74-167a-4959-ada9-0ece3e78b742",
                            "name": "Parking Level 2",
                            "isActive": true,
                            "isDefault": true,
                            "triggerAllOutputs": true,
                            "triggerType": 1,
                            "isDeleted": true,
                            "mediaSourceIds": [
                              "9dee27f1-4af5-466d-a8a9-af6cd98e3e47",
                              "7f17744f-99d4-475d-a4e1-3e9a9a654df1"
                            ],
                            "mediaSourceGroupIds": [
                              "84f5c342-93ae-4b8d-a9a3-b7fa4d92ca7d",
                              "9a13179d-a24d-426d-a236-803ef7395a33"
                            ],
                            "outputIds": [
                              "5aa14489-de0c-43cd-a66f-428aed89f4c1",
                              "78234f40-1f27-4f20-a278-f9a39ad9d718"
                            ],
                            "permissions": [
                              {
                                "id": "4f6ec89a-08b0-4a20-a7e4-aad9b9fec56b",
                                "name": "North Gate Camera",
                                "permission": 577,
                                "watchListGroupId": "0948accd-b72f-45bf-acf4-5203df9258db"
                              },
                              {
                                "id": "cafbc3a2-0e65-4f9b-a5fc-af05f831e524",
                                "name": "Lobby Entrance",
                                "permission": 227,
                                "watchListGroupId": "0d22afed-2a41-42b1-a6dc-137ad98b287a"
                              }
                            ]
                          }
                        }
                      ],
                      "message": "This request took 0.42 seconds",
                      "resultCode": 200,
                      "totalCount": 2
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_WatchListDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/FetchResponse_WatchListDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List watchlists",
        "description": "Paged `FetchResponse`: `totalCount` sits beside `data` at the top level,\nnot inside it, and `message` is the timing string.\n\nWatchlists hold the plates and vehicle attributes that raise alarms on a\nmatch. This is personal data; treat responses accordingly.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getWatchlist"
      }
    },
    "/api/configuration/basic/watchlist/import": {
      "post": {
        "tags": [
          "Watchlist"
        ],
        "requestBody": {
          "content": {
            "multipart/form-data": {
              "schema": {
                "required": [
                  "File"
                ],
                "type": "object",
                "properties": {
                  "File": {
                    "type": "string",
                    "format": "binary"
                  }
                }
              },
              "encoding": {
                "File": {
                  "style": "form"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListImportResultDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "totalRows": 155,
                        "importedWatchLists": 128,
                        "createdWatchListGroups": 742,
                        "skippedExistingRows": 190,
                        "invalidRows": 738,
                        "importedPlates": 580,
                        "importedEnrolledVehicles": 83,
                        "rejectionReason": "ipsum consequat irure dolore dolor",
                        "errorsTruncated": true,
                        "errors": [
                          {
                            "rowNumber": 351,
                            "message": "qui proident ex in"
                          },
                          {
                            "rowNumber": 515,
                            "message": "sit officia proident aliquip"
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListImportResultDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListImportResultDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "413": {
            "description": "Content Too Large",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                },
                "examples": {
                  "default": {
                    "summary": "Content Too Large",
                    "value": {
                      "type": "https://tools.ietf.org/html/rfc9110#section-15.5.14",
                      "title": "Request body too large.",
                      "status": 413
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Import watchlists from CSV",
        "description": "`multipart/form-data` with a `file` part. Get the expected layout from\n`GET /api/configuration/basic/watchlist/import/template` first.\n\n**A partial failure is reported as `400` with a full result body.** When\nthe import is rejected the response is\n`BaseResponse<WatchListImportResultDto>` - `data` holds the per-row\noutcome and `message` holds the rejection reason. That is a different\nshape from the `BaseResponse<string>` the spec declares for `400`, so\nread `data` before assuming it is null.\n\n**Hard limit 10 MB.** Exceeding it returns `413` as RFC 7807\nProblemDetails from ASP.NET, not the envelope. An empty or absent file\npart returns `400` with `CSV file is required.`\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `413` | `Prefer: code=413` | Content Too Large |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postWatchlistImport"
      }
    },
    "/api/configuration/basic/watchlist/import/template": {
      "get": {
        "tags": [
          "Watchlist"
        ],
        "responses": {
          "200": {
            "description": "The CSV template. Header row only. The column list in the example is verbatim from a live instance but truncated after `vehicleMake` - the real file has more columns.",
            "content": {
              "text/csv": {
                "schema": {
                  "type": "string"
                },
                "example": "watchListId,watchListGroupId,name,zoneName,targetType,enrolledVehicleId,plateNumber,vehicleColor,vehicleMake\n"
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "text/csv": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Download the CSV import template",
        "description": "Returns `watchlist-import-template.csv` as `text/csv` - a header row only,\nno data rows. Feed the filled-in file back to\n`POST /api/configuration/basic/watchlist/import`.\n\nThe exported spec declared no body for the `200`, because Swashbuckle\ncannot infer one from `IActionResult`, so the mock used to answer with an\nempty `200`. The content type and column list below were taken from a live\ninstance instead.\n\n**The column list is incomplete.** The probe that captured it truncated\nthe line after `vehicleMake`, and the instance was unreachable when this\nwas written, so the remaining columns are unknown. What is listed is\nverbatim from the wire; nothing has been guessed. Fetch the template from\na real instance before relying on the full set.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | The CSV template. Header row only. The column list in the example is verbatim from a live  |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getWatchlistImportTemplate"
      }
    },
    "/api/configuration/basic/watchlist/vehicle-matching-attributes": {
      "get": {
        "tags": [
          "Watchlist"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnumOptionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "value": 206,
                          "name": "North Gate Camera"
                        },
                        {
                          "value": 921,
                          "name": "Perimeter West"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnumOptionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_EnumOptionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List the vehicle attributes a watchlist can match on",
        "description": "Enumerates `VehicleMatchingAttribute` as `{value, name}` pairs, built\nfrom the enum at request time. Use it to populate a picker rather than\nhard-coding the numbers - `value` is what you send back on a watchlist.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getWatchlistVehicleMatchingAttributes"
      }
    },
    "/api/configuration/basic/watchlist/bulk-delete": {
      "post": {
        "tags": [
          "Watchlist"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete several watchlists",
        "description": "Body is the list of ids, validated by `[NotEmptyGuidList]`. Returns\n`200`/`data: true`, or `304` when nothing matched.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postWatchlistBulkDelete"
      }
    },
    "/api/configuration/basic/watchlist/by-ids": {
      "post": {
        "tags": [
          "Watchlist"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "3b5043f0-e1ac-4758-a86b-8cea291e82f7",
                          "name": "Parking Level 2",
                          "isActive": true,
                          "isDefault": true,
                          "triggerAllOutputs": true,
                          "isDeleted": true,
                          "watchListGroupId": "15a0429f-aa4c-4034-a84d-d76ecba4f0a2",
                          "outputIds": [
                            "adf7bc7e-fe81-4de5-a055-d253cd61b4aa",
                            "e545a97d-d99b-4cef-a175-19d3424e2b2c"
                          ],
                          "vehicleSubjects": [
                            {
                              "id": "d885814a-db75-46d1-aa38-25335feae03e",
                              "plateNumber": "ZH 88231",
                              "vehicleColor": "White",
                              "vehicleMake": "Toyota",
                              "vehicleModel": "incididunt ex voluptate non",
                              "vehicleCategory": "sunt",
                              "newPlateCode": "proident ea nulla nostrud ut",
                              "diplomaticCode": "amet anim in",
                              "minorColor": "Red",
                              "code": "proident in velit",
                              "description": "Perimeter West",
                              "vinNumber": "in aute sunt elit eiusmod",
                              "yearOfManufacture": 21,
                              "wanted": false,
                              "stolen": false,
                              "referenceNumber": "in incididunt",
                              "nationalNumber": "ex",
                              "method": 3,
                              "department": "nulla labore proident sed enim",
                              "matchingAttributes": [
                                7,
                                7
                              ]
                            },
                            {
                              "id": "d8f519ef-d228-49df-a049-7b8a3718a79f",
                              "plateNumber": "7-XKR-903",
                              "vehicleColor": "White",
                              "vehicleMake": "Nissan",
                              "vehicleModel": "dolore non in amet",
                              "vehicleCategory": "anim id sit",
                              "newPlateCode": "Ut adipisicing incididunt cupidatat commodo",
                              "diplomaticCode": "occaecat in",
                              "minorColor": "Blue",
                              "code": "culpa amet Ut veniam irure",
                              "description": "Lobby Entrance",
                              "vinNumber": "dolor in culpa",
                              "yearOfManufacture": 707,
                              "wanted": false,
                              "stolen": false,
                              "referenceNumber": "incididunt qui Lorem tempor",
                              "nationalNumber": "exercitation",
                              "method": 1,
                              "department": "in exercitation",
                              "matchingAttributes": [
                                1,
                                7
                              ]
                            }
                          ],
                          "zoneName": "North Gate Camera",
                          "vehicleMatchingAttributes": [],
                          "module": 105,
                          "personTriggerMode": 3,
                          "vehicleTriggerMode": 3,
                          "containerTriggerMode": 2,
                          "vehicleMatchOperator": 1,
                          "andOrVehicle": 1,
                          "enrolledVehicles": [
                            {
                              "enrolledVehicleId": "60e2bb10-583c-4596-ac57-4dec6c9858de",
                              "matchingAttributes": []
                            },
                            {
                              "enrolledVehicleId": "2bfa3c44-c54b-4010-af94-89dc239e55c4",
                              "matchingAttributes": []
                            }
                          ],
                          "personIds": [
                            "0a919d5a-e3f2-4999-a585-a5dec842f92e",
                            "81039e36-2d8b-4546-a197-019a57374e94"
                          ],
                          "andOrContainer": 0,
                          "containerCodes": [
                            "fugiat velit eiusmod",
                            "Lorem id sunt voluptate"
                          ],
                          "watchListGroup": {
                            "id": "5a929c73-3b51-48af-ad83-25dd40d9e35f",
                            "name": "Perimeter West",
                            "isActive": true,
                            "isDefault": false,
                            "triggerAllOutputs": false,
                            "triggerType": 0,
                            "isDeleted": false,
                            "mediaSourceIds": [
                              "5aae8fae-fd85-4a6c-a686-c07fa70c49ea",
                              "b366c925-afa1-4e99-abba-e35189115a75"
                            ],
                            "mediaSourceGroupIds": [
                              "0c93d62b-0558-45d4-a23f-f0d4ec173a36",
                              "18a585a0-6c74-4cd0-ab5a-1756f3dc9053"
                            ],
                            "outputIds": [
                              "e3ac2761-1846-4774-a44a-20cf3c084d5e",
                              "2c0de46d-63ea-4a50-a9d3-4d475ebb23ff"
                            ],
                            "permissions": [
                              {
                                "id": "923bdd7c-d025-42ba-a68e-a9325cd7acb0",
                                "name": "Lobby Entrance",
                                "permission": 177,
                                "watchListGroupId": "d41146b2-dc6a-4af9-a796-99947977c450"
                              },
                              {
                                "id": "b3387b80-6946-47d7-a0c6-c6164213adc0",
                                "name": "Perimeter West",
                                "permission": 447,
                                "watchListGroupId": "971daed4-7829-486b-a35b-ff44bb59931c"
                              }
                            ]
                          }
                        },
                        {
                          "id": "1796014a-54df-4adb-a3ac-4e5ad4db2da4",
                          "name": "Loading Bay 3",
                          "isActive": true,
                          "isDefault": false,
                          "triggerAllOutputs": false,
                          "isDeleted": false,
                          "watchListGroupId": "948b4b20-7748-42ad-a943-6f75e101a8a3",
                          "outputIds": [
                            "3ee3a04b-c4fe-4a26-a92a-face93f071d4",
                            "bdca4693-15ea-4451-ad04-49cd74b4bd35"
                          ],
                          "vehicleSubjects": [
                            {
                              "id": "030bdc33-aacb-4349-a566-6547dadf2266",
                              "plateNumber": "M-QT-2048",
                              "vehicleColor": "Black",
                              "vehicleMake": "Nissan",
                              "vehicleModel": "pariatur tempor Lorem in",
                              "vehicleCategory": "deserunt sunt ipsum voluptate ut",
                              "newPlateCode": "magna aute ad id",
                              "diplomaticCode": "cillum elit eu ullamco",
                              "minorColor": "White",
                              "code": "ex",
                              "description": "Perimeter West",
                              "vinNumber": "occaecat nulla reprehenderit dolore adipisicing",
                              "yearOfManufacture": 236,
                              "wanted": false,
                              "stolen": false,
                              "referenceNumber": "voluptate",
                              "nationalNumber": "amet",
                              "method": 4,
                              "department": "mollit est consectetur officia ullamco",
                              "matchingAttributes": [
                                2,
                                6
                              ]
                            },
                            {
                              "id": "5f2f5f01-c76a-4ebb-a714-5c9966f98313",
                              "plateNumber": "B 227 HK",
                              "vehicleColor": "Red",
                              "vehicleMake": "Toyota",
                              "vehicleModel": "ad cupidatat Duis dolor labore",
                              "vehicleCategory": "ad ipsum in elit",
                              "newPlateCode": "cillum in nostrud ullamco",
                              "diplomaticCode": "ex dolore ut amet",
                              "minorColor": "Blue",
                              "code": "ex in ea laboris pariatur",
                              "description": "Lobby Entrance",
                              "vinNumber": "sint incididunt",
                              "yearOfManufacture": 587,
                              "wanted": false,
                              "stolen": false,
                              "referenceNumber": "dolor aute Lorem",
                              "nationalNumber": "dolore aliqua proident dolor ea",
                              "method": 2,
                              "department": "minim commodo adipisicing non et",
                              "matchingAttributes": [
                                2,
                                6
                              ]
                            }
                          ],
                          "zoneName": "Parking Level 2",
                          "vehicleMatchingAttributes": [],
                          "module": 301,
                          "personTriggerMode": 1,
                          "vehicleTriggerMode": 0,
                          "containerTriggerMode": 2,
                          "vehicleMatchOperator": 1,
                          "andOrVehicle": 1,
                          "enrolledVehicles": [
                            {
                              "enrolledVehicleId": "ea22c15f-ef54-4b6b-a113-3169fb295e11",
                              "matchingAttributes": []
                            },
                            {
                              "enrolledVehicleId": "e710c206-f953-49c3-a2b9-d1bfd33a8602",
                              "matchingAttributes": []
                            }
                          ],
                          "personIds": [
                            "b6e1972c-e157-4677-af6f-dcd0094a6dd1",
                            "86b1af5e-4526-4ed1-a842-16870f6dc5b5"
                          ],
                          "andOrContainer": 0,
                          "containerCodes": [
                            "proident sint in minim",
                            "dolor ut"
                          ],
                          "watchListGroup": {
                            "id": "0fbcfe95-a083-484f-af00-2778a6f0801f",
                            "name": "Perimeter West",
                            "isActive": false,
                            "isDefault": true,
                            "triggerAllOutputs": false,
                            "triggerType": 1,
                            "isDeleted": true,
                            "mediaSourceIds": [
                              "6b064069-8357-4eff-a95a-b1e6f672e2f5",
                              "fd323ea0-c454-49ab-a7cf-0cc7e0dd0108"
                            ],
                            "mediaSourceGroupIds": [
                              "6b165e1b-3c2e-455f-a6aa-cb8fde1f433d",
                              "4ee7b160-5d7c-441d-aeb1-ac08a8660078"
                            ],
                            "outputIds": [
                              "7caea131-8d8f-4ebf-af0e-ac0469dac3ed",
                              "db10b081-999a-43c0-a41d-60be6b171a49"
                            ],
                            "permissions": [
                              {
                                "id": "0e38a03c-16c9-4bf8-a483-c9a0f48800fe",
                                "name": "Lobby Entrance",
                                "permission": 603,
                                "watchListGroupId": "dcb2ba35-8f80-4bd1-aca7-477f69f9e903"
                              },
                              {
                                "id": "d09fe2b5-3cfb-421d-ac8f-fcefc6be6331",
                                "name": "Loading Bay 3",
                                "permission": 558,
                                "watchListGroupId": "e6576f47-48a7-4d56-abc0-1fd02bcf475a"
                              }
                            ]
                          }
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Fetch watchlists by id",
        "description": "A `POST` that reads: the body is the list of ids, so it is not limited by\nURL length the way a repeated query parameter would be. Validated by\n`[NotEmptyGuidList]`.\n\nReturns a plain `BaseResponse` list - no `totalCount`, no paging.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postWatchlistByIds"
      }
    },
    "/api/configuration/basic/watchlist/{watchListId}/group": {
      "get": {
        "tags": [
          "Watchlist"
        ],
        "parameters": [
          {
            "name": "watchListId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListGroupDto"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": {
                        "id": "b7f6eb30-ad21-4c35-ab12-2f3ee57485f2",
                        "name": "Perimeter West",
                        "isActive": true,
                        "isDefault": true,
                        "triggerAllOutputs": true,
                        "triggerType": 1,
                        "isDeleted": true,
                        "mediaSourceIds": [
                          "412431a5-b54a-4d1a-acbe-97456d566b41",
                          "0c053e03-a580-4c38-abe6-e32be276f7f0"
                        ],
                        "mediaSourceGroupIds": [
                          "0b536cbe-7c12-4e71-aabd-d055ed1ede14",
                          "e44d892e-51fe-4fd1-a6c0-a2edc6150005"
                        ],
                        "outputIds": [
                          "1d587688-957b-43b8-a7c7-724a699e2eb2",
                          "9a574b3a-8abc-47b8-a4ae-2c737c9824e6"
                        ],
                        "permissions": [
                          {
                            "id": "d53dfa09-80c1-4509-a4fe-cf4d208883bf",
                            "name": "Perimeter West",
                            "permission": 76,
                            "watchListGroupId": "1fc2270a-aa62-4404-aa0f-3ecb167acb0c"
                          },
                          {
                            "id": "f84b55b9-2648-4a95-a143-9470bc7f424b",
                            "name": "Lobby Entrance",
                            "permission": 900,
                            "watchListGroupId": "1d40c724-8538-4231-a78a-92b20599a2b6"
                          }
                        ]
                      },
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListGroupDto"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListGroupDto"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Get the group a watchlist belongs to",
        "description": "Returns the single `WatchListGroupDto` owning this watchlist. Groups are\nwhat permissions are attached to, so this is how you find out who can\nsee a given watchlist.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getWatchlistByWatchListGroup"
      }
    },
    "/api/configuration/basic/watchlist-group": {
      "post": {
        "tags": [
          "WatchlistGroup"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WatchListGroupDto"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/WatchListGroupDto"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/WatchListGroupDto"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": "c7e3e06c-4c62-4ed0-ad27-31d58693896a",
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Guid"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Create a watchlist group",
        "description": "Returns the new group's id in `data`. A rejected create returns `400`\nwith `Failed to add watchlist group`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postWatchlistGroup"
      },
      "patch": {
        "tags": [
          "WatchlistGroup"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWatchlistGroupRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWatchlistGroupRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/UpdateWatchlistGroupRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update a watchlist group",
        "description": "The id travels in the body. Returns `200`/`data: true`, or **`304` with\nan empty body** when nothing was written. No `400` is declared - a\nmalformed request surfaces as `304` or `500`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchWatchlistGroup"
      },
      "delete": {
        "tags": [
          "WatchlistGroup"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete one watchlist group",
        "description": "The id travels as a query parameter. `[NotDefaultWatchlistGroup]` blocks\nthe default group with a validation `400`.\n\nReturns `200`/`data: true`, or `304` when nothing was deleted.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteWatchlistGroup"
      },
      "get": {
        "tags": [
          "WatchlistGroup"
        ],
        "parameters": [
          {
            "name": "SessionId",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "SortOrder",
            "in": "query",
            "schema": {
              "$ref": "#/components/schemas/SearchSortOrder"
            }
          },
          {
            "name": "From",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "To",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "Page",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 10000000,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          },
          {
            "name": "Count",
            "in": "query",
            "required": true,
            "schema": {
              "maximum": 2147483647,
              "minimum": 1,
              "type": "integer",
              "format": "int32"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListGroupDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "99911dbd-23a3-4483-a49b-4661f8408746",
                          "name": "Perimeter West",
                          "isActive": false,
                          "isDefault": false,
                          "triggerAllOutputs": true,
                          "triggerType": 0,
                          "isDeleted": true,
                          "mediaSourceIds": [
                            "76a9b6ee-5698-44f4-ab8f-0585d2df6e35",
                            "a94d4141-5f45-4942-aa17-aa3e9f1da85a"
                          ],
                          "mediaSourceGroupIds": [
                            "59c1f909-4588-4bf7-a00d-e8af6c5c3e1f",
                            "7431cfab-33e3-4f5e-a562-e158d15d4f81"
                          ],
                          "outputIds": [
                            "d64debc3-89bc-4b28-a4dc-a6d6737babb0",
                            "ff02046d-3018-4766-a22b-4652a621252f"
                          ],
                          "permissions": [
                            {
                              "id": "a4706f10-6030-4e80-a3f7-68e56c2f69a4",
                              "name": "Lobby Entrance",
                              "permission": 618,
                              "watchListGroupId": "ac3036a5-6925-448c-a4fd-2c1133877899"
                            },
                            {
                              "id": "f26623f8-19a7-4bfb-a8d0-de4078b7426b",
                              "name": "Perimeter West",
                              "permission": 591,
                              "watchListGroupId": "c85490f1-8fc7-4605-a07c-177c1a5043b3"
                            }
                          ]
                        },
                        {
                          "id": "1f801200-e919-4ae0-a7af-e2a3af5efffc",
                          "name": "Perimeter West",
                          "isActive": true,
                          "isDefault": false,
                          "triggerAllOutputs": false,
                          "triggerType": 0,
                          "isDeleted": true,
                          "mediaSourceIds": [
                            "5780758d-3a9d-4927-a165-8dca359938b9",
                            "31f37796-5fc8-4cc6-aaf5-a5cb2de48391"
                          ],
                          "mediaSourceGroupIds": [
                            "76eb76bb-b620-4c35-afa7-5c4bd8184437",
                            "e8465939-c61c-4cbb-a699-8b8e509d338a"
                          ],
                          "outputIds": [
                            "9b1b8bb1-f211-4009-a812-733b43e70168",
                            "75d6368a-7091-4520-ac8c-1b5c504bd139"
                          ],
                          "permissions": [
                            {
                              "id": "53e8ba61-b49a-4f78-a8b3-18a3db26c80a",
                              "name": "Loading Bay 3",
                              "permission": 466,
                              "watchListGroupId": "1a4643b3-7133-4e37-ad35-354fd909acdc"
                            },
                            {
                              "id": "294d720f-dd08-4c3e-a01a-2e9cfb68d9c7",
                              "name": "Lobby Entrance",
                              "permission": 511,
                              "watchListGroupId": "fb40ede7-90eb-4b98-af8d-4e2443967c8a"
                            }
                          ]
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListGroupDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListGroupDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List watchlist groups",
        "description": "**The declared response schema is incomplete.** The spec says\n`BaseResponse<IList<WatchListGroupDto>>`, but the controller calls\n`BuildOkFetchResponse`, so a real instance returns a **`FetchResponse`** -\nan extra `totalCount` sits beside `data` and `message` is the timing string,\nnot `\"\"`. The mock serves the declared (narrower) shape.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getWatchlistGroup"
      }
    },
    "/api/configuration/basic/watchlist-group/bulk-delete": {
      "post": {
        "tags": [
          "WatchlistGroup"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": false,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Delete several watchlist groups",
        "description": "Body is the list of ids. `[NotDefaultWatchlistGroup]` applies to the\nwhole list: if the default group is in it, **nothing is deleted** and you\nget a validation `400`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postWatchlistGroupBulkDelete"
      }
    },
    "/api/configuration/basic/watchlist-group/{id}/permissions": {
      "get": {
        "tags": [
          "WatchlistGroup"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListGroupPermissionDtoList"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": [
                        {
                          "id": "f52c29c9-1236-4186-a72a-9b9a4d615a33",
                          "name": "Lobby Entrance",
                          "permission": 734,
                          "watchListGroupId": "2a6b2baa-5d2a-4629-a269-47cbdd1d6d71"
                        },
                        {
                          "id": "44abf866-c0b7-411e-ad68-68bf1fdd1765",
                          "name": "Parking Level 2",
                          "permission": 881,
                          "watchListGroupId": "e9af7a82-1f39-4790-ac22-fa6d1f2dc7a3"
                        }
                      ],
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListGroupPermissionDtoList"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_WatchListGroupPermissionDtoList"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "List a group's permissions",
        "description": "Who can see and edit the watchlists in this group. Permissions are held\non the group, never on an individual watchlist.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "getWatchlistGroupByIdPermissions"
      }
    },
    "/api/configuration/basic/watchlist-group/permissions": {
      "post": {
        "tags": [
          "WatchlistGroup"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WatchListGroupPermissionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/WatchListGroupPermissionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/WatchListGroupPermissionRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Grant watchlist-group permissions",
        "description": "Body is `{ \"watchlistGroupPermissions\": [...] }`. A null body or a null\nlist returns `400` with `Faulted Request`; anything the facade rejects\nreturns `400` with `Failed to add watchlist group permission`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postWatchlistGroupPermissions"
      },
      "patch": {
        "tags": [
          "WatchlistGroup"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WatchListGroupPermissionRequest"
              }
            },
            "text/json": {
              "schema": {
                "$ref": "#/components/schemas/WatchListGroupPermissionRequest"
              }
            },
            "application/*+json": {
              "schema": {
                "$ref": "#/components/schemas/WatchListGroupPermissionRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Update watchlist-group permissions",
        "description": "Same body shape as the grant. A null body or list returns `400` with\n`Faulted Request`. Otherwise `200`/`data: true`, or **`304`** when\nnothing was written.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "patchWatchlistGroupPermissions"
      },
      "delete": {
        "tags": [
          "WatchlistGroup"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Revoke one watchlist-group permission",
        "description": "Takes a single permission id as a query parameter.\n\nMarked for removal in favour of the bulk endpoint - see the `ZEN-2207`\nTODO on `WatchlistGroupController`. Prefer\n`POST /api/configuration/basic/watchlist-group/permissions/bulk-delete`\nin new code.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "deleteWatchlistGroupPermissions"
      }
    },
    "/api/configuration/basic/watchlist-group/permissions/bulk-delete": {
      "post": {
        "tags": [
          "WatchlistGroup"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "text/json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            },
            "application/*+json": {
              "schema": {
                "type": "array",
                "items": {
                  "type": "string",
                  "format": "uuid"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "data": true,
                      "message": "",
                      "resultCode": 200
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_Boolean"
                }
              }
            }
          },
          "304": {
            "description": "Not Modified"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only error status that does not use the envelope, so do not try to read `message` or `resultCode` off it. Content-Length is 0 and `WWW-Authenticate: Bearer` is set. Identical for a missing token and for a malformed or expired one; the two are indistinguishable from the response. Authentication also runs before model binding, so a request with a bad token AND an unparseable route parameter returns 401, never 400. Obtain a token from POST /auth/login. Zen.Analytics.Api never returns this - it has no authentication.",
            "headers": {
              "WWW-Authenticate": {
                "description": "Always the literal `Bearer`.",
                "schema": {
                  "type": "string",
                  "example": "Bearer"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInterceptorMiddleware, not through [Authorize] attributes - every Management controller carries a bare [Authorize] with no roles or policy.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Forbidden",
                    "value": {
                      "data": null,
                      "message": "User does not have permission to perform this operation.",
                      "resultCode": 403
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              },
              "text/plain": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              },
              "text/json": {
                "schema": {
                  "$ref": "#/components/schemas/BaseResponse_String"
                }
              }
            }
          }
        },
        "summary": "Revoke several watchlist-group permissions",
        "description": "Body is the list of permission ids, validated by `[NotEmptyGuidList]`.\nReturns `200`/`data: true`, or `304` when nothing matched. This is the\nendpoint to prefer over the single-id `DELETE`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `304` | `Prefer: code=304` | Not Modified |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `401` | `Prefer: code=401` | Unauthorized - No valid bearer token was presented. THE BODY IS EMPTY - this is the only e |\n| `403` | `Prefer: code=403` | Forbidden - Authenticated but not permitted. Enforcement is data-driven through AccessInte |\n| `500` | `Prefer: code=500` | Internal Server Error |\n",
        "x-doc-status": "curated",
        "operationId": "postWatchlistGroupPermissionsBulkDelete"
      }
    },
    "/auth/register": {
      "post": {
        "tags": [
          "Authentication"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RegisterRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Register a user (disabled on this deployment)",
        "description": "**This endpoint is unreachable as deployed.** `AccessInterceptorMiddleware`\nintercepts unauthenticated requests to `/auth/register` and returns\n**`404` with an empty body**, before Identity's handler runs. The 404 is\nnot declared in the spec and the mock does not serve it.\n\nThe endpoint is present only because `MapIdentityApi<ZUser>()` maps the\nwhole Identity route group. Create users through\n`POST /api/configuration/basic/user` instead, which goes through the\nnormal permission gate.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postAuthRegister"
      }
    },
    "/auth/login": {
      "post": {
        "tags": [
          "Authentication"
        ],
        "parameters": [
          {
            "name": "useCookies",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "useSessionCookies",
            "in": "query",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LoginRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccessTokenResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "tokenType": "non Ut fugiat quis",
                      "accessToken": "sunt aliqua magna minim laboris",
                      "expiresIn": 705,
                      "refreshToken": "eu"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Exchange credentials for a bearer token",
        "description": "The entry point for every integration. Returns an `AccessTokenResponse`:\n\n```json\n{\n  \"tokenType\": \"Bearer\",\n  \"accessToken\": \"CfDJ8...\",\n  \"expiresIn\": 3600,\n  \"refreshToken\": \"CfDJ8...\"\n}\n```\n\nSend `Authorization: Bearer <accessToken>` on every subsequent call and\nuse `POST /auth/refresh` before `expiresIn` elapses.\n\nPassing `?useCookies=true` switches the endpoint to cookie\nauthentication: the body comes back empty and the session lives in a\n`Set-Cookie` header instead. Do not mix the two in one client.\n\n### An empty 200 means the login failed\n\n`AccessInterceptorMiddleware.CheckUnAuthorizedEndpointAccessAsync` reads\nthe request body before Identity sees it and only forwards the request\nwhen the email or username matches a user whose `IsActive` flag is true.\nWhen it does not match - unknown user, deactivated user, or a body it\ncould not parse - the middleware **neither forwards the request nor\nwrites a response**, so the pipeline unwinds and the caller gets\n**`200 OK` with a zero-length body**.\n\nTreat \"200 with no `accessToken`\" as an authentication failure. Do not\nbranch on the status code alone.\n\nA genuine credential rejection that does reach Identity returns `401`\nwith an RFC 7807 body. Neither status is declared by the running\ninstance's spec, so neither is offered by the mock.\n\nThis path is on the license bypass list, so it works on an unlicensed\nsystem.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postAuthLogin"
      }
    },
    "/auth/refresh": {
      "post": {
        "tags": [
          "Authentication"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RefreshRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccessTokenResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "tokenType": "aute",
                      "accessToken": "in occaecat exercitation",
                      "expiresIn": 794,
                      "refreshToken": "laborum esse dolor culpa laboris"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Exchange a refresh token for a new access token",
        "description": "Post `{ \"refreshToken\": \"<the value from login>\" }` and receive a fresh\n`AccessTokenResponse`. Call this before the current `expiresIn` window\ncloses rather than re-sending credentials.\n\nAn expired or already-used refresh token returns `401`, which the\ninstance's spec does not declare - the mock only offers the `200`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postAuthRefresh"
      }
    },
    "/auth/confirmEmail": {
      "get": {
        "tags": [
          "Authentication"
        ],
        "operationId": "MapIdentityApi-/auth/confirmEmail",
        "parameters": [
          {
            "name": "userId",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "code",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "changedEmail",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Confirm an email address from a confirmation link",
        "description": "The landing endpoint for the link in a confirmation email.\n\n**Nothing on this deployment sends that email.** `IEmailSender<ZUser>` is\nbound to `NoOpEmailSender`\n(`Zen.Management.Application/Core/Service/NoOpEmailSender.cs`), whose\nthree methods all return `Task.CompletedTask` - see the `ZEN-1979` TODO\non it. No confirmation link is ever delivered, so in practice there is no\n`code` to present here.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated"
      }
    },
    "/auth/resendConfirmationEmail": {
      "post": {
        "tags": [
          "Authentication"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResendConfirmationEmailRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request - Malformed or semantically invalid input, rejected inside a facade rather than by model validation. `data` is null and `message` carries the exception's own text. This is a *different shape* from the model-validation 400 - see `modelValidation` below - and a client that assumes `data` is an array of field errors will break here. Both shapes confirmed against a live instance on 2026-07-27.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Bad Request",
                    "value": {
                      "data": null,
                      "message": "Media source id must not be empty.",
                      "resultCode": 400
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Re-send a confirmation email (no-op on this deployment)",
        "description": "Always returns `200`, whether or not the address exists - deliberate, so\nthe endpoint cannot be used to enumerate accounts.\n\nNo email is sent regardless: the mail sender is `NoOpEmailSender`. See\n`GET /auth/confirmEmail`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request - Malformed or semantically invalid input, rejected inside a facade rather tha |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postAuthResendConfirmationEmail"
      }
    },
    "/auth/forgotPassword": {
      "post": {
        "tags": [
          "Authentication"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForgotPasswordRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Start a password reset (no email is delivered)",
        "description": "Generates a reset code and hands it to `IEmailSender<ZUser>`, which on\nthis deployment is `NoOpEmailSender` and discards it. Returns `200`\nregardless of whether the address exists.\n\n**The self-service reset flow therefore cannot complete.** Reset a\npassword through `POST /api/configuration/basic/user/change-password`, or\nhave an administrator do it.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postAuthForgotPassword"
      }
    },
    "/auth/resetPassword": {
      "post": {
        "tags": [
          "Authentication"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ResetPasswordRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK"
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Complete a password reset with a code",
        "description": "Requires the `resetCode` produced by `POST /auth/forgotPassword`. Since\nthat code is never delivered to the user on this deployment\n(`NoOpEmailSender`), this endpoint is only usable if the code is read out\nof the application log or obtained some other way.\n\n`400` carries `HttpValidationProblemDetails` with Identity error codes\n(`InvalidToken`, `PasswordTooShort`, …) - **not** the Zen envelope. These\nare framework endpoints and do not go through\n`InvalidModelStateResponseFactory`.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postAuthResetPassword"
      }
    },
    "/auth/manage/2fa": {
      "post": {
        "tags": [
          "Authentication"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TwoFactorRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TwoFactorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "sharedKey": "sed",
                      "recoveryCodesLeft": 758,
                      "recoveryCodes": [
                        "ut irure cillum dolor do",
                        "in dolore et dolore exercitation"
                      ],
                      "isTwoFactorEnabled": true,
                      "isMachineRemembered": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Enable, disable or reset two-factor authentication",
        "description": "Manages TOTP two-factor for the authenticated user. The request selects\nthe action: `enable` with a valid `twoFactorCode`, `resetSharedKey`,\n`resetRecoveryCodes`, or `forgetMachine`.\n\nPosting `{}` returns the current state without changing anything, which\nis the safe way to read `isTwoFactorEnabled` and\n`recoveryCodesLeft`.\n\n`400` is `HttpValidationProblemDetails`, not the Zen envelope.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postAuthManage2fa"
      }
    },
    "/auth/manage/info": {
      "get": {
        "tags": [
          "Authentication"
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InfoResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "email": "operator@example.com",
                      "isEmailConfirmed": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Read the calling user's email and confirmation state",
        "description": "Returns `InfoResponse` for the bearer token's own user - `email`,\n`isEmailConfirmed`, and any claims. There is no way to ask about another\nuser here; use `GET /api/configuration/basic/user/{id}` for that.\n\n`404` means the token authenticated but its user record no longer exists.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "getAuthManageInfo"
      },
      "post": {
        "tags": [
          "Authentication"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/InfoRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InfoResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Generated from the response schema",
                    "value": {
                      "email": "operator@example.com",
                      "isEmailConfirmed": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/HttpValidationProblemDetails"
                }
              }
            }
          },
          "404": {
            "description": "Not Found",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Not Found",
                    "value": {
                      "data": null,
                      "message": "Media source not found.",
                      "resultCode": 404
                    }
                  }
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error - CAUTION: the handler sets Message to the raw exception message (ExceptionHandlerMiddleware.cs:49) rather than a generic string, so 500 bodies can disclose internal detail - type names, SQL fragments, paths. Do not surface this text to end users. The declared fallback constant \"An unexpected error occurred.\" is effectively unreachable, because exception.Message is never null. 500s are also sent to Sentry and logged. VERIFIED against a live instance on 2026-07-27: an unknown id on GET /api/data/accr/related-images returned 500 with \"Container with ID 00000000-0000-0000-0000-000000000000 not found.\" Note that a missing id yields 500 there rather than 404 - the message says \"not found\" while the status does not.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorResponse"
                },
                "examples": {
                  "default": {
                    "summary": "Internal Server Error",
                    "value": {
                      "data": null,
                      "message": "Container with ID 00000000-0000-0000-0000-000000000000 not found.",
                      "resultCode": 500
                    }
                  }
                }
              }
            }
          }
        },
        "summary": "Change the calling user's own email or password",
        "description": "Self-service change of email and/or password for the authenticated user.\nChanging the password requires `oldPassword`.\n\nChanging `newEmail` sends a confirmation link - which\n`NoOpEmailSender` discards, so the new address stays unconfirmed. See\n`GET /auth/confirmEmail`.\n\n`400` is `HttpValidationProblemDetails` with Identity error codes, not\nthe Zen envelope.\n\n<!-- zen:scenarios -->\n\n**Mock scenarios**\n\nThis operation is served by the mock at `http://localhost:4010`. Send the\n`Prefer` header to select which documented response you get back:\n\n| Status | Header | Meaning |\n| --- | --- | --- |\n| `200` | `Prefer: code=200` | OK |\n| `400` | `Prefer: code=400` | Bad Request |\n| `404` | `Prefer: code=404` | Not Found |\n| `500` | `Prefer: code=500` | Internal Server Error - CAUTION: the handler sets Message to the raw exception message (Ex |\n",
        "x-doc-status": "curated",
        "operationId": "postAuthManageInfo"
      }
    }
  },
  "components": {
    "schemas": {
      "ACCRRelatedImagesDto": {
        "type": "object",
        "properties": {
          "fullFrameRelatedImages": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "byte"
            },
            "nullable": true
          },
          "fullFrameImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "codeImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ANPRRelatedImagesDto": {
        "type": "object",
        "properties": {
          "fullFrameRelatedImages": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "byte"
            },
            "nullable": true
          },
          "fullFrameImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "plateImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AccessStatus": {
        "enum": [
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "AccessTokenResponse": {
        "required": [
          "accessToken",
          "expiresIn",
          "refreshToken"
        ],
        "type": "object",
        "properties": {
          "tokenType": {
            "type": "string",
            "nullable": true,
            "readOnly": true
          },
          "accessToken": {
            "type": "string",
            "nullable": true
          },
          "expiresIn": {
            "type": "integer",
            "format": "int64"
          },
          "refreshToken": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AccrConfigurationDto": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneDto"
            },
            "nullable": true
          },
          "minimumCharacterCount": {
            "type": "integer",
            "format": "int32"
          },
          "maximumCharacterCount": {
            "type": "integer",
            "format": "int32"
          },
          "providerEventId": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ActiveServerMediaSourceProviderConfigRequest": {
        "type": "object",
        "properties": {
          "configuration": {
            "$ref": "#/components/schemas/ActiveServerMediaSourceProviderDto"
          }
        },
        "additionalProperties": false
      },
      "ActiveServerMediaSourceProviderDto": {
        "type": "object",
        "properties": {
          "serverConfigurationId": {
            "type": "string",
            "format": "uuid"
          },
          "activeServerMediaSourceProviderParams": {
            "$ref": "#/components/schemas/MediaSourceProviderParamsDto"
          }
        },
        "additionalProperties": false
      },
      "AddDashboardFilterRequest": {
        "required": [
          "dashboardType"
        ],
        "type": "object",
        "properties": {
          "dashboardType": {
            "$ref": "#/components/schemas/DashboardType"
          },
          "payload": {}
        },
        "additionalProperties": false
      },
      "AddDashboardWidgetRequest": {
        "required": [
          "widgetKey"
        ],
        "type": "object",
        "properties": {
          "widgetKey": {
            "minLength": 1,
            "type": "string"
          },
          "name": {
            "maxLength": 100,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "x": {
            "type": "integer",
            "format": "int32"
          },
          "y": {
            "type": "integer",
            "format": "int32"
          },
          "width": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "height": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "configuration": {}
        },
        "additionalProperties": false
      },
      "AddDashboardWidgetsRequest": {
        "required": [
          "widgets"
        ],
        "type": "object",
        "properties": {
          "widgets": {
            "minItems": 1,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AddDashboardWidgetRequest"
            }
          }
        },
        "additionalProperties": false
      },
      "AddEnrolledVehicleRequest": {
        "required": [
          "licensePlate"
        ],
        "type": "object",
        "properties": {
          "licensePlate": {
            "type": "string",
            "nullable": true
          },
          "plateType": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "type": "string",
            "nullable": true
          },
          "make": {
            "type": "string",
            "nullable": true
          },
          "model": {
            "type": "string",
            "nullable": true
          },
          "color": {
            "type": "string",
            "nullable": true
          },
          "newPlateCode": {
            "type": "string",
            "nullable": true
          },
          "diplomaticCode": {
            "type": "string",
            "nullable": true
          },
          "minorColor": {
            "type": "string",
            "nullable": true
          },
          "code": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "vinNumber": {
            "type": "string",
            "nullable": true
          },
          "yearOfManufacture": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "wanted": {
            "type": "boolean",
            "nullable": true
          },
          "stolen": {
            "type": "boolean",
            "nullable": true
          },
          "referenceNumber": {
            "type": "string",
            "nullable": true
          },
          "nationalNumber": {
            "type": "string",
            "nullable": true
          },
          "department": {
            "type": "string",
            "nullable": true
          },
          "customField1": {
            "type": "string",
            "nullable": true
          },
          "customField2": {
            "type": "string",
            "nullable": true
          },
          "customField3": {
            "type": "string",
            "nullable": true
          },
          "vehicleImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AddMediaSourceGroupRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "AddMediaSourceRequest": {
        "required": [
          "ipAddress",
          "password",
          "port",
          "providerType",
          "username"
        ],
        "type": "object",
        "properties": {
          "ipAddress": {
            "minLength": 1,
            "type": "string"
          },
          "port": {
            "maximum": 65535,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "minLength": 1,
            "type": "string"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "providerType": {
            "$ref": "#/components/schemas/MediaSourceProviderType"
          }
        },
        "additionalProperties": false
      },
      "AddOutputRequest": {
        "type": "object",
        "properties": {
          "outputId": {
            "type": "string",
            "nullable": true
          },
          "outputName": {
            "type": "string",
            "nullable": true
          },
          "hardwareId": {
            "type": "string",
            "nullable": true
          },
          "hardwareName": {
            "type": "string",
            "nullable": true
          },
          "watchListId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "watchListGroupId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AddSavedQueryRequest": {
        "required": [
          "filterPayload",
          "moduleType",
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "description": {
            "maxLength": 500,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "isShared": {
            "type": "boolean"
          },
          "moduleType": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "filterPayload": {}
        },
        "additionalProperties": false
      },
      "AddUserRequest": {
        "required": [
          "confirmPassword",
          "email",
          "password",
          "phoneNumber"
        ],
        "type": "object",
        "properties": {
          "email": {
            "minLength": 1,
            "type": "string",
            "format": "email"
          },
          "password": {
            "maxLength": 100,
            "minLength": 6,
            "type": "string"
          },
          "confirmPassword": {
            "minLength": 1,
            "type": "string"
          },
          "phoneNumber": {
            "minLength": 1,
            "type": "string",
            "format": "tel"
          },
          "userName": {
            "type": "string",
            "nullable": true
          },
          "roleId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "AddWatchListRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "isActive": {
            "type": "boolean"
          },
          "triggerAllOutputs": {
            "type": "boolean"
          },
          "watchListGroupId": {
            "type": "string",
            "format": "uuid"
          },
          "module": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "personTriggerMode": {
            "$ref": "#/components/schemas/WatchListTriggerMode"
          },
          "vehicleTriggerMode": {
            "$ref": "#/components/schemas/WatchListTriggerMode"
          },
          "containerTriggerMode": {
            "$ref": "#/components/schemas/WatchListTriggerMode"
          },
          "vehicleMatchOperator": {
            "$ref": "#/components/schemas/Operators"
          },
          "vehicleSubjects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListVehicleSubjectDto"
            },
            "nullable": true
          },
          "zoneName": {
            "type": "string",
            "nullable": true
          },
          "vehicleMatchingAttributes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VehicleMatchingAttribute"
            },
            "nullable": true
          },
          "andOrVehicle": {
            "$ref": "#/components/schemas/Operators"
          },
          "enrolledVehicles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListEnrolledVehicleDto"
            },
            "nullable": true
          },
          "personIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "andOrContainer": {
            "$ref": "#/components/schemas/Operators"
          },
          "containerCodes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AdvancedCountingIdentitySource": {
        "enum": [
          0
        ],
        "type": "integer",
        "format": "int32"
      },
      "AdvancedCountingScopePolicyDto": {
        "type": "object",
        "properties": {
          "scopeMediaSourceGroupId": {
            "type": "string",
            "format": "uuid"
          },
          "identitySource": {
            "$ref": "#/components/schemas/AdvancedCountingIdentitySource"
          },
          "dedupeWindowSeconds": {
            "type": "integer",
            "format": "int32"
          },
          "similarityThreshold": {
            "type": "number",
            "format": "double"
          },
          "exists": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "AlarmAction": {
        "enum": [
          1,
          2,
          3
        ],
        "type": "integer",
        "format": "int32"
      },
      "AlarmHistoryDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "action": {
            "$ref": "#/components/schemas/AlarmAction"
          },
          "fromStatus": {
            "$ref": "#/components/schemas/AlarmStatus"
          },
          "toStatus": {
            "$ref": "#/components/schemas/AlarmStatus"
          },
          "performedByUserName": {
            "type": "string",
            "nullable": true
          },
          "oldNote": {
            "type": "string",
            "nullable": true
          },
          "newNote": {
            "type": "string",
            "nullable": true
          },
          "oldAssignedUserName": {
            "type": "string",
            "nullable": true
          },
          "newAssignedUserName": {
            "type": "string",
            "nullable": true
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "AlarmSeverity": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "format": "int32"
      },
      "AlarmStatus": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "format": "int32"
      },
      "AllowedClassDto": {
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "valueName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "AnalyticPlan": {
        "enum": [
          0,
          1,
          2,
          3,
          -1
        ],
        "type": "integer",
        "format": "int32"
      },
      "AnalyticsServerHealthStatus": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "AnalyticsVersionInfo": {
        "type": "object",
        "properties": {
          "serverId": {
            "type": "string",
            "format": "uuid"
          },
          "serverName": {
            "type": "string",
            "nullable": true
          },
          "serverIp": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/AnalyticsServerHealthStatus"
          },
          "version": {
            "$ref": "#/components/schemas/VersionInfo"
          }
        },
        "additionalProperties": false
      },
      "AnprBoundingBoxDto": {
        "type": "object",
        "properties": {
          "left": {
            "type": "integer",
            "format": "int32"
          },
          "top": {
            "type": "integer",
            "format": "int32"
          },
          "right": {
            "type": "integer",
            "format": "int32"
          },
          "bottom": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "AnprConfigurationDto": {
        "required": [
          "anprDeviceConfiguration"
        ],
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneDto"
            },
            "nullable": true
          },
          "mediaSourceDirection": {
            "type": "integer",
            "format": "int32"
          },
          "anprDeviceType": {
            "$ref": "#/components/schemas/AnprDeviceType"
          },
          "anprMode": {
            "$ref": "#/components/schemas/AnprMode"
          },
          "integrationMode": {
            "$ref": "#/components/schemas/AnprIntegrationMode"
          },
          "anprDeviceConfiguration": {
            "type": "string",
            "nullable": true
          },
          "plateHeight": {
            "type": "integer",
            "format": "int32"
          },
          "plateWidth": {
            "type": "integer",
            "format": "int32"
          },
          "frameWidth": {
            "type": "integer",
            "format": "int32"
          },
          "frameHeight": {
            "type": "integer",
            "format": "int32"
          },
          "minNumberOfCharacters": {
            "type": "integer",
            "format": "int32"
          },
          "maxNumberOfCharacters": {
            "type": "integer",
            "format": "int32"
          },
          "compression": {
            "maximum": 100,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "AnprDeviceType": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8
        ],
        "type": "integer",
        "format": "int32"
      },
      "AnprIntegrationMode": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "AnprMode": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "AnprWidgetDataFiltersRequest": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "make": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "model": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "category": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "color": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "watchlistIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "aggregation": {
            "$ref": "#/components/schemas/BucketGranularity"
          },
          "topN": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "noPlateDetection": {
            "$ref": "#/components/schemas/NoPlateMode"
          }
        },
        "additionalProperties": false
      },
      "AnprWidgetResponseCategory": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "type": "integer",
        "format": "int32"
      },
      "AssignMediaSourceToGroupRequest": {
        "type": "object",
        "properties": {
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "groupId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "AuditLogDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "userRole": {
            "type": "string",
            "nullable": true
          },
          "targetPermission": {
            "type": "string",
            "nullable": true
          },
          "targetEndpoint": {
            "type": "string",
            "nullable": true
          },
          "accessStatus": {
            "$ref": "#/components/schemas/AccessStatus"
          },
          "requestPayload": {
            "type": "string",
            "nullable": true
          },
          "responseStatusCode": {
            "type": "integer",
            "format": "int32"
          },
          "requestDurationInMilliseconds": {
            "type": "integer",
            "format": "int64"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "AvailableColorResponse": {
        "required": [
          "id",
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ACCRRelatedImagesDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ACCRRelatedImagesDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ANPRRelatedImagesDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ANPRRelatedImagesDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ActiveServerMediaSourceProviderDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ActiveServerMediaSourceProviderDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_AdvancedCountingScopePolicyDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/AdvancedCountingScopePolicyDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_AlarmHistoryDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/AlarmHistoryDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_AlarmHistoryDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AlarmHistoryDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_AlarmStatusList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AlarmStatus"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_AllowedClassDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AllowedClassDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_Boolean": {
        "type": "object",
        "properties": {
          "data": {
            "type": "boolean"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_BucketsPayload": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/BucketsPayload"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ByteList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ByteListList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "byte"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_DashboardDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/DashboardDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_DashboardFilterDefinitionDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DashboardFilterDefinitionDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_DashboardFilterDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/DashboardFilterDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_DashboardTypeDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DashboardTypeDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_DashboardWidgetDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/DashboardWidgetDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_DashboardWidgetDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DashboardWidgetDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_DrilldownStateResponse": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/DrilldownStateResponse"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_EnrolledFaceDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnrolledFaceDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_EnrolledVehicleDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/EnrolledVehicleDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_EnrolledVehicleDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnrolledVehicleDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_EnumOptionDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnumOptionDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_EventTypeResponseDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventTypeResponseDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ExportJobResponseDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ExportJobResponseDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ExportResourceColumnsResponseDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ExportResourceColumnsResponseDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ExportResourceResponseDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExportResourceResponseDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_FaceFeatureVectorResult": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/FaceFeatureVectorResult"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_FetchResponse_PersonDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/FetchResponse_PersonDtoList"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_FlowDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/FlowDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_GeneralMediaSourceConfigDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/GeneralMediaSourceConfigDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_Guid": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "format": "uuid"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_GuidBooleanIDictionary": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "additionalProperties": {
              "type": "boolean"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_GuidList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_IdentityRoleClaimDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IdentityRoleClaimDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_IdentityRoleDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/IdentityRoleDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_IdentityRoleDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IdentityRoleDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_KpiListPayload": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/KpiListPayload"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_KpiPayload": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/KpiPayload"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_LicenseInfoDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/LicenseInfoDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_LiveFeedFolderDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/LiveFeedFolderDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_LiveFeedFolderDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LiveFeedFolderDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_LiveFeedFolderTreeNodeDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LiveFeedFolderTreeNodeDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_LiveFeedViewDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/LiveFeedViewDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_MediaSourceDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/MediaSourceDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_MediaSourceGroupDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MediaSourceGroupDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_MediaSourceGroupPermissionDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MediaSourceGroupPermissionDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_MediaSourceLinkConfigDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MediaSourceLinkConfigDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_MediaSourceLinkDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/MediaSourceLinkDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_MediaSourceProviderDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/MediaSourceProviderDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_MediaSourceScheduleDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/MediaSourceScheduleDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_MediaSourceScheduleDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MediaSourceScheduleDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ModuleDefaultsDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ModuleDefaultsDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ModuleDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ModuleDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ObjectClassificationColorResponseList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ObjectClassificationColorResponse"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_OutputDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/OutputDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_PageResponse_MediaSourceLinkDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PageResponse_MediaSourceLinkDtoList"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_PageResponse_WidgetRowDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PageResponse_WidgetRowDtoList"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_PaletteGroupResponseList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaletteGroupResponse"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_PersonDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/PersonDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_PersonGroupDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonGroupDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ProviderMediaSourceResponseDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ProviderMediaSourceResponseDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_RankedPayload": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/RankedPayload"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_RoleDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoleDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_SavedQueryDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SavedQueryDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_SeriesPayload": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SeriesPayload"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ServerConfigurationDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/ServerConfigurationDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ServerDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServerDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_StackedBucketsPayload": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/StackedBucketsPayload"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_String": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_StringList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_SyncAssignedMediaSourcesResponseDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SyncAssignedMediaSourcesResponseDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_SystemVersionInfo": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/SystemVersionInfo"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_TriggeredAlarmSummaryDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TriggeredAlarmSummaryDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_TriggeredAlarmSummaryDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TriggeredAlarmSummaryDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_TriggeredEventDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TriggeredEventDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_TriggeredEventDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TriggeredEventDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_UserDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/UserDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_UserDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_VFRRelatedImagesDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/VFRRelatedImagesDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ValidationErrorList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ValidationError"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_VehicleInfoDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/VehicleInfoDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_VmsOutputDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VmsOutputDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_WatchListDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_WatchListGroupDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WatchListGroupDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_WatchListGroupDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListGroupDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_WatchListGroupPermissionDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListGroupPermissionDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_WatchListImportResultDto": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/WatchListImportResultDto"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_WidgetSectionDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WidgetSectionDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BaseResponse_ZenModuleMediaSourceModuleConfigurationDtoDictionary": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "HeatMap": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "CrowdDensity": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "TrafficDensity": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "VehicleCountCategorization": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "Occupancy": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "FireSmokeDetection": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "MissingLeft": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "SlipAndFall": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "PersonalProtectiveEquipment": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "LoiteringMonitoring": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "PerimeterMonitoring": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "TripwireTriggeredMonitoring": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "SpeedDetection": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "MovementAnalysis": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "Counting": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "IllegalParking": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "FaceRecognition": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "AuthorizedParking": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "AutomaticContainerCodeRecognition": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "AutomaticNumberPlateRecognition": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "PedestrianDetection": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "VehicleMakeModelRecognition": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "ObjectDetectionClassification": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "PrivacyRemove": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              },
              "Events": {
                "$ref": "#/components/schemas/MediaSourceModuleConfigurationDto"
              }
            },
            "additionalProperties": false,
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "BucketGranularity": {
        "enum": [
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "format": "int32"
      },
      "BucketItem": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "nullable": true
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "type": "number",
            "format": "double"
          },
          "durationSeconds": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BucketSegment": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "BucketsPayload": {
        "type": "object",
        "properties": {
          "buckets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BucketItem"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "BulkSaveMediaSourceLinkConfigItemRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/MediaSourceLinkConfigType"
          },
          "config": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/JsonNode"
            },
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "BulkSaveMediaSourceLinkConfigRequest": {
        "type": "object",
        "properties": {
          "configs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BulkSaveMediaSourceLinkConfigItemRequest"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CategoryDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "confidence": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ChangeUserPasswordRequest": {
        "required": [
          "confirmPassword",
          "password",
          "userId"
        ],
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "password": {
            "maxLength": 100,
            "minLength": 6,
            "type": "string"
          },
          "confirmPassword": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "CheckCameraConnectivityRequest": {
        "required": [
          "ipAddress",
          "password",
          "username"
        ],
        "type": "object",
        "properties": {
          "ipAddress": {
            "minLength": 1,
            "type": "string"
          },
          "port": {
            "maximum": 65535,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "minLength": 1,
            "type": "string"
          },
          "timeoutMs": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ComparisonOperation": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "format": "int32"
      },
      "CompressionLevel": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "format": "int32"
      },
      "ContainerInfoDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceName": {
            "type": "string",
            "nullable": true
          },
          "ocrText": {
            "type": "string",
            "nullable": true
          },
          "confidence": {
            "type": "number",
            "format": "float"
          },
          "recognized": {
            "type": "boolean"
          },
          "analyzedFrameImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "fullFrameImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "triggerType": {
            "$ref": "#/components/schemas/SearchResultTriggerType"
          },
          "watchListIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "zoneName": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "ContainerInfoFilterRequest": {
        "required": [
          "count",
          "page"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "page": {
            "maximum": 10000000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "containerNumber": {
            "type": "string",
            "nullable": true
          },
          "searchOperation": {
            "$ref": "#/components/schemas/ComparisonOperation"
          },
          "confidence": {
            "$ref": "#/components/schemas/MinMaxFilter"
          },
          "triggered": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CountingAggregation": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "format": "int32"
      },
      "CountingWidgetDataFiltersRequest": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "aggregation": {
            "$ref": "#/components/schemas/CountingAggregation"
          },
          "valueMode": {
            "$ref": "#/components/schemas/OccupancyValueMode"
          },
          "objectTypes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "directions": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "zoneNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "zoneIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "lineIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CountingWidgetResponseCategory": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "type": "integer",
        "format": "int32"
      },
      "CountingZoneDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "zoneMode": {
            "$ref": "#/components/schemas/ZoneMode"
          },
          "cmPerPixelRatio": {
            "type": "number",
            "format": "double"
          },
          "anchors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatioAnchorDto"
            },
            "nullable": true
          },
          "allowedObjectTypes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "lineAnchors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatioAnchorDto"
            },
            "nullable": true
          },
          "allowedLineDirections": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LineDirection"
            },
            "nullable": true
          },
          "cooldown": {
            "type": "integer",
            "format": "int32"
          },
          "mode": {
            "$ref": "#/components/schemas/CountingZoneMode"
          },
          "advancedIdentitySource": {
            "$ref": "#/components/schemas/AdvancedCountingIdentitySource"
          },
          "advancedScopeMediaSourceGroupId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CountingZoneMode": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "CreateExportJobRequest": {
        "required": [
          "columns",
          "resourceKey"
        ],
        "type": "object",
        "properties": {
          "resourceKey": {
            "maxLength": 150,
            "minLength": 1,
            "type": "string"
          },
          "format": {
            "$ref": "#/components/schemas/ExportFileType"
          },
          "columns": {
            "minItems": 1,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExportColumnSelection"
            }
          },
          "queryPayload": {},
          "pageNumber": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "recordLimit": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateFlowEventRequest": {
        "required": [
          "detectedAt",
          "entityRef",
          "entityType",
          "flowId",
          "mediaSourceId",
          "outcome",
          "stageId"
        ],
        "type": "object",
        "properties": {
          "flowId": {
            "type": "string",
            "format": "uuid"
          },
          "flowName": {
            "type": "string",
            "nullable": true
          },
          "stageId": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "entityRef": {
            "minLength": 1,
            "type": "string"
          },
          "detectedAt": {
            "type": "string",
            "format": "date-time"
          },
          "exitedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "outcome": {
            "minLength": 1,
            "type": "string"
          },
          "violationCode": {
            "type": "string",
            "nullable": true
          },
          "entityType": {
            "$ref": "#/components/schemas/FlowEntityTypes"
          }
        },
        "additionalProperties": false
      },
      "CreateLiveFeedFolderRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "description": {
            "maxLength": 500,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "parentFolderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateLiveFeedViewRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "description": {
            "maxLength": 500,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "gridRows": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "gridColumns": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "folderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateMediaSourceLinkRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "isActive": {
            "type": "boolean"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "CreateScheduleRequest": {
        "required": [
          "endTime",
          "mediaSourceId",
          "name",
          "startTime"
        ],
        "type": "object",
        "properties": {
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "moduleType": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "isEnabled": {
            "type": "boolean"
          },
          "startTime": {
            "type": "string",
            "format": "time"
          },
          "endTime": {
            "type": "string",
            "format": "time"
          },
          "monday": {
            "type": "boolean"
          },
          "tuesday": {
            "type": "boolean"
          },
          "wednesday": {
            "type": "boolean"
          },
          "thursday": {
            "type": "boolean"
          },
          "friday": {
            "type": "boolean"
          },
          "saturday": {
            "type": "boolean"
          },
          "sunday": {
            "type": "boolean"
          },
          "timeZoneId": {
            "maxLength": 100,
            "minLength": 0,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DashboardDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "dashboardLayoutId": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "$ref": "#/components/schemas/DashboardType"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "isDefault": {
            "type": "boolean"
          },
          "widgets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DashboardWidgetDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DashboardFilterDefinitionDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "key": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/DashboardFilterType"
          },
          "isBaseFilter": {
            "type": "boolean"
          },
          "displayOrder": {
            "type": "integer",
            "format": "int32"
          },
          "metadata": {}
        },
        "additionalProperties": false
      },
      "DashboardFilterDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "dashboardType": {
            "$ref": "#/components/schemas/DashboardType"
          },
          "payload": {},
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "DashboardFilterType": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7
        ],
        "type": "integer",
        "format": "int32"
      },
      "DashboardLayoutWidgetItemRequest": {
        "required": [
          "widgetKey"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "widgetKey": {
            "minLength": 1,
            "type": "string"
          },
          "x": {
            "type": "integer",
            "format": "int32"
          },
          "y": {
            "type": "integer",
            "format": "int32"
          },
          "width": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "height": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "name": {
            "maxLength": 100,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "configuration": {}
        },
        "additionalProperties": false
      },
      "DashboardType": {
        "enum": [
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "format": "int32"
      },
      "DashboardTypeDto": {
        "type": "object",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/DashboardType"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DashboardWidgetDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "dashboardLayoutId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "widgetKey": {
            "type": "string",
            "nullable": true
          },
          "x": {
            "type": "integer",
            "format": "int32"
          },
          "y": {
            "type": "integer",
            "format": "int32"
          },
          "width": {
            "type": "integer",
            "format": "int32"
          },
          "height": {
            "type": "integer",
            "format": "int32"
          },
          "configuration": {},
          "anprResponseCategory": {
            "$ref": "#/components/schemas/AnprWidgetResponseCategory"
          },
          "incidentResponseCategory": {
            "$ref": "#/components/schemas/IncidentWidgetResponseCategory"
          },
          "vfrResponseCategory": {
            "$ref": "#/components/schemas/VfrWidgetResponseCategory"
          },
          "flowResponseCategory": {
            "$ref": "#/components/schemas/FlowWidgetResponseCategory"
          },
          "countingResponseCategory": {
            "$ref": "#/components/schemas/CountingWidgetResponseCategory"
          },
          "definition": {
            "$ref": "#/components/schemas/WidgetDefinitionDto"
          }
        },
        "additionalProperties": false
      },
      "DataDestinationProviderDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "dataDestinationType": {
            "$ref": "#/components/schemas/DataDestinationType"
          },
          "connectionString": {
            "type": "string",
            "nullable": true
          },
          "serverRetentionPeriod": {
            "type": "integer",
            "format": "int32"
          },
          "ftpServerPath": {
            "type": "string",
            "nullable": true
          },
          "databaseLag": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "binaryPath": {
            "type": "string",
            "nullable": true
          },
          "backupInterval": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "dataBackupPath": {
            "type": "string",
            "nullable": true
          },
          "notifyNoResultsAfter": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          },
          "archiveData": {
            "type": "boolean"
          },
          "archivedBinaryPath": {
            "type": "string",
            "nullable": true
          },
          "archivedUsername": {
            "type": "string",
            "nullable": true
          },
          "archivedPassword": {
            "type": "string",
            "nullable": true
          },
          "archivedRetentionPeriod": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DataDestinationType": {
        "enum": [
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "DataDistributionProviderDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "providerType": {
            "$ref": "#/components/schemas/DataDistributionProviderType"
          },
          "hostAddress": {
            "type": "string",
            "nullable": true
          },
          "hostPort": {
            "type": "string",
            "nullable": true
          },
          "mqttHostPort": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "mqttScheme": {
            "type": "string",
            "nullable": true
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DataDistributionProviderType": {
        "enum": [
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "DeleteGroupRequest": {
        "type": "object",
        "properties": {
          "idsToDelete": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DeleteRoleRequest": {
        "type": "object",
        "properties": {
          "idsToDelete": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DetectionFilterOption": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "DrilldownDimension": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8
        ],
        "type": "integer",
        "format": "int32"
      },
      "DrilldownStateRequest": {
        "required": [
          "count",
          "page"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "page": {
            "maximum": 10000000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "steps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DrilldownStepDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DrilldownStateResponse": {
        "type": "object",
        "properties": {
          "durationSeconds": {
            "type": "integer",
            "format": "int64"
          },
          "steps": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DrilldownStepDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DrilldownStepDto": {
        "type": "object",
        "properties": {
          "dimension": {
            "$ref": "#/components/schemas/DrilldownDimension"
          },
          "values": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DrilldownStepValueCountDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DrilldownStepValueCountDto": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "DuplicateDashboardWidgetRequest": {
        "type": "object",
        "properties": {
          "dashboardWidgetId": {
            "type": "string",
            "format": "uuid"
          },
          "x": {
            "type": "integer",
            "format": "int32"
          },
          "y": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "EdgeBufferDto": {
        "type": "object",
        "properties": {
          "edgeIndex": {
            "type": "integer",
            "format": "int32"
          },
          "isBuffered": {
            "type": "boolean"
          },
          "bufferDepthPixels": {
            "type": "number",
            "format": "float"
          }
        },
        "additionalProperties": false
      },
      "EditMediaSourceGroupRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "EditMediaSourceRequest": {
        "required": [
          "id",
          "ipAddress",
          "password",
          "port",
          "providerType",
          "username"
        ],
        "type": "object",
        "properties": {
          "ipAddress": {
            "minLength": 1,
            "type": "string"
          },
          "port": {
            "maximum": 65535,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "username": {
            "minLength": 1,
            "type": "string"
          },
          "password": {
            "minLength": 1,
            "type": "string"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "providerType": {
            "$ref": "#/components/schemas/MediaSourceProviderType"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "EnrollFaceRequest": {
        "required": [
          "analyzedImage"
        ],
        "type": "object",
        "properties": {
          "minAge": {
            "type": "integer",
            "format": "int32"
          },
          "maxAge": {
            "type": "integer",
            "format": "int32"
          },
          "gender": {
            "$ref": "#/components/schemas/Gender"
          },
          "isDefault": {
            "type": "boolean"
          },
          "featureVector": {
            "type": "string",
            "nullable": true
          },
          "detectionConfidence": {
            "type": "integer",
            "format": "int32"
          },
          "faceImageName": {
            "type": "string",
            "nullable": true
          },
          "enrolledPersonId": {
            "type": "string",
            "format": "uuid"
          },
          "analyzedImage": {
            "minLength": 1,
            "type": "string",
            "format": "byte"
          }
        },
        "additionalProperties": false
      },
      "EnrollFacesRequest": {
        "required": [
          "faces"
        ],
        "type": "object",
        "properties": {
          "faces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnrollFaceRequest"
            }
          }
        },
        "additionalProperties": false
      },
      "EnrollPersonRequest": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "customField1": {
            "type": "string",
            "nullable": true
          },
          "customField2": {
            "type": "string",
            "nullable": true
          },
          "customField3": {
            "type": "string",
            "nullable": true
          },
          "birthYear": {
            "type": "integer",
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/PersonStatus"
          },
          "relatedFaces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnrolledFaceDto"
            },
            "nullable": true
          },
          "groups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonGroupDto"
            },
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoleDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EnrolledFaceDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "minAge": {
            "type": "integer",
            "format": "int32"
          },
          "maxAge": {
            "type": "integer",
            "format": "int32"
          },
          "gender": {
            "$ref": "#/components/schemas/Gender"
          },
          "recognized": {
            "type": "boolean"
          },
          "isDefault": {
            "type": "boolean"
          },
          "faceImageName": {
            "type": "string",
            "nullable": true
          },
          "featureVector": {
            "type": "string",
            "nullable": true
          },
          "detectionConfidence": {
            "type": "integer",
            "format": "int32"
          },
          "enrolledPersonId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "analyzedImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EnrolledVehicleDto": {
        "required": [
          "licensePlate"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "licensePlate": {
            "type": "string",
            "nullable": true
          },
          "plateType": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "type": "string",
            "nullable": true
          },
          "make": {
            "type": "string",
            "nullable": true
          },
          "model": {
            "type": "string",
            "nullable": true
          },
          "color": {
            "type": "string",
            "nullable": true
          },
          "newPlateCode": {
            "type": "string",
            "nullable": true
          },
          "diplomaticCode": {
            "type": "string",
            "nullable": true
          },
          "minorColor": {
            "type": "string",
            "nullable": true
          },
          "code": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "vinNumber": {
            "type": "string",
            "nullable": true
          },
          "yearOfManufacture": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "wanted": {
            "type": "boolean",
            "nullable": true
          },
          "stolen": {
            "type": "boolean",
            "nullable": true
          },
          "referenceNumber": {
            "type": "string",
            "nullable": true
          },
          "nationalNumber": {
            "type": "string",
            "nullable": true
          },
          "method": {
            "$ref": "#/components/schemas/VehicleRecordMethod"
          },
          "department": {
            "type": "string",
            "nullable": true
          },
          "customField1": {
            "type": "string",
            "nullable": true
          },
          "customField2": {
            "type": "string",
            "nullable": true
          },
          "customField3": {
            "type": "string",
            "nullable": true
          },
          "vehicleImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "enrolledPersonNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Enum": {
        "type": "object",
        "additionalProperties": false
      },
      "EnumOptionDto": {
        "type": "object",
        "properties": {
          "value": {
            "type": "integer",
            "format": "int32"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "EventTypeResponseDto": {
        "type": "object",
        "properties": {
          "displayName": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "lastModified": {
            "type": "string",
            "format": "date-time"
          },
          "description": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ExportColumnResponseDto": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "nullable": true
          },
          "defaultHeader": {
            "type": "string",
            "nullable": true
          },
          "supportedFormats": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExportFileType"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ExportColumnSelection": {
        "required": [
          "header",
          "key"
        ],
        "type": "object",
        "properties": {
          "key": {
            "minLength": 1,
            "type": "string"
          },
          "header": {
            "minLength": 1,
            "type": "string"
          }
        },
        "additionalProperties": false
      },
      "ExportFileType": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "ExportJobResponseDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "$ref": "#/components/schemas/ExportJobType"
          },
          "status": {
            "$ref": "#/components/schemas/ExportJobStatus"
          },
          "resourceKey": {
            "type": "string",
            "nullable": true
          },
          "format": {
            "$ref": "#/components/schemas/ExportFileType"
          },
          "columns": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExportColumnSelection"
            },
            "nullable": true
          },
          "pageNumber": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "recordLimit": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "fileName": {
            "type": "string",
            "nullable": true
          },
          "fileSize": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "startedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "completedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "errorMessage": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ExportJobStatus": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "format": "int32"
      },
      "ExportJobType": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "ExportResourceColumnsResponseDto": {
        "type": "object",
        "properties": {
          "resourceKey": {
            "type": "string",
            "nullable": true
          },
          "supportsFullFrameImage": {
            "type": "boolean"
          },
          "supportsCroppedImage": {
            "type": "boolean"
          },
          "columns": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExportColumnResponseDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ExportResourceResponseDto": {
        "type": "object",
        "properties": {
          "resourceKey": {
            "type": "string",
            "nullable": true
          },
          "supportedFormats": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExportFileType"
            },
            "nullable": true
          },
          "supportsFullFrameImage": {
            "type": "boolean"
          },
          "supportsCroppedImage": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "FaceConfigurationDto": {
        "required": [
          "faceDeviceConfiguration"
        ],
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneDto"
            },
            "nullable": true
          },
          "useGpu": {
            "type": "boolean"
          },
          "height": {
            "type": "number",
            "format": "double"
          },
          "width": {
            "type": "number",
            "format": "double"
          },
          "personDetectionsConfidence": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detectionConfidence": {
            "type": "number",
            "format": "double"
          },
          "yawThreshold": {
            "type": "number",
            "format": "double"
          },
          "sharpnessConfidence": {
            "type": "number",
            "format": "double"
          },
          "pitchThreshold": {
            "type": "number",
            "format": "double"
          },
          "excludeBlackBorders": {
            "type": "boolean"
          },
          "excludeNotAlive": {
            "type": "boolean"
          },
          "saveUnknownFaces": {
            "type": "boolean"
          },
          "recognitionConfidenceThreshold": {
            "type": "number",
            "format": "float"
          },
          "faceDeviceType": {
            "$ref": "#/components/schemas/FaceDeviceType"
          },
          "faceDeviceConfiguration": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FaceDeviceType": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "FaceDto": {
        "type": "object",
        "properties": {
          "mediaSource": {
            "$ref": "#/components/schemas/MediaSourceDto"
          },
          "detectionDate": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "minAge": {
            "type": "integer",
            "format": "int32"
          },
          "maxAge": {
            "type": "integer",
            "format": "int32"
          },
          "gender": {
            "$ref": "#/components/schemas/Gender"
          },
          "featureVector": {
            "type": "string",
            "nullable": true
          },
          "detectionConfidence": {
            "type": "integer",
            "format": "int32"
          },
          "recognized": {
            "type": "boolean"
          },
          "boundingBox": {
            "type": "string",
            "nullable": true
          },
          "personRecognitionConfidence": {
            "type": "integer",
            "format": "int32"
          },
          "analyzerIdentifier": {
            "type": "string",
            "nullable": true
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "mediaSourceName": {
            "type": "string",
            "nullable": true
          },
          "enrolledPersonId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "analyzedImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "imageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "triggerType": {
            "$ref": "#/components/schemas/SearchResultTriggerType"
          },
          "hasFaceVehicleDetection": {
            "type": "boolean"
          },
          "person": {
            "$ref": "#/components/schemas/PersonDto"
          }
        },
        "additionalProperties": false
      },
      "FaceFeatureVectorResult": {
        "type": "object",
        "properties": {
          "featureVector": {
            "type": "string",
            "nullable": true
          },
          "yaw": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "pitch": {
            "type": "number",
            "format": "double",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FaceFilterRequest": {
        "required": [
          "count",
          "page"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "page": {
            "maximum": 10000000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "peopleIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "faceSimilarity": {
            "$ref": "#/components/schemas/ImageSimilarityFilter"
          },
          "noFaceOption": {
            "$ref": "#/components/schemas/DetectionFilterOption"
          },
          "age": {
            "$ref": "#/components/schemas/MinMaxFilter"
          },
          "confidence": {
            "$ref": "#/components/schemas/MinMaxFilter"
          },
          "genders": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "triggered": {
            "type": "boolean",
            "nullable": true
          },
          "generalSearch": {
            "maxLength": 50,
            "minLength": 3,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FaceJoinWatchListDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "minAge": {
            "type": "integer",
            "format": "int32"
          },
          "maxAge": {
            "type": "integer",
            "format": "int32"
          },
          "gender": {
            "$ref": "#/components/schemas/Gender"
          },
          "featureVector": {
            "type": "string",
            "nullable": true
          },
          "detectionConfidence": {
            "type": "integer",
            "format": "int32"
          },
          "boundingBox": {
            "type": "string",
            "nullable": true
          },
          "personRecognitionConfidence": {
            "type": "integer",
            "format": "int32"
          },
          "analyzerIdentifier": {
            "type": "string",
            "nullable": true
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "mediaSourceName": {
            "type": "string",
            "nullable": true
          },
          "enrolledPersonId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "analyzedImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "imageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "triggerType": {
            "$ref": "#/components/schemas/SearchResultTriggerType"
          },
          "hasFaceVehicleDetection": {
            "type": "boolean"
          },
          "watchListIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "detectionDate": {
            "type": "integer",
            "format": "int64",
            "nullable": true
          },
          "enrolledPerson": {
            "$ref": "#/components/schemas/PersonDto"
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          },
          "recognized": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "FaceVehicleDetectionDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "face": {
            "$ref": "#/components/schemas/FaceJoinWatchListDto"
          },
          "vehicleInfo": {
            "$ref": "#/components/schemas/VehicleInfoDto"
          }
        },
        "additionalProperties": false
      },
      "FaceVehicleDetectionFilterRequest": {
        "required": [
          "count",
          "page"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "page": {
            "maximum": 10000000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "peopleIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "faceSimilarity": {
            "$ref": "#/components/schemas/ImageSimilarityFilter"
          },
          "noFaceOption": {
            "$ref": "#/components/schemas/DetectionFilterOption"
          },
          "age": {
            "$ref": "#/components/schemas/MinMaxFilter"
          },
          "confidence": {
            "$ref": "#/components/schemas/MinMaxFilter"
          },
          "genders": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "generalSearch": {
            "maxLength": 50,
            "minLength": 3,
            "type": "string",
            "nullable": true
          },
          "plateFilter": {
            "$ref": "#/components/schemas/PlateSearchFilter"
          },
          "zoneNameFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "plateColorFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "countryFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "stateFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "makeFilter": {
            "$ref": "#/components/schemas/MultiDetailedMinMaxFilter"
          },
          "modelFilter": {
            "$ref": "#/components/schemas/MultiDetailedMinMaxFilter"
          },
          "categoryFilter": {
            "$ref": "#/components/schemas/MultiDetailedMinMaxFilter"
          },
          "colorFilter": {
            "$ref": "#/components/schemas/MultiDetailedMinMaxFilter"
          },
          "triggered": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FeatureLicenseDto": {
        "type": "object",
        "properties": {
          "rfl": {
            "type": "string",
            "nullable": true
          },
          "encryptedLicense": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_AuditLogDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AuditLogDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_ContainerInfoDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ContainerInfoDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_EnrolledVehicleDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnrolledVehicleDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_ExportJobResponseDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ExportJobResponseDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_FaceDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FaceDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_FaceJoinWatchListDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FaceJoinWatchListDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_FaceVehicleDetectionDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FaceVehicleDetectionDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_FlowDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlowDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_FlowEventDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlowEventDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_FrameDetectionDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FrameDetectionDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_LiveFeedViewDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LiveFeedViewDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_MediaSourceDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MediaSourceDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_PersonDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_SavedQueryDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SavedQueryDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_TriggeredAlarmSummaryDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TriggeredAlarmSummaryDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_TriggeredEventDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TriggeredEventDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_UserDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UserDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_VehicleInfoDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VehicleInfoDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchResponse_WatchListDtoList": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListDto"
            },
            "nullable": true
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "resultCode": {
            "type": "integer",
            "format": "int32"
          },
          "totalCount": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "FetchVmsOutputsRequest": {
        "type": "object",
        "properties": {
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "outputIds": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FlowBulkDeleteRequest": {
        "required": [
          "ids"
        ],
        "type": "object",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          }
        },
        "additionalProperties": false
      },
      "FlowCreateRequest": {
        "required": [
          "entityType",
          "name",
          "status"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "estimatedTime": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/FlowStatusType"
          },
          "entityType": {
            "$ref": "#/components/schemas/FlowEntityTypes"
          },
          "stages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StageCreateRequest"
            },
            "nullable": true
          },
          "sections": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SectionCreateRequest"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FlowDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "estimatedTime": {
            "type": "integer",
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/FlowStatusType"
          },
          "entityType": {
            "$ref": "#/components/schemas/FlowEntityTypes"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          },
          "stepCount": {
            "type": "integer",
            "format": "int32"
          },
          "stages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StageDto"
            },
            "nullable": true
          },
          "sections": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SectionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FlowEntityTypes": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "format": "int32"
      },
      "FlowEventDto": {
        "required": [
          "entityRef",
          "outcome"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "flowId": {
            "type": "string",
            "format": "uuid"
          },
          "stageId": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceName": {
            "type": "string",
            "nullable": true
          },
          "entityRef": {
            "type": "string",
            "nullable": true
          },
          "enteredAt": {
            "type": "string",
            "format": "date-time"
          },
          "exitedAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "durationSec": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "outcome": {
            "type": "string",
            "nullable": true
          },
          "violationCode": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "FlowEventFilterRequest": {
        "required": [
          "count",
          "page"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "page": {
            "maximum": 10000000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "flowId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "stageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "entityRef": {
            "type": "string",
            "nullable": true
          },
          "outcomes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "FlowMediaSourceDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FlowStatusType": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "FlowStatusUpdateRequest": {
        "required": [
          "status"
        ],
        "type": "object",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/FlowStatusType"
          }
        },
        "additionalProperties": false
      },
      "FlowStepType": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "FlowUpdateRequest": {
        "required": [
          "entityType",
          "name",
          "status"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "estimatedTime": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/FlowStatusType"
          },
          "entityType": {
            "$ref": "#/components/schemas/FlowEntityTypes"
          },
          "stages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StageUpdateRequest"
            },
            "nullable": true
          },
          "sections": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SectionUpdateRequest"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FlowViolationCode": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "format": "int32"
      },
      "FlowWidgetDataFiltersRequest": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "flowId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "aggregation": {
            "$ref": "#/components/schemas/BucketGranularity"
          },
          "violationType": {
            "$ref": "#/components/schemas/FlowViolationCode"
          }
        },
        "additionalProperties": false
      },
      "FlowWidgetResponseCategory": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "type": "integer",
        "format": "int32"
      },
      "ForgotPasswordRequest": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "FrameDetectionDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceName": {
            "type": "string",
            "nullable": true
          },
          "detectionCount": {
            "type": "integer",
            "format": "int32"
          },
          "frameWidth": {
            "type": "integer",
            "format": "int32"
          },
          "frameHeight": {
            "type": "integer",
            "format": "int32"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "objectDetectionCounts": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ObjectDetectionCountDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "Gender": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "GeneralLicenseRequest": {
        "type": "object",
        "properties": {
          "mediaSourceLicenseCountDto": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MediaSourceLicenseCountDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GeneralMediaSourceConfigDto": {
        "type": "object",
        "properties": {
          "maskInfo": {
            "type": "string",
            "nullable": true
          },
          "isMaskActive": {
            "type": "boolean"
          },
          "maskType": {
            "$ref": "#/components/schemas/StreamMaskType"
          },
          "maskBytes": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "GetAnprWidgetDataRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/AnprWidgetDataFiltersRequest"
          }
        },
        "additionalProperties": false
      },
      "GetAnprWidgetRowsRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/AnprWidgetDataFiltersRequest"
          },
          "page": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "sortColumn": {
            "type": "string",
            "nullable": true
          },
          "sortDescending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "GetCountingWidgetDataRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/CountingWidgetDataFiltersRequest"
          }
        },
        "additionalProperties": false
      },
      "GetCountingWidgetRowsRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/CountingWidgetDataFiltersRequest"
          },
          "page": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "sortColumn": {
            "type": "string",
            "nullable": true
          },
          "sortDescending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "GetFlowWidgetDataRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/FlowWidgetDataFiltersRequest"
          }
        },
        "additionalProperties": false
      },
      "GetFlowWidgetRowsRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/FlowWidgetDataFiltersRequest"
          },
          "page": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "sortColumn": {
            "type": "string",
            "nullable": true
          },
          "sortDescending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "GetIncidentWidgetDataRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/IncidentWidgetDataFiltersRequest"
          }
        },
        "additionalProperties": false
      },
      "GetIncidentWidgetRowsRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/IncidentWidgetDataFiltersRequest"
          },
          "page": {
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "type": "integer",
            "format": "int32"
          },
          "sortColumn": {
            "type": "string",
            "nullable": true
          },
          "sortDescending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "GetModuleClassesRequest": {
        "type": "object",
        "properties": {
          "module": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "subModule": {
            "$ref": "#/components/schemas/PpeModel"
          }
        },
        "additionalProperties": false
      },
      "GetVfrWidgetDataRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/VfrWidgetDataFiltersRequest"
          }
        },
        "additionalProperties": false
      },
      "GetVfrWidgetRowsRequest": {
        "required": [
          "filters"
        ],
        "type": "object",
        "properties": {
          "filters": {
            "$ref": "#/components/schemas/VfrWidgetDataFiltersRequest"
          },
          "page": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "sortColumn": {
            "type": "string",
            "nullable": true
          },
          "sortDescending": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "HttpValidationProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "nullable": true
          }
        },
        "additionalProperties": {}
      },
      "IdentityRoleClaimDto": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "value": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "IdentityRoleDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "claims": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/IdentityRoleClaimDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ImageRequest": {
        "type": "object",
        "properties": {
          "base64Image": {
            "type": "string",
            "nullable": true
          },
          "excludeChecks": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ImageSimilarityFilter": {
        "type": "object",
        "properties": {
          "similarity": {
            "type": "number",
            "format": "double"
          },
          "image": {
            "type": "string",
            "format": "byte",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "IncidentWidgetDataFiltersRequest": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "aggregation": {
            "$ref": "#/components/schemas/BucketGranularity"
          },
          "incidentTypeAnalyticModule": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZenModule"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "IncidentWidgetResponseCategory": {
        "enum": [
          1,
          2,
          4,
          5,
          7
        ],
        "type": "integer",
        "format": "int32"
      },
      "InfoRequest": {
        "type": "object",
        "properties": {
          "newEmail": {
            "type": "string",
            "nullable": true
          },
          "newPassword": {
            "type": "string",
            "nullable": true
          },
          "oldPassword": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "InfoResponse": {
        "required": [
          "email",
          "isEmailConfirmed"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "isEmailConfirmed": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "JsonNode": {
        "type": "object",
        "properties": {
          "options": {},
          "parent": {},
          "root": {}
        },
        "additionalProperties": false
      },
      "KpiItem": {
        "type": "object",
        "properties": {
          "value": {
            "type": "number",
            "format": "double"
          },
          "previousValue": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "deltaPct": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "nullable": true
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "sparkline": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeSeriesPoint"
            },
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KpiListPayload": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KpiItem"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "KpiPayload": {
        "type": "object",
        "properties": {
          "value": {
            "type": "number",
            "format": "double"
          },
          "previousValue": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "deltaPct": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "string",
            "nullable": true
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "sparkline": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeSeriesPoint"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LicenseInfoDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "licenseType": {
            "type": "string",
            "nullable": true
          },
          "licensedTo": {
            "type": "string",
            "nullable": true
          },
          "releaseVersion": {
            "type": "string",
            "nullable": true
          },
          "generatedOn": {
            "type": "string",
            "format": "date-time"
          },
          "licenseExpiryDate": {
            "type": "string",
            "format": "date-time"
          },
          "licenseFeatures": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "nullable": true
          },
          "licenseLimits": {
            "type": "object",
            "properties": {
              "Hawk": {
                "type": "integer",
                "format": "int32"
              },
              "Falcon": {
                "type": "integer",
                "format": "int32"
              },
              "Eagle": {
                "type": "integer",
                "format": "int32"
              },
              "Phoenix": {
                "type": "integer",
                "format": "int32"
              },
              "None": {
                "type": "integer",
                "format": "int32"
              }
            },
            "additionalProperties": false,
            "nullable": true
          },
          "licensedServers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LicenseServerDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LicensePlateDto": {
        "type": "object",
        "properties": {
          "number": {
            "type": "string",
            "nullable": true
          },
          "country": {
            "type": "string",
            "nullable": true
          },
          "state": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "type": "string",
            "nullable": true
          },
          "color": {
            "type": "string",
            "nullable": true
          },
          "confidence": {
            "type": "integer",
            "format": "int32"
          },
          "boundingBox": {
            "$ref": "#/components/schemas/AnprBoundingBoxDto"
          },
          "analyzedImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "fullFrameImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LicenseRequestType": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "LicenseServerDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/ServerType"
          },
          "rfl": {
            "type": "string",
            "nullable": true
          },
          "features": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/FeatureLicenseDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LineDirection": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "LiveFeedFolderDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "parentFolderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "LiveFeedFolderTreeNodeDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "parentFolderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "childCount": {
            "type": "integer",
            "format": "int32"
          },
          "viewCount": {
            "type": "integer",
            "format": "int32"
          },
          "children": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LiveFeedFolderTreeNodeDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LiveFeedViewDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "folderId": {
            "type": "string",
            "format": "uuid"
          },
          "gridRows": {
            "type": "integer",
            "format": "int32"
          },
          "gridColumns": {
            "type": "integer",
            "format": "int32"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "slots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LiveFeedViewSlotDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "LiveFeedViewSlotConfigRequest": {
        "type": "object",
        "properties": {
          "slotIndex": {
            "maximum": 2147483647,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "enabledModules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZenModule"
            },
            "nullable": true
          },
          "includeNonFaceDetectedResults": {
            "type": "boolean"
          },
          "includeNonPlateDetectedResults": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "LiveFeedViewSlotDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "viewId": {
            "type": "string",
            "format": "uuid"
          },
          "slotIndex": {
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "enabledModules": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZenModule"
            },
            "nullable": true
          },
          "includeNonFaceDetectedResults": {
            "type": "boolean"
          },
          "includeNonPlateDetectedResults": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "LoginRequest": {
        "required": [
          "email",
          "password"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          },
          "twoFactorCode": {
            "type": "string",
            "nullable": true
          },
          "twoFactorRecoveryCode": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MMRColorDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "confidence": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "MakeDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "confidence": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "MediaSourceDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceFqid": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "serverId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "floorNumber": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "plan": {
            "$ref": "#/components/schemas/AnalyticPlan"
          },
          "buildingName": {
            "type": "string",
            "nullable": true
          },
          "address": {
            "type": "string",
            "nullable": true
          },
          "mediaSourceIp": {
            "type": "string",
            "nullable": true
          },
          "mediaSourcePort": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "mediaSourceUsername": {
            "type": "string",
            "nullable": true
          },
          "mediaSourcePassword": {
            "type": "string",
            "nullable": true
          },
          "longitude": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "streamQuality": {
            "type": "integer",
            "format": "int32"
          },
          "streamFramesPerSecond": {
            "type": "integer",
            "format": "int32"
          },
          "streamWidth": {
            "type": "integer",
            "format": "int32"
          },
          "streamHeight": {
            "type": "integer",
            "format": "int32"
          },
          "latitude": {
            "type": "number",
            "format": "double",
            "nullable": true
          },
          "streamUrl": {
            "type": "string",
            "nullable": true
          },
          "snapshotPath": {
            "type": "string",
            "nullable": true
          },
          "snapshotTakenAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "mediaSourceProviderType": {
            "$ref": "#/components/schemas/MediaSourceProviderType"
          }
        },
        "additionalProperties": false
      },
      "MediaSourceGroupDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "isDefault": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MediaSourceGroupPermissionDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "userId": {
            "type": "string",
            "format": "uuid"
          },
          "permissionId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "MediaSourceGroupPermissionRequest": {
        "type": "object",
        "properties": {
          "mediaSourceGroupPermissions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MediaSourceGroupPermissionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MediaSourceLicenseCountDto": {
        "type": "object",
        "properties": {
          "licenseRequest": {
            "$ref": "#/components/schemas/LicenseRequestType"
          },
          "mediaSourceCount": {
            "type": "integer",
            "format": "int32"
          },
          "analyticPlan": {
            "$ref": "#/components/schemas/AnalyticPlan"
          }
        },
        "additionalProperties": false
      },
      "MediaSourceLinkConfigDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "$ref": "#/components/schemas/MediaSourceLinkConfigType"
          },
          "config": {
            "type": "object",
            "additionalProperties": {
              "$ref": "#/components/schemas/JsonNode"
            },
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MediaSourceLinkConfigType": {
        "enum": [
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "MediaSourceLinkDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "configs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MediaSourceLinkConfigDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MediaSourceModuleConfigurationDto": {
        "type": "object",
        "properties": {
          "mediaSourceModuleId": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "module": {
            "enum": [
              1,
              2,
              3,
              5,
              6,
              101,
              102,
              103,
              104,
              105,
              106,
              107,
              108,
              109,
              110,
              111,
              201,
              202,
              203,
              204,
              301,
              302,
              303,
              304,
              -1
            ],
            "type": "integer",
            "format": "int32"
          },
          "config": {
            "type": "string",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "MediaSourceProviderAuthorization": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "MediaSourceProviderDto": {
        "type": "object",
        "properties": {
          "hostUri": {
            "type": "string",
            "nullable": true
          },
          "authUri": {
            "type": "string",
            "nullable": true
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          },
          "authorization": {
            "$ref": "#/components/schemas/MediaSourceProviderAuthorization"
          },
          "providerType": {
            "$ref": "#/components/schemas/MediaSourceProviderType"
          }
        },
        "additionalProperties": false
      },
      "MediaSourceProviderParamsDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "providerType": {
            "$ref": "#/components/schemas/MediaSourceProviderType"
          },
          "hostUri": {
            "type": "string",
            "nullable": true
          },
          "authUri": {
            "type": "string",
            "nullable": true
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          },
          "authorization": {
            "$ref": "#/components/schemas/MediaSourceProviderAuthorization"
          }
        },
        "additionalProperties": false
      },
      "MediaSourceProviderType": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "MediaSourceScheduleDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "moduleType": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "isEnabled": {
            "type": "boolean"
          },
          "startTime": {
            "type": "string",
            "format": "time"
          },
          "endTime": {
            "type": "string",
            "format": "time"
          },
          "monday": {
            "type": "boolean"
          },
          "tuesday": {
            "type": "boolean"
          },
          "wednesday": {
            "type": "boolean"
          },
          "thursday": {
            "type": "boolean"
          },
          "friday": {
            "type": "boolean"
          },
          "saturday": {
            "type": "boolean"
          },
          "sunday": {
            "type": "boolean"
          },
          "timeZoneId": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MinMaxFilter": {
        "type": "object",
        "properties": {
          "min": {
            "type": "number",
            "format": "float",
            "nullable": true
          },
          "max": {
            "type": "number",
            "format": "float",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MissingLeftConfigurationDto": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneDto"
            },
            "nullable": true
          },
          "alarmThresholdSeconds": {
            "type": "integer",
            "format": "int32"
          },
          "calibrationTimeSeconds": {
            "type": "integer",
            "format": "int32"
          },
          "minWidthRatio": {
            "type": "number",
            "format": "float"
          },
          "maxWidthRatio": {
            "type": "number",
            "format": "float"
          },
          "compressionLevel": {
            "$ref": "#/components/schemas/CompressionLevel"
          },
          "pixelVariationThreshold": {
            "type": "integer",
            "format": "int32"
          },
          "autoRecalibrateEnabled": {
            "type": "boolean"
          },
          "autoRecalibrateThreshold": {
            "type": "number",
            "format": "double"
          },
          "autoRecalibrateDelaySeconds": {
            "type": "integer",
            "format": "int32"
          },
          "providerEventId": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ModelDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "confidence": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ModelMakeRecognitionDto": {
        "type": "object",
        "properties": {
          "make": {
            "$ref": "#/components/schemas/MakeDto"
          },
          "model": {
            "$ref": "#/components/schemas/ModelDto"
          },
          "category": {
            "$ref": "#/components/schemas/CategoryDto"
          },
          "color": {
            "$ref": "#/components/schemas/MMRColorDto"
          }
        },
        "additionalProperties": false
      },
      "ModuleDefaultsDto": {
        "type": "object",
        "properties": {
          "face": {
            "$ref": "#/components/schemas/FaceConfigurationDto"
          },
          "ppe": {
            "$ref": "#/components/schemas/PpeConfigurationDto"
          },
          "perimeter": {
            "$ref": "#/components/schemas/PerimeterConfigurationDto"
          },
          "fireSmoke": {
            "$ref": "#/components/schemas/SmokeAndFireConfigurationDto"
          },
          "suddenStop": {
            "$ref": "#/components/schemas/SuddenStopConfigurationDto"
          },
          "movementAnalysis": {
            "$ref": "#/components/schemas/MovementAnalysisConfigurationDto"
          },
          "missingLeft": {
            "$ref": "#/components/schemas/MissingLeftConfigurationDto"
          },
          "accr": {
            "$ref": "#/components/schemas/AccrConfigurationDto"
          },
          "anpr": {
            "$ref": "#/components/schemas/AnprConfigurationDto"
          },
          "pedestrianZoneDefaults": {
            "$ref": "#/components/schemas/PedestrianZoneDto"
          },
          "occupancyZoneDefaults": {
            "$ref": "#/components/schemas/OccupancyZoneDto"
          },
          "countingZoneDefaults": {
            "$ref": "#/components/schemas/CountingZoneDto"
          },
          "movementAnalysisZoneDefaults": {
            "$ref": "#/components/schemas/MovementAnalysisZoneDto"
          }
        },
        "additionalProperties": false
      },
      "ModuleDto": {
        "type": "object",
        "properties": {
          "moduleType": {
            "$ref": "#/components/schemas/ZenModule"
          }
        },
        "additionalProperties": false
      },
      "MoveLiveFeedViewRequest": {
        "type": "object",
        "properties": {
          "viewId": {
            "type": "string",
            "format": "uuid"
          },
          "folderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MovementAnalysisConfigurationDto": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MovementAnalysisZoneDto"
            },
            "nullable": true
          },
          "providerEventId": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "MovementAnalysisZoneDto": {
        "required": [
          "allowedObjectTypes"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "zoneMode": {
            "$ref": "#/components/schemas/ZoneMode"
          },
          "cmPerPixelRatio": {
            "type": "number",
            "format": "double"
          },
          "anchors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatioAnchorDto"
            },
            "nullable": true
          },
          "allowedObjectTypes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "allowedZoneDirection": {
            "$ref": "#/components/schemas/ZoneDirection"
          },
          "lineAnchors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatioAnchorDto"
            },
            "nullable": true
          },
          "deviationAngle": {
            "type": "number",
            "format": "float",
            "nullable": true
          },
          "cooldown": {
            "type": "integer",
            "format": "int32"
          },
          "mode": {
            "$ref": "#/components/schemas/MovementAnalysisZoneMode"
          },
          "suddenStopConfigurationMode": {
            "$ref": "#/components/schemas/SuddenStopConfigurationMode"
          },
          "suddenStopScenario": {
            "$ref": "#/components/schemas/SuddenStopScenario"
          },
          "suddenStopSensitivity": {
            "$ref": "#/components/schemas/SuddenStopSensitivity"
          },
          "suddenStopDetectionMode": {
            "$ref": "#/components/schemas/SuddenStopDetectionMode"
          },
          "suddenStopMinSpeedPixelsPerSecond": {
            "type": "number",
            "format": "double"
          },
          "suddenStopMaxCurrentSpeedForAlarmPxPerSec": {
            "type": "number",
            "format": "double"
          },
          "suddenStopMinSpeedDropPercentOfReferenceSpeed": {
            "type": "number",
            "format": "double"
          },
          "suddenStopMaxSampleDisplacementBoxDiagonalMultiplier": {
            "type": "number",
            "format": "double"
          },
          "suddenStopRequiredDecelerationForAlarmPxPerSec2": {
            "type": "number",
            "format": "double"
          },
          "suddenStopStationarySpeedThresholdPxPerSec": {
            "type": "number",
            "format": "double"
          },
          "suddenStopSpeedEstimationWindowFrames": {
            "type": "integer",
            "format": "int32"
          },
          "suddenStopSpeedChangeWindowFrames": {
            "type": "integer",
            "format": "int32"
          },
          "suddenStopMinConsecutiveStrongBrakingFrames": {
            "type": "integer",
            "format": "int32"
          },
          "suddenStopStationaryDurationSeconds": {
            "type": "number",
            "format": "double"
          },
          "suddenStopMinTrackObservationSeconds": {
            "type": "number",
            "format": "double"
          },
          "suddenStopEventCooldownSeconds": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "MovementAnalysisZoneMode": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "MultiDetailedMinMaxFilter": {
        "type": "object",
        "properties": {
          "values": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "confidence": {
            "$ref": "#/components/schemas/MinMaxFilter"
          }
        },
        "additionalProperties": false
      },
      "NoPlateMode": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "ObjectClassificationColor": {
        "required": [
          "type"
        ],
        "type": "object",
        "properties": {
          "type": {
            "$ref": "#/components/schemas/Enum"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "color": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ObjectClassificationColorResponse": {
        "required": [
          "items",
          "module"
        ],
        "type": "object",
        "properties": {
          "module": {
            "type": "string",
            "nullable": true
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ObjectClassificationColor"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ObjectClassificationFilterRequest": {
        "required": [
          "count",
          "page"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "page": {
            "maximum": 10000000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "zonesFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "operatorFilter": {
            "$ref": "#/components/schemas/Operators"
          },
          "detailsFilter": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ObjectDetailFilterRequest"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ObjectColorPaletteKind": {
        "enum": [
          "Person",
          "Vehicle"
        ],
        "type": "string"
      },
      "ObjectDetailFilterRequest": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "colors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "count": {
            "$ref": "#/components/schemas/MinMaxFilter"
          },
          "confidence": {
            "$ref": "#/components/schemas/MinMaxFilter"
          }
        },
        "additionalProperties": false
      },
      "ObjectDetectionCountDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "class": {
            "type": "integer",
            "format": "int32"
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "count": {
            "type": "integer",
            "format": "int32"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "OccupancyType": {
        "enum": [
          0
        ],
        "type": "integer",
        "format": "int32"
      },
      "OccupancyValueMode": {
        "enum": [
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "OccupancyZoneDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "zoneMode": {
            "$ref": "#/components/schemas/ZoneMode"
          },
          "cmPerPixelRatio": {
            "type": "number",
            "format": "double"
          },
          "anchors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatioAnchorDto"
            },
            "nullable": true
          },
          "providerEventId": {
            "type": "string",
            "nullable": true
          },
          "occupancyType": {
            "$ref": "#/components/schemas/OccupancyType"
          },
          "toleranceRate": {
            "type": "integer",
            "format": "int32"
          },
          "usePercentages": {
            "type": "boolean"
          },
          "aboveThresholdValue": {
            "type": "integer",
            "format": "int32"
          },
          "sendAboveThresholdAlarm": {
            "type": "boolean"
          },
          "belowThresholdValue": {
            "type": "integer",
            "format": "int32"
          },
          "sendBelowThresholdAlarm": {
            "type": "boolean"
          },
          "processingIntervalSeconds": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "Operators": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "OutputDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "outputId": {
            "type": "string",
            "nullable": true
          },
          "outputName": {
            "type": "string",
            "nullable": true
          },
          "hardwareId": {
            "type": "string",
            "nullable": true
          },
          "hardwareName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PageResponse_MediaSourceLinkDtoList": {
        "type": "object",
        "properties": {
          "totalCount": {
            "type": "integer",
            "format": "int64"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MediaSourceLinkDto"
            },
            "nullable": true
          },
          "durationSeconds": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "PageResponse_WidgetRowDtoList": {
        "type": "object",
        "properties": {
          "totalCount": {
            "type": "integer",
            "format": "int64"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WidgetRowDto"
            },
            "nullable": true
          },
          "durationSeconds": {
            "type": "integer",
            "format": "int64"
          }
        },
        "additionalProperties": false
      },
      "PaletteGroupResponse": {
        "required": [
          "colors",
          "paletteType"
        ],
        "type": "object",
        "properties": {
          "paletteType": {
            "$ref": "#/components/schemas/ObjectColorPaletteKind"
          },
          "colors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AvailableColorResponse"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PedestrianBufferBehavior": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "PedestrianZoneDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "zoneMode": {
            "$ref": "#/components/schemas/ZoneMode"
          },
          "cmPerPixelRatio": {
            "type": "number",
            "format": "double"
          },
          "anchors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatioAnchorDto"
            },
            "nullable": true
          },
          "cooldownSeconds": {
            "type": "integer",
            "format": "int32"
          },
          "confirmationDurationSeconds": {
            "type": "number",
            "format": "double"
          },
          "minZoneContainmentRatio": {
            "type": "number",
            "format": "float"
          },
          "enableBufferZone": {
            "type": "boolean"
          },
          "bufferBehaviorMode": {
            "$ref": "#/components/schemas/PedestrianBufferBehavior"
          },
          "edgeBuffers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EdgeBufferDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PerimeterConfigurationDto": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneDto"
            },
            "nullable": true
          },
          "acceptedClasses": {
            "uniqueItems": true,
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "includeTopLeft": {
            "type": "boolean"
          },
          "includeTopRight": {
            "type": "boolean"
          },
          "includeBottomLeft": {
            "type": "boolean"
          },
          "includeBottomRight": {
            "type": "boolean"
          },
          "includeCenter": {
            "type": "boolean"
          },
          "providerEventId": {
            "type": "string",
            "nullable": true
          },
          "coolDownSeconds": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "PersonDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "customField1": {
            "type": "string",
            "nullable": true
          },
          "customField2": {
            "type": "string",
            "nullable": true
          },
          "customField3": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "birthYear": {
            "type": "integer",
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/PersonStatus"
          },
          "relatedFaces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnrolledFaceDto"
            },
            "nullable": true
          },
          "groups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonGroupDto"
            },
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoleDto"
            },
            "nullable": true
          },
          "vehicles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnrolledVehicleDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PersonEnrollmentFilter": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "PersonGroupDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "alertOnCapture": {
            "type": "boolean"
          },
          "isDefault": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "PersonStatus": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "PlateSearchFilter": {
        "type": "object",
        "properties": {
          "noPlateOption": {
            "$ref": "#/components/schemas/DetectionFilterOption"
          },
          "plateNumber": {
            "type": "string",
            "nullable": true
          },
          "searchOperation": {
            "$ref": "#/components/schemas/ComparisonOperation"
          },
          "confidence": {
            "$ref": "#/components/schemas/MinMaxFilter"
          },
          "plateTypeFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PpeConfigurationDto": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneDto"
            },
            "nullable": true
          },
          "maximumWidth": {
            "type": "integer",
            "format": "int32"
          },
          "maximumHeight": {
            "type": "integer",
            "format": "int32"
          },
          "minimumWidth": {
            "type": "integer",
            "format": "int32"
          },
          "minimumHeight": {
            "type": "integer",
            "format": "int32"
          },
          "providerEventId": {
            "type": "string",
            "nullable": true
          },
          "modelConfigurations": {
            "type": "object",
            "properties": {
              "Food": {
                "$ref": "#/components/schemas/PpeModelConfigurationDto"
              },
              "Industrial": {
                "$ref": "#/components/schemas/PpeModelConfigurationDto"
              },
              "Medical": {
                "$ref": "#/components/schemas/PpeModelConfigurationDto"
              }
            },
            "additionalProperties": false,
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "PpeModel": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "PpeModelConfigurationDto": {
        "type": "object",
        "properties": {
          "acceptedClassDictionary": {
            "type": "object",
            "additionalProperties": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "cooldown": {
            "type": "integer",
            "format": "int32"
          },
          "frameSample": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "ProblemDetails": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "nullable": true
          },
          "title": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "detail": {
            "type": "string",
            "nullable": true
          },
          "instance": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": {}
      },
      "ProviderMediaSourceResponseDto": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "id": {
            "type": "string",
            "nullable": true
          },
          "mediaSourceIp": {
            "type": "string",
            "nullable": true
          },
          "mediaSourcePort": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ProvisionCameraRequest": {
        "type": "object",
        "properties": {
          "forceReconcile": {
            "type": "boolean"
          },
          "ipAddress": {
            "type": "string",
            "nullable": true
          },
          "port": {
            "maximum": 65535,
            "minimum": 1,
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "username": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          },
          "cameraKey": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RankedPayload": {
        "type": "object",
        "properties": {
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RankedRow"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RankedRow": {
        "type": "object",
        "properties": {
          "rank": {
            "type": "integer",
            "format": "int32"
          },
          "values": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RatioAnchorDto": {
        "type": "object",
        "properties": {
          "ratioX": {
            "type": "number",
            "format": "double"
          },
          "ratioY": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "RefreshRequest": {
        "required": [
          "refreshToken"
        ],
        "type": "object",
        "properties": {
          "refreshToken": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RegisterRequest": {
        "required": [
          "email",
          "password"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "password": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RemoveMediaSourceFromGroupRequest": {
        "required": [
          "groupId",
          "mediaSourceId"
        ],
        "type": "object",
        "properties": {
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "groupId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "ReplaceLiveFeedViewSlotsRequest": {
        "required": [
          "slots"
        ],
        "type": "object",
        "properties": {
          "viewId": {
            "type": "string",
            "format": "uuid"
          },
          "slots": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LiveFeedViewSlotConfigRequest"
            }
          }
        },
        "additionalProperties": false
      },
      "ResendConfirmationEmailRequest": {
        "required": [
          "email"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ResetPasswordRequest": {
        "required": [
          "email",
          "newPassword",
          "resetCode"
        ],
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "nullable": true
          },
          "resetCode": {
            "type": "string",
            "nullable": true
          },
          "newPassword": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "RoleDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SavedQueryDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "isShared": {
            "type": "boolean"
          },
          "moduleType": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "ownerId": {
            "type": "string",
            "format": "uuid"
          },
          "ownerName": {
            "type": "string",
            "nullable": true
          },
          "isOwned": {
            "type": "boolean"
          },
          "filterPayload": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "SavedQueryFilterType": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "ScheduleStatusBulkRequest": {
        "required": [
          "mediaSourceIds"
        ],
        "type": "object",
        "properties": {
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "moduleType": {
            "$ref": "#/components/schemas/ZenModule"
          }
        },
        "additionalProperties": false
      },
      "SearchResultTriggerType": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "format": "int32"
      },
      "SearchSortOrder": {
        "enum": [
          0,
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "format": "int32"
      },
      "SectionCreateRequest": {
        "required": [
          "name",
          "stages"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "order": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "isRequired": {
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/FlowStepType"
          },
          "stages": {
            "minItems": 2,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StageCreateRequest"
            }
          }
        },
        "additionalProperties": false
      },
      "SectionDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "order": {
            "type": "integer",
            "format": "int32"
          },
          "isRequired": {
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/FlowStepType"
          },
          "stages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StageDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SectionUpdateRequest": {
        "required": [
          "name",
          "stages"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "order": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "isRequired": {
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/FlowStepType"
          },
          "stages": {
            "minItems": 2,
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StageUpdateRequest"
            }
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "SeriesPayload": {
        "type": "object",
        "properties": {
          "series": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeSeries"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ServerAddRequest": {
        "required": [
          "rfl",
          "serverUuid"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "serverName": {
            "type": "string",
            "nullable": true
          },
          "serverIP": {
            "type": "string",
            "nullable": true
          },
          "serverPort": {
            "type": "integer",
            "format": "int32"
          },
          "serverSecurePort": {
            "type": "integer",
            "format": "int32"
          },
          "isActive": {
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/ServerType"
          },
          "dbConnectionString": {
            "type": "string",
            "nullable": true
          },
          "serverUuid": {
            "type": "string",
            "nullable": true
          },
          "license": {
            "type": "string",
            "nullable": true
          },
          "rfl": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ServerConfigRequest": {
        "type": "object",
        "properties": {
          "serverId": {
            "type": "string",
            "format": "uuid"
          },
          "serverConfiguration": {
            "$ref": "#/components/schemas/ServerConfigurationDto"
          }
        },
        "additionalProperties": false
      },
      "ServerConfigurationDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "dataSourceProvider": {
            "$ref": "#/components/schemas/MediaSourceProviderParamsDto"
          },
          "analyticsDataDestination": {
            "$ref": "#/components/schemas/DataDestinationProviderDto"
          },
          "imagesDataDestination": {
            "$ref": "#/components/schemas/DataDestinationProviderDto"
          },
          "dataDistributionProvider": {
            "$ref": "#/components/schemas/DataDistributionProviderDto"
          }
        },
        "additionalProperties": false
      },
      "ServerDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "serverName": {
            "type": "string",
            "nullable": true
          },
          "serverUUID": {
            "type": "string",
            "nullable": true
          },
          "serverIP": {
            "type": "string",
            "nullable": true
          },
          "serverPort": {
            "type": "integer",
            "format": "int32"
          },
          "serverSecurePort": {
            "type": "integer",
            "format": "int32"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "isActive": {
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/ServerType"
          },
          "dbConnectionString": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ServerType": {
        "enum": [
          0,
          1,
          2,
          3,
          4,
          5,
          6
        ],
        "type": "integer",
        "format": "int32"
      },
      "SmokeAndFireConfigurationDto": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneDto"
            },
            "nullable": true
          },
          "smokeConfidenceThreshold": {
            "type": "integer",
            "format": "int32"
          },
          "fireConfidenceThreshold": {
            "type": "integer",
            "format": "int32"
          },
          "cooldown": {
            "type": "integer",
            "format": "int32"
          },
          "providerEventId": {
            "type": "string",
            "nullable": true
          },
          "minConsecutiveFrames": {
            "type": "integer",
            "format": "int32"
          },
          "locationTolerancePixels": {
            "type": "integer",
            "format": "int32"
          },
          "validationFrameWindow": {
            "type": "integer",
            "format": "int32"
          },
          "smokeMinConfidence": {
            "type": "number",
            "format": "float"
          },
          "fireMinConfidence": {
            "type": "number",
            "format": "float"
          }
        },
        "additionalProperties": false
      },
      "StackedBucketItem": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "nullable": true
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "segments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BucketSegment"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "StackedBucketsPayload": {
        "type": "object",
        "properties": {
          "buckets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/StackedBucketItem"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "StageCreateRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "order": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "isRequired": {
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/FlowStepType"
          },
          "duplicateStageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "minTime": {
            "maximum": 1440,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "maxTime": {
            "maximum": 1440,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "StageDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "order": {
            "type": "integer",
            "format": "int32"
          },
          "isRequired": {
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/FlowStepType"
          },
          "sectionId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "duplicateStageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "minTime": {
            "type": "integer",
            "format": "int32"
          },
          "maxTime": {
            "type": "integer",
            "format": "int32"
          },
          "mediaSources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FlowMediaSourceDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "StageUpdateRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "order": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "isRequired": {
            "type": "boolean"
          },
          "type": {
            "$ref": "#/components/schemas/FlowStepType"
          },
          "duplicateStageId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "minTime": {
            "maximum": 1440,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "maxTime": {
            "maximum": 1440,
            "minimum": 0,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "StreamMaskType": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "SuddenStopConfigurationDto": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "maskZones": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZoneDto"
            },
            "nullable": true
          },
          "providerEventId": {
            "type": "string",
            "nullable": true
          },
          "configurationMode": {
            "$ref": "#/components/schemas/SuddenStopConfigurationMode"
          },
          "scenario": {
            "$ref": "#/components/schemas/SuddenStopScenario"
          },
          "sensitivity": {
            "$ref": "#/components/schemas/SuddenStopSensitivity"
          },
          "detectionMode": {
            "$ref": "#/components/schemas/SuddenStopDetectionMode"
          },
          "minSpeedPixelsPerSecond": {
            "type": "number",
            "format": "double"
          },
          "maxCurrentSpeedForAlarmPxPerSec": {
            "type": "number",
            "format": "double"
          },
          "minSpeedDropPercentOfReferenceSpeed": {
            "type": "number",
            "format": "double"
          },
          "maxSampleDisplacementBoxDiagonalMultiplier": {
            "type": "number",
            "format": "double"
          },
          "requiredDecelerationForAlarmPxPerSec2": {
            "type": "number",
            "format": "double"
          },
          "stationarySpeedThresholdPxPerSec": {
            "type": "number",
            "format": "double"
          },
          "speedEstimationWindowFrames": {
            "type": "integer",
            "format": "int32"
          },
          "speedChangeWindowFrames": {
            "type": "integer",
            "format": "int32"
          },
          "minConsecutiveStrongBrakingFrames": {
            "type": "integer",
            "format": "int32"
          },
          "stationaryDurationSeconds": {
            "type": "number",
            "format": "double"
          },
          "minTrackObservationSeconds": {
            "type": "number",
            "format": "double"
          },
          "eventCooldownSeconds": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "SuddenStopConfigurationMode": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "SuddenStopDetectionMode": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "SuddenStopScenario": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "SuddenStopSensitivity": {
        "enum": [
          0,
          1,
          2
        ],
        "type": "integer",
        "format": "int32"
      },
      "SwitchEnrolledFaceRequest": {
        "type": "object",
        "properties": {
          "sourceFaceId": {
            "type": "string",
            "format": "uuid"
          },
          "sourceEnrolledPersonId": {
            "type": "string",
            "format": "uuid"
          },
          "targetEnrolledPersonId": {
            "type": "string",
            "format": "uuid"
          },
          "enhanceEnrolledFace": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "SyncAssignedMediaSourcesRequest": {
        "type": "object",
        "properties": {
          "serverId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "SyncAssignedMediaSourcesResponseDto": {
        "type": "object",
        "properties": {
          "assignedCount": {
            "type": "integer",
            "format": "int32"
          },
          "providerCount": {
            "type": "integer",
            "format": "int32"
          },
          "matchedCount": {
            "type": "integer",
            "format": "int32"
          },
          "updatedCount": {
            "type": "integer",
            "format": "int32"
          },
          "unchangedCount": {
            "type": "integer",
            "format": "int32"
          },
          "unmatchedCount": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "SystemVersionInfo": {
        "type": "object",
        "properties": {
          "management": {
            "$ref": "#/components/schemas/VersionInfo"
          },
          "monitoring": {
            "$ref": "#/components/schemas/VersionInfo"
          },
          "analytics": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AnalyticsVersionInfo"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TimeSeries": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "nullable": true
          },
          "points": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TimeSeriesPoint"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TimeSeriesPoint": {
        "type": "object",
        "properties": {
          "timestamp": {
            "type": "string",
            "format": "date-time"
          },
          "value": {
            "type": "number",
            "format": "double"
          }
        },
        "additionalProperties": false
      },
      "TriggeredAlarmFilterRequest": {
        "type": "object",
        "properties": {
          "statuses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AlarmStatus"
            },
            "nullable": true
          },
          "severities": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AlarmSeverity"
            },
            "nullable": true
          },
          "assignedUserIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "eventTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZenModule"
            },
            "nullable": true
          },
          "dateFrom": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "includeUnAssigned": {
            "type": "boolean"
          },
          "dateTo": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "search": {
            "maxLength": 200,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "sortBy": {
            "maxLength": 64,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "sortDesc": {
            "type": "boolean"
          },
          "page": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "pageSize": {
            "maximum": 100,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "TriggeredAlarmSummaryDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "message": {
            "type": "string",
            "nullable": true
          },
          "status": {
            "$ref": "#/components/schemas/AlarmStatus"
          },
          "severity": {
            "$ref": "#/components/schemas/AlarmSeverity"
          },
          "category": {
            "type": "string",
            "nullable": true
          },
          "assignedUserName": {
            "type": "string",
            "nullable": true
          },
          "mediaSourceName": {
            "type": "string",
            "nullable": true
          },
          "definedAlarmName": {
            "type": "string",
            "nullable": true
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "additionalProperties": false
      },
      "TriggeredAlarmUpdateRequest": {
        "type": "object",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/AlarmStatus"
          },
          "note": {
            "type": "string",
            "nullable": true
          },
          "assignedUserId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TriggeredEventDto": {
        "required": [
          "mediaSourceId",
          "triggeredBy"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "referencedObjectId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "fullFrameImagePath": {
            "type": "string",
            "nullable": true
          },
          "referencedObject": {},
          "triggeredBy": {
            "type": "string",
            "nullable": true
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceName": {
            "type": "string",
            "nullable": true
          },
          "watchListId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "definedEventId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "moduleType": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          },
          "definedEventName": {
            "type": "string",
            "nullable": true
          },
          "watchListName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TriggeredEventFilterRequest": {
        "required": [
          "count",
          "page"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "page": {
            "maximum": 10000000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "moduleTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ZenModule"
            },
            "nullable": true
          },
          "generalSearch": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "TwoFactorRequest": {
        "type": "object",
        "properties": {
          "enable": {
            "type": "boolean",
            "nullable": true
          },
          "twoFactorCode": {
            "type": "string",
            "nullable": true
          },
          "resetSharedKey": {
            "type": "boolean"
          },
          "resetRecoveryCodes": {
            "type": "boolean"
          },
          "forgetMachine": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "TwoFactorResponse": {
        "required": [
          "isMachineRemembered",
          "isTwoFactorEnabled",
          "recoveryCodesLeft",
          "sharedKey"
        ],
        "type": "object",
        "properties": {
          "sharedKey": {
            "type": "string",
            "nullable": true
          },
          "recoveryCodesLeft": {
            "type": "integer",
            "format": "int32"
          },
          "recoveryCodes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "isTwoFactorEnabled": {
            "type": "boolean"
          },
          "isMachineRemembered": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "UpdateDashboardFilterRequest": {
        "type": "object",
        "properties": {
          "payload": {}
        },
        "additionalProperties": false
      },
      "UpdateDashboardLayoutRequest": {
        "type": "object",
        "properties": {
          "widgets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DashboardLayoutWidgetItemRequest"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateDashboardWidgetRequest": {
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 0,
            "type": "string",
            "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
          },
          "configuration": {}
        },
        "additionalProperties": false
      },
      "UpdateEnrolledPeopleRequest": {
        "type": "object",
        "properties": {
          "enrolledPeople": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UpdateEnrolledPersonRequest"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateEnrolledPersonRequest": {
        "type": "object",
        "properties": {
          "firstName": {
            "type": "string",
            "nullable": true
          },
          "lastName": {
            "type": "string",
            "nullable": true
          },
          "customField1": {
            "type": "string",
            "nullable": true
          },
          "customField2": {
            "type": "string",
            "nullable": true
          },
          "customField3": {
            "type": "string",
            "nullable": true
          },
          "birthYear": {
            "type": "integer",
            "format": "int32"
          },
          "status": {
            "$ref": "#/components/schemas/PersonStatus"
          },
          "relatedFaces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EnrolledFaceDto"
            },
            "nullable": true
          },
          "groups": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PersonGroupDto"
            },
            "nullable": true
          },
          "roles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RoleDto"
            },
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "UpdateEnrolledVehicleRequest": {
        "required": [
          "licensePlate"
        ],
        "type": "object",
        "properties": {
          "licensePlate": {
            "type": "string",
            "nullable": true
          },
          "plateType": {
            "type": "string",
            "nullable": true
          },
          "category": {
            "type": "string",
            "nullable": true
          },
          "make": {
            "type": "string",
            "nullable": true
          },
          "model": {
            "type": "string",
            "nullable": true
          },
          "color": {
            "type": "string",
            "nullable": true
          },
          "newPlateCode": {
            "type": "string",
            "nullable": true
          },
          "diplomaticCode": {
            "type": "string",
            "nullable": true
          },
          "minorColor": {
            "type": "string",
            "nullable": true
          },
          "code": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "vinNumber": {
            "type": "string",
            "nullable": true
          },
          "yearOfManufacture": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "wanted": {
            "type": "boolean",
            "nullable": true
          },
          "stolen": {
            "type": "boolean",
            "nullable": true
          },
          "referenceNumber": {
            "type": "string",
            "nullable": true
          },
          "nationalNumber": {
            "type": "string",
            "nullable": true
          },
          "department": {
            "type": "string",
            "nullable": true
          },
          "customField1": {
            "type": "string",
            "nullable": true
          },
          "customField2": {
            "type": "string",
            "nullable": true
          },
          "customField3": {
            "type": "string",
            "nullable": true
          },
          "vehicleImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "UpdateGroupRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "alertOnCapture": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "UpdateLicenseRequest": {
        "type": "object",
        "properties": {
          "license": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateLiveFeedFolderRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "description": {
            "maxLength": 500,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "parentFolderId": {
            "type": "string",
            "format": "uuid",
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "UpdateLiveFeedViewRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "description": {
            "maxLength": 500,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "gridRows": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "gridColumns": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "UpdateMediaSourceLinkRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "isActive": {
            "type": "boolean"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateSavedQueryRequest": {
        "required": [
          "filterPayload",
          "moduleType",
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "description": {
            "maxLength": 500,
            "minLength": 0,
            "type": "string",
            "nullable": true
          },
          "isShared": {
            "type": "boolean"
          },
          "moduleType": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "filterPayload": {}
        },
        "additionalProperties": false
      },
      "UpdateScheduleRequest": {
        "required": [
          "id"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "moduleType": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "isEnabled": {
            "type": "boolean",
            "nullable": true
          },
          "startTime": {
            "type": "string",
            "format": "time",
            "nullable": true
          },
          "endTime": {
            "type": "string",
            "format": "time",
            "nullable": true
          },
          "monday": {
            "type": "boolean",
            "nullable": true
          },
          "tuesday": {
            "type": "boolean",
            "nullable": true
          },
          "wednesday": {
            "type": "boolean",
            "nullable": true
          },
          "thursday": {
            "type": "boolean",
            "nullable": true
          },
          "friday": {
            "type": "boolean",
            "nullable": true
          },
          "saturday": {
            "type": "boolean",
            "nullable": true
          },
          "sunday": {
            "type": "boolean",
            "nullable": true
          },
          "timeZoneId": {
            "maxLength": 100,
            "minLength": 0,
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateServerRequest": {
        "type": "object",
        "properties": {
          "serverName": {
            "type": "string",
            "nullable": true
          },
          "serverUuid": {
            "type": "string",
            "nullable": true
          },
          "serverIP": {
            "type": "string",
            "nullable": true
          },
          "serverPort": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "serverSecurePort": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "dbConnectionString": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UpdateUserRequest": {
        "required": [
          "id"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "email": {
            "type": "string",
            "format": "email",
            "nullable": true
          },
          "userName": {
            "maxLength": 100,
            "minLength": 2,
            "type": "string",
            "nullable": true
          },
          "phoneNumber": {
            "type": "string",
            "format": "tel",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "roleId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "UpdateWatchListRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "isActive": {
            "type": "boolean"
          },
          "triggerAllOutputs": {
            "type": "boolean"
          },
          "watchListGroupId": {
            "type": "string",
            "format": "uuid"
          },
          "module": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "personTriggerMode": {
            "$ref": "#/components/schemas/WatchListTriggerMode"
          },
          "vehicleTriggerMode": {
            "$ref": "#/components/schemas/WatchListTriggerMode"
          },
          "containerTriggerMode": {
            "$ref": "#/components/schemas/WatchListTriggerMode"
          },
          "vehicleMatchOperator": {
            "$ref": "#/components/schemas/Operators"
          },
          "vehicleSubjects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListVehicleSubjectDto"
            },
            "nullable": true
          },
          "zoneName": {
            "type": "string",
            "nullable": true
          },
          "vehicleMatchingAttributes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VehicleMatchingAttribute"
            },
            "nullable": true
          },
          "andOrVehicle": {
            "$ref": "#/components/schemas/Operators"
          },
          "enrolledVehicles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListEnrolledVehicleDto"
            },
            "nullable": true
          },
          "personIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "andOrContainer": {
            "$ref": "#/components/schemas/Operators"
          },
          "containerCodes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "UpdateWatchlistGroupRequest": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string"
          },
          "isActive": {
            "type": "boolean"
          },
          "triggerAllOutputs": {
            "type": "boolean"
          },
          "triggerType": {
            "$ref": "#/components/schemas/WatchListGroupTriggerType"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "UserDto": {
        "required": [
          "email",
          "userName"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "userName": {
            "type": "string",
            "nullable": true
          },
          "email": {
            "type": "string",
            "nullable": true
          },
          "phoneNumber": {
            "type": "string",
            "nullable": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time"
          },
          "lastLoginAt": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "role": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VFRRelatedImagesDto": {
        "type": "object",
        "properties": {
          "fullFrameRelatedImages": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "byte"
            },
            "nullable": true
          },
          "enrolledFaceImages": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "byte"
            },
            "nullable": true
          },
          "fullFrameImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          },
          "faceImage": {
            "type": "string",
            "format": "byte",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ValidationError": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string",
            "nullable": true
          },
          "error": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VehicleInfoDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceId": {
            "type": "string",
            "format": "uuid"
          },
          "mediaSourceName": {
            "type": "string",
            "nullable": true
          },
          "zoneName": {
            "type": "string",
            "nullable": true
          },
          "recognized": {
            "type": "boolean"
          },
          "licensePlate": {
            "$ref": "#/components/schemas/LicensePlateDto"
          },
          "modelMakeRecognition": {
            "$ref": "#/components/schemas/ModelMakeRecognitionDto"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time"
          },
          "triggerType": {
            "$ref": "#/components/schemas/SearchResultTriggerType"
          },
          "hasFaceVehicleDetection": {
            "type": "boolean"
          },
          "watchListIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VehicleInfoFilterRequest": {
        "required": [
          "count",
          "page"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "page": {
            "maximum": 10000000,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "count": {
            "maximum": 2147483647,
            "minimum": 1,
            "type": "integer",
            "format": "int32"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "plateFilter": {
            "$ref": "#/components/schemas/PlateSearchFilter"
          },
          "zoneNameFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "plateColorFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "countryFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "stateFilter": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "makeFilter": {
            "$ref": "#/components/schemas/MultiDetailedMinMaxFilter"
          },
          "modelFilter": {
            "$ref": "#/components/schemas/MultiDetailedMinMaxFilter"
          },
          "categoryFilter": {
            "$ref": "#/components/schemas/MultiDetailedMinMaxFilter"
          },
          "colorFilter": {
            "$ref": "#/components/schemas/MultiDetailedMinMaxFilter"
          },
          "triggered": {
            "type": "boolean",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VehicleMatchingAttribute": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7
        ],
        "type": "integer",
        "format": "int32"
      },
      "VehicleRecordMethod": {
        "enum": [
          1,
          2,
          3,
          4
        ],
        "type": "integer",
        "format": "int32"
      },
      "VersionInfo": {
        "type": "object",
        "properties": {
          "version": {
            "type": "string",
            "nullable": true
          },
          "buildNumber": {
            "type": "string",
            "nullable": true
          },
          "fullVersion": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VfrWidgetDataFiltersRequest": {
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "to": {
            "type": "string",
            "format": "date-time",
            "nullable": true
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          },
          "minAge": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "maxAge": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "genders": {
            "type": "array",
            "items": {
              "type": "integer",
              "format": "int32"
            },
            "nullable": true
          },
          "recognized": {
            "type": "boolean",
            "nullable": true
          },
          "aggregation": {
            "$ref": "#/components/schemas/BucketGranularity"
          },
          "roleIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "groupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "watchlistIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "zoneIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "VfrWidgetResponseCategory": {
        "enum": [
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "format": "int32"
      },
      "VmsOutputDto": {
        "type": "object",
        "properties": {
          "outputId": {
            "type": "string",
            "nullable": true
          },
          "outputName": {
            "type": "string",
            "nullable": true
          },
          "hardwareId": {
            "type": "string",
            "nullable": true
          },
          "hardwareName": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WatchListDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "isDefault": {
            "type": "boolean"
          },
          "triggerAllOutputs": {
            "type": "boolean"
          },
          "isDeleted": {
            "type": "boolean"
          },
          "watchListGroupId": {
            "type": "string",
            "format": "uuid"
          },
          "outputIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "vehicleSubjects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListVehicleSubjectDto"
            },
            "nullable": true
          },
          "zoneName": {
            "type": "string",
            "nullable": true
          },
          "vehicleMatchingAttributes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VehicleMatchingAttribute"
            },
            "nullable": true
          },
          "module": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "personTriggerMode": {
            "$ref": "#/components/schemas/WatchListTriggerMode"
          },
          "vehicleTriggerMode": {
            "$ref": "#/components/schemas/WatchListTriggerMode"
          },
          "containerTriggerMode": {
            "$ref": "#/components/schemas/WatchListTriggerMode"
          },
          "vehicleMatchOperator": {
            "$ref": "#/components/schemas/Operators"
          },
          "andOrVehicle": {
            "$ref": "#/components/schemas/Operators"
          },
          "enrolledVehicles": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListEnrolledVehicleDto"
            },
            "nullable": true
          },
          "personIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "andOrContainer": {
            "$ref": "#/components/schemas/Operators"
          },
          "containerCodes": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "nullable": true
          },
          "watchListGroup": {
            "$ref": "#/components/schemas/WatchListGroupDto"
          }
        },
        "additionalProperties": false
      },
      "WatchListEnrolledVehicleDto": {
        "type": "object",
        "properties": {
          "enrolledVehicleId": {
            "type": "string",
            "format": "uuid"
          },
          "matchingAttributes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VehicleMatchingAttribute"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WatchListGroupDto": {
        "required": [
          "name"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "maxLength": 100,
            "minLength": 1,
            "type": "string",
            "nullable": true
          },
          "isActive": {
            "type": "boolean"
          },
          "isDefault": {
            "type": "boolean"
          },
          "triggerAllOutputs": {
            "type": "boolean"
          },
          "triggerType": {
            "$ref": "#/components/schemas/WatchListGroupTriggerType"
          },
          "isDeleted": {
            "type": "boolean"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "outputIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "permissions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListGroupPermissionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WatchListGroupPermissionDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "permission": {
            "type": "integer",
            "format": "int32"
          },
          "watchListGroupId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "additionalProperties": false
      },
      "WatchListGroupPermissionRequest": {
        "type": "object",
        "properties": {
          "watchlistGroupPermissions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListGroupPermissionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WatchListGroupTriggerType": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "WatchListImportResultDto": {
        "type": "object",
        "properties": {
          "totalRows": {
            "type": "integer",
            "format": "int32"
          },
          "importedWatchLists": {
            "type": "integer",
            "format": "int32"
          },
          "createdWatchListGroups": {
            "type": "integer",
            "format": "int32"
          },
          "skippedExistingRows": {
            "type": "integer",
            "format": "int32"
          },
          "invalidRows": {
            "type": "integer",
            "format": "int32"
          },
          "importedPlates": {
            "type": "integer",
            "format": "int32"
          },
          "importedEnrolledVehicles": {
            "type": "integer",
            "format": "int32"
          },
          "rejectionReason": {
            "type": "string",
            "nullable": true
          },
          "errorsTruncated": {
            "type": "boolean"
          },
          "errors": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WatchListImportRowErrorDto"
            },
            "nullable": true,
            "readOnly": true
          }
        },
        "additionalProperties": false
      },
      "WatchListImportRowErrorDto": {
        "type": "object",
        "properties": {
          "rowNumber": {
            "type": "integer",
            "format": "int32"
          },
          "message": {
            "type": "string",
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WatchListTriggerMode": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "format": "int32"
      },
      "WatchListVehicleSubjectDto": {
        "required": [
          "plateNumber"
        ],
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "plateNumber": {
            "type": "string",
            "nullable": true
          },
          "vehicleColor": {
            "type": "string",
            "nullable": true
          },
          "vehicleMake": {
            "type": "string",
            "nullable": true
          },
          "vehicleModel": {
            "type": "string",
            "nullable": true
          },
          "vehicleCategory": {
            "type": "string",
            "nullable": true
          },
          "newPlateCode": {
            "type": "string",
            "nullable": true
          },
          "diplomaticCode": {
            "type": "string",
            "nullable": true
          },
          "minorColor": {
            "type": "string",
            "nullable": true
          },
          "code": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "vinNumber": {
            "type": "string",
            "nullable": true
          },
          "yearOfManufacture": {
            "type": "integer",
            "format": "int32",
            "nullable": true
          },
          "wanted": {
            "type": "boolean",
            "nullable": true
          },
          "stolen": {
            "type": "boolean",
            "nullable": true
          },
          "referenceNumber": {
            "type": "string",
            "nullable": true
          },
          "nationalNumber": {
            "type": "string",
            "nullable": true
          },
          "method": {
            "$ref": "#/components/schemas/VehicleRecordMethod"
          },
          "department": {
            "type": "string",
            "nullable": true
          },
          "matchingAttributes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/VehicleMatchingAttribute"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WidgetActionDto": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string",
            "nullable": true
          },
          "configurationKey": {
            "type": "string",
            "nullable": true
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "type": {
            "$ref": "#/components/schemas/WidgetActionType"
          },
          "optionsSource": {
            "$ref": "#/components/schemas/WidgetActionOptionsSource"
          },
          "displayOrder": {
            "type": "integer",
            "format": "int32"
          },
          "options": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WidgetActionOptionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WidgetActionOptionDto": {
        "type": "object",
        "properties": {
          "value": {
            "type": "string",
            "nullable": true
          },
          "label": {
            "type": "string",
            "nullable": true
          },
          "displayOrder": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "WidgetActionOptionsSource": {
        "enum": [
          1,
          2,
          3,
          4,
          5,
          6,
          7
        ],
        "type": "integer",
        "format": "int32"
      },
      "WidgetActionType": {
        "enum": [
          1,
          2,
          3,
          4,
          5
        ],
        "type": "integer",
        "format": "int32"
      },
      "WidgetCategory": {
        "enum": [
          1,
          2,
          3
        ],
        "type": "integer",
        "format": "int32"
      },
      "WidgetDefinitionDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "widgetSectionId": {
            "type": "string",
            "format": "uuid"
          },
          "key": {
            "type": "string",
            "nullable": true
          },
          "sectionKey": {
            "type": "string",
            "nullable": true
          },
          "subtitle": {
            "type": "string",
            "nullable": true
          },
          "description": {
            "type": "string",
            "nullable": true
          },
          "dashboardType": {
            "$ref": "#/components/schemas/DashboardType"
          },
          "category": {
            "$ref": "#/components/schemas/WidgetCategory"
          },
          "visualizationType": {
            "$ref": "#/components/schemas/WidgetVisualizationType"
          },
          "visualizations": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WidgetVisualizationType"
            },
            "nullable": true
          },
          "actions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WidgetActionDto"
            },
            "nullable": true
          },
          "width": {
            "type": "integer",
            "format": "int32"
          },
          "height": {
            "type": "integer",
            "format": "int32"
          },
          "minWidth": {
            "type": "integer",
            "format": "int32"
          },
          "minHeight": {
            "type": "integer",
            "format": "int32"
          },
          "maxWidth": {
            "type": "integer",
            "format": "int32"
          },
          "maxHeight": {
            "type": "integer",
            "format": "int32"
          }
        },
        "additionalProperties": false
      },
      "WidgetRowDto": {
        "type": "object",
        "properties": {
          "columns": {
            "type": "object",
            "additionalProperties": {},
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WidgetSectionDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "dashboardType": {
            "$ref": "#/components/schemas/DashboardType"
          },
          "key": {
            "type": "string",
            "nullable": true
          },
          "displayOrder": {
            "type": "integer",
            "format": "int32"
          },
          "widgets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WidgetDefinitionDto"
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "WidgetVisualizationType": {
        "enum": [
          0,
          1,
          2,
          10,
          11,
          12,
          13,
          14,
          15,
          16,
          17,
          18,
          19,
          20,
          21,
          22,
          23,
          24,
          25,
          26,
          27,
          30
        ],
        "type": "integer",
        "format": "int32"
      },
      "ZenModule": {
        "enum": [
          1,
          2,
          3,
          5,
          6,
          101,
          102,
          103,
          104,
          105,
          106,
          107,
          108,
          109,
          110,
          111,
          201,
          202,
          203,
          204,
          301,
          302,
          303,
          304,
          -1
        ],
        "type": "integer",
        "format": "int32"
      },
      "ZoneDirection": {
        "enum": [
          0,
          1,
          2,
          3
        ],
        "type": "integer",
        "format": "int32"
      },
      "ZoneDto": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "nullable": true
          },
          "zoneMode": {
            "enum": [
              0,
              1
            ],
            "type": "integer",
            "format": "int32"
          },
          "cmPerPixelRatio": {
            "type": "number",
            "format": "double"
          },
          "anchors": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "ratioX": {
                  "type": "number",
                  "format": "double"
                },
                "ratioY": {
                  "type": "number",
                  "format": "double"
                }
              },
              "additionalProperties": false
            },
            "nullable": true
          }
        },
        "additionalProperties": false
      },
      "ZoneFetchRequest": {
        "type": "object",
        "properties": {
          "module": {
            "$ref": "#/components/schemas/ZenModule"
          },
          "mediaSourceIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "mediaSourceGroupIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "nullable": true
          },
          "allMediaSources": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      },
      "ZoneMode": {
        "enum": [
          0,
          1
        ],
        "type": "integer",
        "format": "int32"
      },
      "ErrorResponse": {
        "type": "object",
        "properties": {
          "data": {
            "type": "string",
            "nullable": true,
            "description": "Always null on an error response."
          },
          "message": {
            "type": "string",
            "description": "Human-readable error text. For handled exceptions this is the exception's own Message. See the note on status 500."
          },
          "resultCode": {
            "type": "integer",
            "format": "int32",
            "description": "Intended to repeat the HTTP status code, but NOT reliable - verified against a live instance on 2026-07-27. Error responses usually do set it correctly; successful ones almost always return 0, and at least one error (GET /api/data/colors/available) returns HTTP 400 with resultCode 0. Branch on the HTTP status line, never on this field."
          }
        },
        "required": [
          "data",
          "message",
          "resultCode"
        ],
        "description": "Standard error envelope returned by ExceptionHandlerMiddleware."
      }
    },
    "securitySchemes": {
      "Bearer": {
        "type": "http",
        "description": "Zen Management Bearer Authorization with Access Token",
        "scheme": "Bearer"
      }
    }
  },
  "security": [
    {
      "Bearer": []
    }
  ],
  "x-tagGroups": [
    {
      "name": "Authentication",
      "tags": [
        "Authentication",
        "User",
        "IdentityRole",
        "Role",
        "Group"
      ]
    },
    {
      "name": "Media Sources",
      "tags": [
        "MediaSource",
        "MediaSourceRegistry",
        "MediaSourceProvider",
        "Schedule",
        "CameraProvisioning"
      ]
    },
    {
      "name": "Dashboards",
      "tags": [
        "Dashboard",
        "DashboardFilter",
        "AnprDashboard",
        "CountingDashboard",
        "FlowDashboard",
        "IncidentDashboard",
        "VfrDashboard"
      ]
    },
    {
      "name": "Detections",
      "tags": [
        "Lpr",
        "Accr",
        "Vfr",
        "FaceVehicle",
        "FaceRecognition",
        "ObjectClassification",
        "Color",
        "FlowEvent",
        "Occupancy"
      ]
    },
    {
      "name": "Alarms & Events",
      "tags": [
        "TriggeredAlarm",
        "TriggeredEvent"
      ]
    },
    {
      "name": "Search & Saved Queries",
      "tags": [
        "DrilldownSearch",
        "SavedQueries"
      ]
    },
    {
      "name": "Watchlists",
      "tags": [
        "Watchlist",
        "WatchlistGroup",
        "EnrolledVehicle"
      ]
    },
    {
      "name": "Flow & Live Feed",
      "tags": [
        "Flow",
        "LiveFeedView",
        "LiveFeedFolder"
      ]
    },
    {
      "name": "Export",
      "tags": [
        "Export"
      ]
    },
    {
      "name": "System & Licensing",
      "tags": [
        "System",
        "Server",
        "Module",
        "License",
        "AuditLog",
        "OutputConfiguration"
      ]
    }
  ],
  "servers": [
    {
      "url": "http://localhost:4010",
      "description": "Local Prism mock (this bundle)"
    }
  ]
}
