{
  "openapi": "3.1.0",
  "info": {
    "title": "IntuAid API",
    "version": "1.138.0",
    "description": "The IntuAid REST API lets you automate your service operations: assets and customers, service requests, service orders and reports, forms, documents and comments. Use it from your own code or from automation platforms such as n8n, Make or Zapier, and subscribe to webhooks to react to changes as they happen.\n\nEvery tenant has its own API host, `https://<tenant>.api.intuaid.com/api/`. Requests are authenticated with an API key (`X-API-Key: iak_…` or `Authorization: Bearer iak_…`) that a tenant owner creates in the IntuAid app. Requests and responses are JSON with camelCase field names.\n\n# Getting started\n\nThe IntuAid API gives your own code and automation platforms such as n8n, Make\nor Zapier the same data your team works with in the IntuAid app: assets and\ncustomers, service requests, service orders and reports, forms, documents and\ncomments. Webhooks tell you when something changes, so you do not have to poll.\n\n## Your API host\n\nEvery tenant has its own API host. Take the address you use for the IntuAid app\nand replace `app` with `api`:\n\n| | URL |\n|---|---|\n| IntuAid app | `https://acme.app.intuaid.com` |\n| API base URL | `https://acme.api.intuaid.com/api/` |\n\nAll endpoints in this reference are relative to that host, e.g.\n`GET https://acme.api.intuaid.com/api/assets/`. Use HTTPS; the API is not\navailable over plain HTTP.\n\n## Your first request\n\n1. Ask a tenant owner for an API key, or create one yourself if you are an\n   owner (see *Authentication & API keys* below).\n2. List the first five assets:\n\n```bash\ncurl \"https://acme.api.intuaid.com/api/assets/?limit=5\" \\\n  -H \"X-API-Key: iak_your_key\"\n```\n\n```json\n{\n  \"count\": 42,\n  \"next\": \"https://acme.api.intuaid.com/api/assets/?limit=5&offset=5\",\n  \"previous\": null,\n  \"results\": [\n    {\n      \"id\": \"6f1c2a3e-1d2b-4c5d-8e9f-0a1b2c3d4e5f\",\n      \"name\": \"Heat pump HP-12\",\n      \"serialNumber\": \"HP12-000731\",\n      \"type\": { \"id\": \"b3f0c1d2-…\", \"name\": \"Heat pump\", \"…\": \"…\" },\n      \"parent\": null,\n      \"createdAt\": \"2026-03-02T08:14:11.214000Z\",\n      \"…\": \"…\"\n    }\n  ]\n}\n```\n\n3. Create a service request for an installed asset (needs a key with full\n   access):\n\n```bash\ncurl -X POST \"https://acme.api.intuaid.com/api/service-requests/\" \\\n  -H \"X-API-Key: iak_your_key\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n        \"customerAsset\": \"1e2d3c4b-5a69-4788-9a0b-c1d2e3f4a5b6\",\n        \"description\": \"Unit shows error E42 after restart\",\n        \"severity\": \"HIGH\"\n      }'\n```\n\n## Conventions\n\n- **JSON with camelCase.** Request and response bodies are JSON\n  (`Content-Type: application/json`) with camelCase field names\n  (`serialNumber`, `createdAt`). Query parameters keep their snake_case names\n  as listed in the reference (`?created_after=2026-01-01&asset_type=…`).\n- **Ids are UUIDs.** In request bodies, related objects are referenced by\n  their id (`\"customerAsset\": \"1e2d3c4b-…\"`); responses often embed them.\n- **Timestamps** are ISO 8601 in UTC (`2026-10-30T09:15:02.481000Z`); dates are\n  `YYYY-MM-DD`.\n- **Trailing slashes.** Every path ends with `/`, e.g. `/api/assets/`, not\n  `/api/assets`.\n- **Features of your plan.** Some areas, such as customers, service requests\n  and service orders, need the matching feature of your IntuAid plan. Without\n  it the endpoints answer `403`.\n- **Your key acts as its owner.** The API returns and changes exactly what the\n  user who created the key may see and do in the app.\n\n## Automation platforms\n\n- **n8n:** use the *HTTP Request* node with *Header Auth* (name `X-API-Key`,\n  value your key). To react to events, start a workflow with a *Webhook* node\n  and register its production URL as a webhook endpoint.\n- **Make:** use the *HTTP – Make a request* module and add the `X-API-Key`\n  header. The *Webhooks – Custom webhook* module receives events.\n- **Zapier:** use *Webhooks by Zapier* – *Custom Request* with the `X-API-Key`\n  header, and *Catch Raw Hook* as a trigger for events.\n\nYou can also download this reference as an OpenAPI document (the download\nbutton at the top) and import it into tools that understand OpenAPI, such as\nPostman or code generators.\n\n# Authentication & API keys\n\nEvery request carries an API key. Keys start with `iak_` and belong to one\ntenant: a key of `acme` only works on `https://acme.api.intuaid.com`.\n\n## Create a key\n\nOnly **tenant owners** can create API keys.\n\n1. Sign in to the IntuAid app and open your profile (user menu → *Edit\n   profile*).\n2. Open the **API Keys** tab and click **Create API Key**.\n3. Enter a name that tells you later where the key is used (e.g. \"n8n\n   production\"), pick the permission and, optionally, an expiration date.\n4. Copy the key from the dialog. **It is shown only once**; IntuAid stores only\n   a hash of it. If you lose it, create a new key.\n\n| Permission | Allows |\n|---|---|\n| **Read Only** | `GET` requests only. Any other method answers `403`. |\n| **Full Access** | Every method: create, update and delete. |\n\nKeys expire after **90 days** unless you pick another expiration date when you\ncreate them. An expired key is rejected; create a new one and replace it in\nyour integration before the old one runs out.\n\nThe key acts with the permissions of the owner who created it. The API key list\nshows when each key was last used.\n\n## Send the key\n\nUse either header; both carry the same key:\n\n```http\nX-API-Key: iak_your_key\n```\n\n```http\nAuthorization: Bearer iak_your_key\n```\n\n```bash\ncurl \"https://acme.api.intuaid.com/api/service-orders/\" \\\n  -H \"Authorization: Bearer iak_your_key\"\n```\n\nOnly the endpoints in this reference accept API keys. Other endpoints of the\nIntuAid app answer `403` with `API key access is not enabled for this endpoint.`\n\n## Revoke a key\n\nDelete the key in the **API Keys** tab of your profile. It stops working\nimmediately. Revoke a key at once if it may have leaked, and never put keys in\nclient-side code, public repositories or URLs.\n\n## Failed authentication\n\nA missing, unknown, revoked or expired key, or a key of another tenant, is\nanswered with `403 Forbidden`:\n\n```json\n{ \"detail\": \"Invalid API key or key has expired.\" }\n```\n\nEvery request made with an API key is recorded in the tenant's audit log.\n\n# Errors\n\nThe API uses HTTP status codes; the body is JSON.\n\n| Status | Meaning |\n|---|---|\n| `200 OK`, `201 Created` | Success; the body is the object. |\n| `202 Accepted` | The work was queued (e.g. text extraction); poll the object for the result. |\n| `204 No Content` | Success without a body (e.g. after a delete). |\n| `400 Bad Request` | Invalid body or parameter. |\n| `403 Forbidden` | Missing, invalid or expired API key; read-only key on a write; missing permission; or the feature is not part of your plan. |\n| `404 Not Found` | No such object, or it is not visible to the key's user. |\n| `405 Method Not Allowed` | The endpoint does not support this method. |\n| `409 Conflict` | The object's state does not allow the action (e.g. a diagnosis is already running). |\n| `429 Too Many Requests` | Rate limit or the tenant's monthly AI budget exceeded. |\n| `5xx` | An error on our side. Retry later with backoff. |\n\nMost errors carry a `detail` message:\n\n```json\n{ \"detail\": \"You do not have permission to perform this action.\" }\n```\n\nValidation errors (`400`) map each invalid field to its messages; errors that\nconcern no single field are listed under `nonFieldErrors`:\n\n```json\n{\n  \"severity\": [\"\\\"URGENT\\\" is not a valid choice.\"],\n  \"customerAsset\": [\"This field is required.\"]\n}\n```\n\nA few actions answer with an `error` message instead of `detail`, e.g.\n`{\"error\": \"service_partner_ids is required\"}`. Treat both keys as\nhuman-readable text: show or log them, but do not branch on their wording,\nwhich may change. Branch on the status code.\n\n## Retrying\n\n- Retry `429` after the number of seconds in the `Retry-After` header.\n- Retry `5xx` and network errors with exponential backoff (e.g. 1 s, 2 s, 4 s,\n  … up to a minute).\n- Do not retry `400`, `403`, `404` and `409` unchanged; fix the request first.\n- `POST` requests are not idempotent: if a create timed out, check whether the\n  object exists before you send it again.\n\n# Pagination & filtering\n\nLarge lists such as assets, customers, installed assets, service orders and\nemployees are paginated with `limit` and `offset`:\n\n| Parameter | Default | Maximum |\n|---|---|---|\n| `limit` | 25 | 100 |\n| `offset` | 0 | |\n\n```bash\ncurl \"https://acme.api.intuaid.com/api/assets/?limit=100&offset=200\" \\\n  -H \"X-API-Key: iak_your_key\"\n```\n\nA page looks like this:\n\n```json\n{\n  \"count\": 1234,\n  \"next\": \"https://acme.api.intuaid.com/api/assets/?limit=100&offset=300\",\n  \"previous\": \"https://acme.api.intuaid.com/api/assets/?limit=100&offset=100\",\n  \"results\": [ … ]\n}\n```\n\nTo read everything, follow `next` until it is `null`. `count` is the total\nnumber of matching objects.\n\nLists without `limit`/`offset` in the reference return a plain JSON array with\nall objects (e.g. service requests, asset types). The response schema of each\noperation shows which form it uses.\n\n## Filtering, search and sorting\n\nList endpoints document their filters as query parameters, e.g.\n\n```text\nGET /api/service-orders/?technician=<uuid>&is_completed=false&scheduled_after=2026-11-01T00:00:00Z\nGET /api/assets/?search=HP12&ordering=-created_at\n```\n\n- `search` matches the text fields named in the operation's description (e.g.\n  name and serial number of an asset).\n- `ordering` sorts by a field; prefix it with `-` for descending order.\n- Filters combine with AND.\n\nTo sync changes into another system, combine webhooks (for changes as they\nhappen) with a periodic full read (to catch anything you missed).\n\n# Rate limits\n\nRequests with an API key are limited to **60 requests per minute** per client\nIP address. A request over the limit is answered with `429 Too Many Requests`\nand a `Retry-After` header with the seconds to wait:\n\n```http\nHTTP/1.1 429 Too Many Requests\nRetry-After: 17\n\n{ \"detail\": \"Request was throttled. Expected available in 17 seconds.\" }\n```\n\nSome operations have their own, lower limits, e.g. attaching an employee's CV\ndocument (10 per hour). AI features (diagnosis, ingest into the AI knowledge\nbase) also count against your tenant's monthly AI budget; when it is used up\nthey answer `429` with an `error` and a `detail` message until the next month.\n\nTips:\n\n- Use `limit=100` for bulk reads instead of many small pages.\n- React to webhooks instead of polling for changes.\n- Spread scheduled jobs over time instead of starting them all at the full\n  hour.\n- Honour `Retry-After` and back off; do not retry immediately in a loop.\n\n# Versioning & compatibility\n\nThe API has no version number in its URLs. We extend it continuously and keep\nit backwards compatible.\n\n**Additive changes happen without notice.** Build your integration so that\nthese do not break it:\n\n- new endpoints and new optional query parameters,\n- new fields in responses and new optional fields in requests,\n- new values of existing enums (e.g. a new status) and new error messages,\n- new webhook event types and new fields in webhook payloads,\n- a different order of fields in JSON objects.\n\nIn practice: ignore fields you do not know, handle unknown enum values\ngracefully, and subscribe webhook endpoints only to the event types you\nhandle.\n\n**Breaking changes are announced in advance**, so you have time to adapt your\nintegration. Breaking changes are, for example, removing or renaming an\nendpoint or a field, changing a field's type, making an optional field\nrequired, or changing the meaning of a value.\n\nOnly the endpoints, fields and events in this reference are part of the API.\nOther endpoints of the IntuAid app may change at any time, even if they happen\nto work with an API key.\n\n# Webhooks\n\nWebhooks push events to your server when something changes in IntuAid, e.g.\nwhen a service request is created or a service order is completed. Your\nendpoint receives a small JSON payload and fetches the full object via the API\nif it needs more.\n\nThe payload of every event type is documented under **Webhooks** at the end of\nthis reference.\n\n## Register an endpoint\n\nTenant owners manage endpoints in the IntuAid app under **Settings →\nWebhooks**, or via the API with a full-access key (`POST\n/api/webhooks/endpoints/`, see the *Webhooks* section of this reference).\n\n- Pick the event types the endpoint receives (`GET /api/webhooks/event-types/`\n  lists them).\n- The URL must use **HTTPS** and resolve to a **public** address; private and\n  local addresses are rejected.\n- A tenant can have up to **10 endpoints**.\n- The **signing secret** (`whsec_…`) is shown once, when you create the\n  endpoint. Store it like a password.\n- **Send test event** (`POST /api/webhooks/endpoints/{id}/test/`) sends a\n  `webhook.ping` event to check your setup.\n\n## Event types\n\n| Event type | When |\n|---|---|\n| `form_response.submitted` | A form was submitted completely. |\n| `service_request.created` | A service request was created. |\n| `service_request.status_changed` | A service request changed its status. |\n| `service_request.closed` | A service request was closed. |\n| `service_order.created` | A service order was created. |\n| `service_order.assigned` | A service order was assigned to another technician. |\n| `service_order.completed` | A service order was completed. |\n| `service_report.generated` | The report document of a service order was generated. |\n| `asset.created`, `asset.updated`, `asset.deleted` | An asset was created, changed or deleted. |\n| `customer.created`, `customer.updated`, `customer.deleted` | A customer was created, changed or deleted. |\n| `document.processed` | A document was processed successfully. |\n| `document.failed` | Processing a document failed. |\n| `webhook.ping` | Test event, only sent on request. |\n\n## The request\n\nIntuAid sends a `POST` with a JSON body, following the\n[Standard Webhooks](https://www.standardwebhooks.com/) specification:\n\n```http\nPOST /intuaid-webhook HTTP/1.1\nContent-Type: application/json\nwebhook-id: 0b6f5b8e-3f0a-4c55-9d8e-7f0c2b1e4a11\nwebhook-timestamp: 1793351702\nwebhook-signature: v1,K5oZfzN95Z9UVu1EsfQmfVNQhnkZ2pj9o9NDN/H/pI4=\n\n{\n  \"id\": \"0b6f5b8e-3f0a-4c55-9d8e-7f0c2b1e4a11\",\n  \"type\": \"service_request.status_changed\",\n  \"timestamp\": \"2026-10-30T09:15:02.481Z\",\n  \"data\": {\n    \"object\": \"service_request\",\n    \"id\": \"5d2c7a40-8f1e-4b7a-a0c3-2e9b6d4f1c88\",\n    \"status\": \"IN_PROGRESS\",\n    \"previousStatus\": \"OPEN\"\n  }\n}\n```\n\n| Header | Content |\n|---|---|\n| `webhook-id` | The event id (same as `id` in the body). It stays the same across retries: use it to ignore duplicates. |\n| `webhook-timestamp` | Unix time (seconds) when the request was signed. |\n| `webhook-signature` | `v1,<signature>`; during a secret rotation several signatures, separated by spaces. |\n\nPayloads are **thin**: `data` holds the kind of object (`object`), its `id` and\na few fields such as a status, but no personal data. Fetch the object via the\nAPI, e.g. `GET /api/service-requests/{id}/`. Field names are camelCase.\n\n## Verify the signature\n\nAlways verify the signature before you trust a payload, and reject requests\nwhose `webhook-timestamp` is more than **5 minutes** old (replay protection).\nVerify against the **raw request body**, exactly as received: parsing and\nre-serializing the JSON changes the bytes and breaks the signature.\n\nThe easiest way is the official Standard Webhooks library for your language.\n\n**Python** (`pip install standardwebhooks`):\n\n```python\nfrom standardwebhooks.webhooks import Webhook, WebhookVerificationError\n\nwebhook = Webhook(\"whsec_your_secret\")\n\n\ndef handle(raw_body: bytes, headers: dict[str, str]) -> None:\n    try:\n        event = webhook.verify(raw_body, headers)  # checks the 5-minute window too\n    except WebhookVerificationError:\n        raise PermissionError(\"invalid webhook signature\")\n    process(event)\n```\n\n**Node.js** (`npm install standardwebhooks`), e.g. with Express:\n\n```js\nimport express from \"express\";\nimport { Webhook } from \"standardwebhooks\";\n\nconst webhook = new Webhook(\"whsec_your_secret\");\nconst app = express();\n\napp.post(\"/intuaid-webhook\", express.raw({ type: \"application/json\" }), (req, res) => {\n  let event;\n  try {\n    event = webhook.verify(req.body, req.headers);\n  } catch {\n    return res.sendStatus(400);\n  }\n  res.sendStatus(204);\n  queueForProcessing(event);\n});\n```\n\n**Without a library**: the signature is a base64-encoded HMAC-SHA256 of\n`{webhook-id}.{webhook-timestamp}.{raw body}`. The key is the part of the\nsecret after `whsec_`, base64-decoded.\n\n```python\nimport base64\nimport hashlib\nimport hmac\nimport time\n\n\ndef verify(secret: str, headers: dict[str, str], raw_body: bytes) -> None:\n    webhook_id = headers[\"webhook-id\"]\n    timestamp = headers[\"webhook-timestamp\"]\n    if abs(time.time() - int(timestamp)) > 5 * 60:\n        raise PermissionError(\"timestamp outside the tolerance\")\n\n    key = base64.b64decode(secret.removeprefix(\"whsec_\"))\n    signed = f\"{webhook_id}.{timestamp}.\".encode() + raw_body\n    expected = base64.b64encode(hmac.new(key, signed, hashlib.sha256).digest()).decode()\n\n    for signature in headers[\"webhook-signature\"].split(\" \"):\n        version, _, value = signature.partition(\",\")\n        if version == \"v1\" and hmac.compare_digest(value, expected):\n            return\n    raise PermissionError(\"invalid signature\")\n```\n\n## Respond quickly\n\nAnswer with any **2xx** status within **10 seconds**. Do the actual work\nafterwards (queue it): anything else counts as a failure, including timeouts,\n`3xx` redirects (they are not followed) and `4xx`/`5xx` responses.\n\n## Retries\n\nA failed delivery is retried with increasing delays: after **5 seconds, 5\nminutes, 30 minutes, 2 hours, 5 hours, 10 hours and 10 hours** (8 attempts in\ntotal, about 28 hours).\n\n- Deliveries can arrive **more than once** (e.g. when your 2xx got lost) and\n  **in any order**. Deduplicate by `webhook-id`, and use the `timestamp` of the\n  payload or the current object from the API instead of relying on the order.\n- If deliveries to an endpoint keep failing for **5 days**, the endpoint is\n  **disabled automatically** and the tenant owners get an e-mail. Fix the\n  receiver, then enable the endpoint again in **Settings → Webhooks** (or\n  `PATCH /api/webhooks/endpoints/{id}/` with `{\"isActive\": true}`).\n- Every attempt is listed in the **delivery log** (Settings → Webhooks, or `GET\n  /api/webhooks/deliveries/`) with status code and response. You can redeliver\n  an event manually (`POST /api/webhooks/deliveries/{id}/redeliver/`).\n\n## Rotate the secret\n\nRotate the signing secret in the settings or with `POST\n/api/webhooks/endpoints/{id}/rotate-secret/`. The response contains the new\nsecret. For **24 hours** the old secret stays valid: each request is signed\nwith both secrets (two signatures in `webhook-signature`), so you can update\nyour receiver without missing events. The libraries above accept a request if\nany of the signatures matches.\n\n## Checklist\n\n- HTTPS endpoint with a publicly trusted certificate.\n- Signature verified on the raw body; timestamps older than 5 minutes rejected.\n- 2xx within 10 seconds; work queued.\n- Duplicates dropped by `webhook-id`; order not assumed.\n- Full object fetched via the API when you need more than the payload.",
    "contact": {
      "name": "IntuAid Support",
      "email": "servus@intuaid.com"
    }
  },
  "paths": {
    "/api/asset-types/": {
      "get": {
        "operationId": "assetTypesList",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "List asset types",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AssetType"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "assetTypesCreate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Create an asset type",
        "tags": [
          "Asset types"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetType"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/asset-types/{id}/": {
      "get": {
        "operationId": "assetTypesRetrieve",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Retrieve an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetType"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "assetTypesUpdate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Replace an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetType"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "assetTypesPartialUpdate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Update an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAssetTypeRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAssetTypeRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAssetTypeRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetType"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "assetTypesDestroy",
        "description": "Also deletes the assets of this type.",
        "summary": "Delete an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/asset-types/{id}/children/": {
      "post": {
        "operationId": "assetTypesChildrenCreate",
        "description": "Allows assets of the child type to be built into this type.",
        "summary": "Add a child type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeRelationRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeRelationRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeRelationRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetTypeHierarchy"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/asset-types/{id}/children/{childId}/": {
      "delete": {
        "operationId": "assetTypesChildrenDestroy",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Remove a child type",
        "parameters": [
          {
            "in": "path",
            "name": "childId",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "description": "Assets still use this relation."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/asset-types/{id}/documents/": {
      "get": {
        "operationId": "assetTypesDocumentsList",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "List documents of an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Document"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/asset-types/{id}/duplicate/": {
      "post": {
        "operationId": "assetTypesDuplicateCreate",
        "description": "1:1 copy of the asset type; its names get a translated \"(Duplicate)\" suffix.",
        "summary": "Duplicate an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetType"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/asset-types/{id}/form-templates/": {
      "get": {
        "operationId": "assetTypesFormTemplatesList",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "List form templates of an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AssetTypeFormTemplate"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "assetTypesFormTemplatesCreate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Link form templates to an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Asset types"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeFormTemplateIdsRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeFormTemplateIdsRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetTypeFormTemplateIdsRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AssetTypeFormTemplate"
                  }
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "assetTypesFormTemplatesBulkDestroy",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Unlink form templates from an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/asset-types/{id}/form-templates/{formTemplateId}/": {
      "delete": {
        "operationId": "assetTypesFormTemplatesDestroy",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Unlink a form template from an asset type",
        "parameters": [
          {
            "in": "path",
            "name": "formTemplateId",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/asset-types/{id}/hierarchy/": {
      "get": {
        "operationId": "assetTypesHierarchyRetrieve",
        "description": "Ancestor (`parents`) and descendant (`children`) trees of the type: which types it can be built into and which can be built into it.",
        "summary": "Asset type hierarchy",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset type identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Asset types"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetTypeHierarchy"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/assets/": {
      "get": {
        "operationId": "assetsList",
        "description": "Assets of your tenant, sorted by name. Filter by type, customer, site or monitoring status, search by name and serial number.",
        "summary": "List assets",
        "parameters": [
          {
            "in": "query",
            "name": "asset_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "can_contain_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "created_after",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "created_before",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer_site",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "fits_into_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "monitoring_status",
            "schema": {
              "type": "string",
              "enum": [
                "green",
                "red",
                "yellow"
              ]
            },
            "description": "* `red` - red\n* `yellow` - yellow\n* `green` - green"
          },
          {
            "in": "query",
            "name": "name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "parent",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "serial_number",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "top_level",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedAssetList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "assetsCreate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Create an asset",
        "tags": [
          "Assets"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AssetCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssetCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetCreateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetCreate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/assets/{id}/": {
      "get": {
        "operationId": "assetsRetrieve",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Retrieve an asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Asset"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "assetsUpdate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Replace an asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Assets"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/AssetRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/AssetRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Asset"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "assetsPartialUpdate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Update an asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Assets"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAssetRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAssetRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedAssetRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Asset"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "assetsDestroy",
        "description": "Also deletes the parts built into it.",
        "summary": "Delete an asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/assets/{id}/documents/": {
      "get": {
        "operationId": "assetsDocumentsList",
        "description": "Documents of this asset, including the ones of its asset type (marked with `inheritedFrom`).",
        "summary": "List documents of an asset",
        "parameters": [
          {
            "in": "query",
            "name": "asset_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "can_contain_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "created_after",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "created_before",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer_site",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "fits_into_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "monitoring_status",
            "schema": {
              "type": "string",
              "enum": [
                "green",
                "red",
                "yellow"
              ]
            },
            "description": "* `red` - red\n* `yellow` - yellow\n* `green` - green"
          },
          {
            "in": "query",
            "name": "name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "parent",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "serial_number",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "top_level",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedDocumentList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/assets/{id}/duplicate/": {
      "post": {
        "operationId": "assetsDuplicateCreate",
        "description": "Creates a 1:1 copy; only the name gets a \"(Duplicate)\" suffix.",
        "summary": "Duplicate an asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Asset"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/assets/{id}/monitoring-intervals/{intervalId}/reset/": {
      "post": {
        "operationId": "assetsMonitoringIntervalsResetCreate",
        "description": "Marks the maintenance of a monitoring interval as done: the due date advances to the next cycle.",
        "summary": "Complete a monitoring interval",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          },
          {
            "in": "path",
            "name": "intervalId",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          }
        ],
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetMonitoringInterval"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/assets/{id}/service-partners/": {
      "get": {
        "operationId": "assetsServicePartnersList",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "List service partners of an asset",
        "parameters": [
          {
            "in": "query",
            "name": "asset_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "can_contain_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "created_after",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "created_before",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer_site",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "fits_into_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "monitoring_status",
            "schema": {
              "type": "string",
              "enum": [
                "green",
                "red",
                "yellow"
              ]
            },
            "description": "* `red` - red\n* `yellow` - yellow\n* `green` - green"
          },
          {
            "in": "query",
            "name": "name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "parent",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "serial_number",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "top_level",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedServicePartnerList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/assets/{id}/service-partners/assign/": {
      "post": {
        "operationId": "assetsServicePartnersAssignCreate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Assign service partners to an asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Assets"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerIdsRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerIdsRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerIdsRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AssetServicePartnersAssigned"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "None of the service partners exists."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/assets/{id}/service-partners/unassign/": {
      "post": {
        "operationId": "assetsServicePartnersUnassignCreate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Unassign a service partner from an asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Assets"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerIdRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerIdRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerIdRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Message"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/assets/structure/": {
      "get": {
        "operationId": "assetsStructureList",
        "description": "Slim, unpaginated asset rows whose `parent` links form the tree of assets and their built-in parts. Honours the list filters. `around` narrows the result to that asset, its parent, children and siblings; `focus` to that asset, its ancestors and everything built into it.",
        "summary": "Asset tree",
        "parameters": [
          {
            "in": "query",
            "name": "around",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "asset_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "can_contain_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "created_after",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "created_before",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer_site",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "fits_into_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "focus",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "monitoring_status",
            "schema": {
              "type": "string",
              "enum": [
                "green",
                "red",
                "yellow"
              ]
            },
            "description": "* `red` - red\n* `yellow` - yellow\n* `green` - green"
          },
          {
            "in": "query",
            "name": "name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "parent",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "serial_number",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "top_level",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "tags": [
          "Assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedAssetStructureNodeList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/comments/": {
      "get": {
        "operationId": "commentsList",
        "description": "Comments on one record: pass `content_type_label` (`service_request` or `service_order`) and `object_id`.",
        "summary": "List comments",
        "parameters": [
          {
            "in": "query",
            "name": "content_type_label",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "object_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Comments"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Comment"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "commentsCreate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Add a comment",
        "tags": [
          "Comments"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CommentRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CommentRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CommentRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Comment"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/customer-assets/": {
      "get": {
        "operationId": "customerAssetsList",
        "description": "An installed asset links an asset to a customer site and carries the QR code of its self-service page. Unassigned QR codes have no asset or site yet.",
        "summary": "List installed assets",
        "parameters": [
          {
            "in": "query",
            "name": "asset",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "site",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "site__customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "Installed assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCustomerAssetList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "customerAssetsCreate",
        "description": "Links an asset to a customer site. Without asset and site it creates an unassigned QR code; with `customer` instead of `site` the site at the customer's address is used (created if needed).",
        "summary": "Create an installed asset",
        "tags": [
          "Installed assets"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAssetCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAssetCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAssetCreateRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerAssetCreate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/customer-assets/{id}/": {
      "get": {
        "operationId": "customerAssetsRetrieve",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Retrieve an installed asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Installed assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerAsset"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "customerAssetsUpdate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Replace an installed asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Installed assets"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAssetUpdateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAssetUpdateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAssetUpdateRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerAssetUpdate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "customerAssetsPartialUpdate",
        "description": "Assign an unassigned QR code to an asset and site step by step.",
        "summary": "Update an installed asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Installed assets"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerAssetUpdateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerAssetUpdateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerAssetUpdateRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerAssetUpdate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "customerAssetsDestroy",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Delete an installed asset",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Installed assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/customer-assets/{id}/mark-printed/": {
      "post": {
        "operationId": "customerAssetsMarkPrintedCreate",
        "description": "Mark a QR code's label as printed; a second attempt returns 409.",
        "summary": "Mark a QR code label as printed",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer asset identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Installed assets"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerAsset"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "description": "The label was already printed."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/customer-assets/bulk-create/": {
      "post": {
        "operationId": "customerAssetsBulkCreateCreate",
        "description": "Creates `count` unassigned (\"white-label\") QR codes at once.",
        "summary": "Create unassigned QR codes",
        "parameters": [
          {
            "in": "query",
            "name": "asset",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "site",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "site__customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "Installed assets"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAssetBulkCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAssetBulkCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerAssetBulkCreateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCustomerAssetList"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/customer-sites/": {
      "get": {
        "operationId": "customerSitesList",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "List customer sites",
        "parameters": [
          {
            "in": "query",
            "name": "customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Only the sites of this customer."
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Customer sites"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/CustomerSite"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "customerSitesCreate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Create a customer site",
        "tags": [
          "Customer sites"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerSiteCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerSiteCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerSiteCreateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerSiteCreate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/customer-sites/{id}/": {
      "get": {
        "operationId": "customerSitesRetrieve",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Retrieve a customer site",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer site identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Customer sites"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerSite"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "customerSitesUpdate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Replace a customer site",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer site identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Customer sites"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerSiteRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerSiteRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerSiteRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerSite"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "customerSitesPartialUpdate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Update a customer site",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer site identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Customer sites"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerSiteRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerSiteRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerSiteRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CustomerSite"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "customerSitesDestroy",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Delete a customer site",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer site identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Customer sites"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/customers/": {
      "get": {
        "operationId": "customersList",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "List customers",
        "parameters": [
          {
            "in": "query",
            "name": "city",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "created_after",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "created_before",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "email",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "has_assets",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "phone",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "zip_code",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Customers"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCustomerList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "customersCreate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Create a customer",
        "tags": [
          "Customers"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Customer"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/customers/{id}/": {
      "get": {
        "operationId": "customersRetrieve",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Retrieve a customer",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Customers"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Customer"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "customersUpdate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Replace a customer",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Customers"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CustomerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CustomerRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Customer"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "customersPartialUpdate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Update a customer",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Customers"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedCustomerRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Customer"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "customersDestroy",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Delete a customer",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Customers"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/customers/{id}/assets/": {
      "get": {
        "operationId": "customersAssetsList",
        "description": "The installed assets at all sites of this customer.",
        "summary": "List installed assets of a customer",
        "parameters": [
          {
            "in": "query",
            "name": "city",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "created_after",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "created_before",
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "in": "query",
            "name": "email",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "has_assets",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der customer identifiziert.",
            "required": true
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "name",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "phone",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "zip_code",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Customers"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedCustomerAssetList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/documents/": {
      "get": {
        "operationId": "documentsList",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "List documents",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Documents"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Document"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "documentsCreate",
        "description": "Upload the file first (`POST /api/presigned-urls/`) and pass its `id` as `fileId`. `type` names the document type; `assetTypes` and `assets` (lists of ids) link the document.",
        "summary": "Create a document",
        "tags": [
          "Documents"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DocumentRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DocumentRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Document"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/documents/{id}/": {
      "get": {
        "operationId": "documentsRetrieve",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Retrieve a document",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Documents"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Document"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "documentsUpdate",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Replace a document",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Documents"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DocumentRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DocumentRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Document"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "documentsPartialUpdate",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Update a document",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Documents"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDocumentRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDocumentRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedDocumentRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Document"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "documentsDestroy",
        "description": "Moves the document to the trash (deleted for good after 30 days).",
        "summary": "Delete a document",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Documents"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/employees/": {
      "get": {
        "operationId": "employeesList",
        "description": "Members of your tenant without a service partner binding.",
        "summary": "List employees",
        "parameters": [
          {
            "in": "query",
            "name": "has_profile",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "role",
            "schema": {
              "type": "string",
              "enum": [
                "Backoffice",
                "Subunternehmer",
                "Techniker",
                "Techniker (lesend)"
              ]
            },
            "description": "* `Backoffice` - Backoffice\n* `Techniker` - Techniker\n* `Techniker (lesend)` - Techniker (lesend)\n* `Subunternehmer` - Subunternehmer"
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Employees"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedEmployeeListList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/employees/{id}/profile/": {
      "get": {
        "operationId": "employeesProfileRetrieve",
        "description": "The profile plus the options the profile form offers (`assetTypeOptions`, `skillSuggestions`, `languageCodes`).",
        "summary": "Retrieve an employee's CV",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der intuaid user identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Employees"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmployeeProfile"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "employeesProfilePartialUpdate",
        "description": "Each list in the payload replaces the stored list. Writing needs the permission to manage tenant users, unless it is your own CV.",
        "summary": "Update an employee's CV",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der intuaid user identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Employees"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedEmployeeProfileRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedEmployeeProfileRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedEmployeeProfileRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmployeeProfile"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/employees/{id}/profile/cv/": {
      "get": {
        "operationId": "employeesProfileCvRetrieve",
        "description": "The uploaded CV: file for the preview, parse status, proposal.",
        "summary": "Retrieve an employee's uploaded CV document",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der intuaid user identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Employees"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmployeeCvDocument"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "employeesProfileCvCreate",
        "description": "Attaches a file uploaded via `POST /api/presigned-urls/` (category `employee_cvs`) as the employee's CV.",
        "summary": "Attach a CV document",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der intuaid user identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Employees"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/CvUploadRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/CvUploadRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CvUploadRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EmployeeCvDocument"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "employeesProfileCvDestroy",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Remove the CV document",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der intuaid user identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Employees"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-responses/": {
      "get": {
        "operationId": "formResponsesList",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "List form responses",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "template",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Only the responses to this form template."
          }
        ],
        "tags": [
          "Form responses"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FormResponse"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "formResponsesCreate",
        "description": "Stores a filled form. A response linked to a record (`entityType`/`entityId`) may update that record, see `apply_to_entity`.",
        "summary": "Submit a form response",
        "tags": [
          "Form responses"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/FormResponseCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/FormResponseCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FormResponseCreateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormResponseCreate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-responses/{id}/": {
      "get": {
        "operationId": "formResponsesRetrieve",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Retrieve a form response",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Response identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form responses"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormResponse"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "formResponsesUpdate",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Replace a form response",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Response identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form responses"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/FormResponseRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/FormResponseRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FormResponseRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "formResponsesPartialUpdate",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Update a form response",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Response identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form responses"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedFormResponseRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedFormResponseRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedFormResponseRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormResponse"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "formResponsesDestroy",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Delete a form response",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Response identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form responses"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-responses/{id}/apply_to_entity/": {
      "post": {
        "operationId": "formResponsesApplyToEntityCreate",
        "description": "Writes the mapped answers into the linked record.",
        "summary": "Apply a form response to its record",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Response identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form responses"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormResponseApplied"
                }
              }
            },
            "description": ""
          },
          "400": {
            "description": "The response is not linked to a record."
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "The linked record was not found."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-templates/": {
      "get": {
        "operationId": "formTemplatesList",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "List form templates",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Form templates"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FormTemplate"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "formTemplatesCreate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Create a form template",
        "tags": [
          "Form templates"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/FormTemplateCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/FormTemplateCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FormTemplateCreateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormTemplateCreate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-templates/{id}/": {
      "get": {
        "operationId": "formTemplatesRetrieve",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Retrieve a form template",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form templates"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormTemplate"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "formTemplatesUpdate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Replace a form template",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form templates"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/FormTemplateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/FormTemplateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FormTemplateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormTemplate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "formTemplatesPartialUpdate",
        "description": "Every change stores a new version of the form.",
        "summary": "Update a form template",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form templates"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedFormTemplateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedFormTemplateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedFormTemplateRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormTemplate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "formTemplatesDestroy",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Delete a form template",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form templates"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-templates/{id}/asset-fields/": {
      "get": {
        "operationId": "formTemplatesAssetFieldsList",
        "description": "Overview fields an asset form can update (see\n``FormTemplate.asset_overview_fields``).",
        "summary": "List asset fields a form can update",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Form templates"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FormTemplateAssetField"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-templates/{id}/duplicate/": {
      "post": {
        "operationId": "formTemplatesDuplicateCreate",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Duplicate a form template",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form templates"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormTemplate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-templates/{id}/populate_from_entity/": {
      "post": {
        "operationId": "formTemplatesPopulateFromEntityCreate",
        "description": "Maps the fields of a record (e.g. an asset) into form data via the template's active entity mapping.",
        "summary": "Prefill a form from a record",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form templates"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/FormPopulateRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/FormPopulateRequestRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FormPopulateRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormPopulateResult"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "No active mapping or record found."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-templates/{id}/revisions/": {
      "get": {
        "operationId": "formTemplatesRevisionsList",
        "description": "All stored versions of the form, newest first.",
        "summary": "List versions of a form template",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Form templates"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/FormTemplateRevision"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-templates/{id}/revisions/{version}/": {
      "get": {
        "operationId": "formTemplatesRevisionsRetrieve",
        "description": "Mixin that appends ``FeatureFlagRequired`` to ``get_permissions``.\n\nViews/viewsets set ``required_feature_flag`` to the relevant flag key.\nThe mixin keeps the project-wide default permission classes intact and\nonly adds the extra check on top, returning 403 when the flag is off.",
        "summary": "Retrieve a version of a form template",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          },
          {
            "in": "path",
            "name": "version",
            "schema": {
              "type": "integer"
            },
            "description": "Version number, starting at 1.",
            "required": true
          }
        ],
        "tags": [
          "Form templates"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormTemplateRevisionDetail"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-templates/{id}/revisions/{version}/restore/": {
      "post": {
        "operationId": "formTemplatesRevisionsRestoreCreate",
        "description": "Brings an old version back; this stores the next version.",
        "summary": "Restore a version of a form template",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          },
          {
            "in": "path",
            "name": "version",
            "schema": {
              "type": "integer"
            },
            "description": "Version number, starting at 1.",
            "required": true
          }
        ],
        "tags": [
          "Form templates"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormTemplate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/form-templates/{id}/validate-schema/": {
      "post": {
        "operationId": "formTemplatesValidateSchemaCreate",
        "description": "Checks the posted FormKit `schema` (or the stored one, without a body) without saving it.",
        "summary": "Validate a form schema",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der Form Template identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Form templates"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/FormSchemaRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/FormSchemaRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FormSchemaRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormSchemaValidation"
                }
              }
            },
            "description": ""
          },
          "400": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FormSchemaValidation"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/": {
      "get": {
        "operationId": "knowledgeItemsList",
        "description": "Documents, videos and other knowledge items you may see, with processing status, extracted text and links to records.",
        "summary": "List knowledge items",
        "parameters": [
          {
            "in": "query",
            "name": "folder",
            "schema": {
              "type": "string"
            },
            "description": "Items directly in this folder."
          },
          {
            "in": "query",
            "name": "folder_prefix",
            "schema": {
              "type": "string"
            },
            "description": "Items in this folder or any of its subfolders."
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "q",
            "schema": {
              "type": "string"
            },
            "description": "Search in name and summary."
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "tags",
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated tag names; an item must carry all of them."
          },
          {
            "in": "query",
            "name": "type",
            "schema": {
              "type": "string"
            },
            "description": "Document type name."
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KnowledgeItem"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "knowledgeItemsCreate",
        "description": "Upload the file first (`POST /api/presigned-urls/`) and pass its `id` as `fileId`. `type` names the document type; `assetTypes` and `assets` (lists of ids) link the item.",
        "summary": "Create a knowledge item",
        "tags": [
          "Knowledge items"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/{id}/": {
      "get": {
        "operationId": "knowledgeItemsRetrieve",
        "description": "The processing actions of :class:`KnowledgeItemViewSet`; ids resolve\nthrough its ``get_queryset`` (partner scope and document ACL).",
        "summary": "Retrieve a knowledge item",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItem"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "knowledgeItemsUpdate",
        "description": "The processing actions of :class:`KnowledgeItemViewSet`; ids resolve\nthrough its ``get_queryset`` (partner scope and document ACL).",
        "summary": "Replace a knowledge item",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "knowledgeItemsPartialUpdate",
        "description": "The processing actions of :class:`KnowledgeItemViewSet`; ids resolve\nthrough its ``get_queryset`` (partner scope and document ACL).",
        "summary": "Update a knowledge item",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedKnowledgeItemRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedKnowledgeItemRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedKnowledgeItemRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "knowledgeItemsDestroy",
        "description": "Moves the item to the trash (deleted for good after 30 days). With `content_type` and `object_id` only the link to that record is removed; the item is deleted once its last link is gone.",
        "summary": "Delete a knowledge item",
        "parameters": [
          {
            "in": "query",
            "name": "content_type",
            "schema": {
              "type": "string"
            },
            "description": "`app_label.model` of the linked record, e.g. `core.asset`."
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          },
          {
            "in": "query",
            "name": "object_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/{id}/assign/": {
      "post": {
        "operationId": "knowledgeItemsAssignCreate",
        "description": "Assigns the item to a member for review.",
        "summary": "Assign a knowledge item to a user",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemAssignRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemAssignRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemAssignRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItemAssigned"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/{id}/ingest/": {
      "post": {
        "operationId": "knowledgeItemsIngestCreate",
        "description": "Queues the ingest of the extracted text (COMPANION add-on).",
        "summary": "Add to the AI knowledge base",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProcessingQueued"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/{id}/move/": {
      "post": {
        "operationId": "knowledgeItemsMoveCreate",
        "description": "Updates `folderPath` at once and moves the stored file in the background (202); `fileUrl` changes once the move is done.",
        "summary": "Move a knowledge item to a folder",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemMoveRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemMoveRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemMoveRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItem"
                }
              }
            },
            "description": ""
          },
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItem"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/{id}/ocr/": {
      "post": {
        "operationId": "knowledgeItemsOcrCreate",
        "description": "Queues the text extraction of a document (not for audio/video). With `ingest: true` the text is added to the AI knowledge base afterwards (COMPANION add-on).",
        "summary": "Extract text (OCR)",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/OcrRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/OcrRequestRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/OcrRequestRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProcessingQueued"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/{id}/processing_status/": {
      "get": {
        "operationId": "knowledgeItemsProcessingStatusRetrieve",
        "description": "The processing actions of :class:`KnowledgeItemViewSet`; ids resolve\nthrough its ``get_queryset`` (partner scope and document ACL).",
        "summary": "Processing status of a knowledge item",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItemProcessingStatus"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/{id}/transcribe/": {
      "post": {
        "operationId": "knowledgeItemsTranscribeCreate",
        "description": "The processing actions of :class:`KnowledgeItemViewSet`; ids resolve\nthrough its ``get_queryset`` (partner scope and document ACL).",
        "summary": "Transcribe audio or video",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/TranscriptionRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/TranscriptionRequestRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TranscriptionRequestRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProcessingQueued"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/{id}/unassign/": {
      "post": {
        "operationId": "knowledgeItemsUnassignCreate",
        "description": "The processing actions of :class:`KnowledgeItemViewSet`; ids resolve\nthrough its ``get_queryset`` (partner scope and document ACL).",
        "summary": "Remove the assignment of a knowledge item",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der knowledge item identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItemUnassigned"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/assign-to-entity/": {
      "post": {
        "operationId": "knowledgeItemsAssignToEntityCreate",
        "description": "The processing actions of :class:`KnowledgeItemViewSet`; ids resolve\nthrough its ``get_queryset`` (partner scope and document ACL).",
        "summary": "Link knowledge items to an asset or asset type",
        "tags": [
          "Knowledge items"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemsLinkRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemsLinkRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/KnowledgeItemsLinkRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/KnowledgeItemsLinked"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "Record or knowledge items not found."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/bulk-process/": {
      "post": {
        "operationId": "knowledgeItemsBulkProcessCreate",
        "description": "`ocr` extracts text (audio/video is transcribed), `ocr_ingest` also adds it to the AI knowledge base, `ingest` only adds already extracted text. Every id ends up in `queued` or `skipped` (with a reason).",
        "summary": "Process several knowledge items",
        "tags": [
          "Knowledge items"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/BulkProcessRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/BulkProcessRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BulkProcessRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BulkProcessResult"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/folders/": {
      "get": {
        "operationId": "knowledgeItemsFoldersList",
        "description": "List distinct folder paths used by knowledge items in this tenant.",
        "summary": "List folders",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KnowledgeFolder"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/knowledge-items/search/": {
      "get": {
        "operationId": "knowledgeItemsSearchList",
        "description": "At most 50 results.",
        "summary": "Search knowledge items by name",
        "parameters": [
          {
            "in": "query",
            "name": "exclude_entity_id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "… with this id."
          },
          {
            "in": "query",
            "name": "exclude_entity_type",
            "schema": {
              "type": "string",
              "enum": [
                "asset",
                "assettype"
              ]
            },
            "description": "Leave out items already linked to this record …"
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "q",
            "schema": {
              "type": "string"
            },
            "required": true
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Knowledge items"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/KnowledgeItem"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/presigned-urls/": {
      "post": {
        "operationId": "presignedUrlsCreate",
        "description": "Step 1 of a file upload: returns a presigned `uploadUrl`. Upload the raw file content with `PUT <uploadUrl>` within one hour, then pass `id` as `fileId` to the endpoint that uses the file, e.g. `POST /api/documents/`. `fileUrl` is the stable download URL.",
        "summary": "Request an upload URL",
        "tags": [
          "Files"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PresignedUrlRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PresignedUrlRequestRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PresignedUrlRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PresignedUpload"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-orders/": {
      "get": {
        "operationId": "serviceOrdersList",
        "description": "Newest scheduled first. Filter by technician, customer, status and dates.",
        "summary": "List service orders",
        "parameters": [
          {
            "in": "query",
            "name": "asset_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer_asset",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "is_completed",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "is_started",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "needs_triage",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "scheduled_after",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "scheduled_before",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "service_request",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "severity",
            "schema": {
              "type": "string",
              "enum": [
                "HIGH",
                "LOW",
                "MEDIUM"
              ]
            },
            "description": "* `LOW` - Low\n* `MEDIUM` - Medium\n* `HIGH` - High"
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "CLOSED",
                "IN_PROGRESS",
                "OPEN"
              ]
            },
            "description": "* `OPEN` - Open\n* `IN_PROGRESS` - In Progress\n* `CLOSED` - Closed"
          },
          {
            "in": "query",
            "name": "technician",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "Service orders"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedServiceOrderList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "serviceOrdersCreate",
        "description": "Schedules a job for a service request (`serviceRequest`) or directly for an installed asset (`customerAsset`).",
        "summary": "Create a service order",
        "tags": [
          "Service orders"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServiceOrderCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServiceOrderCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceOrderCreateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceOrderCreate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-orders/{id}/": {
      "get": {
        "operationId": "serviceOrdersRetrieve",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Retrieve a service order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service order identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service orders"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceOrder"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "serviceOrdersUpdate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Replace a service order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service order identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service orders"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServiceOrderRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServiceOrderRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceOrderRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceOrder"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "serviceOrdersPartialUpdate",
        "description": "Setting `completedAt` on an open order completes it (and closes its service request); clearing it reopens the order.",
        "summary": "Update a service order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service order identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service orders"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedServiceOrderRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedServiceOrderRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedServiceOrderRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceOrder"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "serviceOrdersDestroy",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Delete a service order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service order identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service orders"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-orders/{id}/briefing/": {
      "get": {
        "operationId": "serviceOrdersBriefingRetrieve",
        "description": "A short AI-generated briefing for the technician (generated once, then cached). `briefing` is `null` when AI is not available.",
        "summary": "AI briefing for a service order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service order identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service orders"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceOrderBriefing"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-orders/{id}/documents/": {
      "get": {
        "operationId": "serviceOrdersDocumentsList",
        "description": "Documents of the order's asset and asset type.",
        "summary": "List documents of a service order",
        "parameters": [
          {
            "in": "query",
            "name": "asset_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer_asset",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service order identifiziert.",
            "required": true
          },
          {
            "in": "query",
            "name": "is_completed",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "is_started",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "needs_triage",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "scheduled_after",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "scheduled_before",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "service_request",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "severity",
            "schema": {
              "type": "string",
              "enum": [
                "HIGH",
                "LOW",
                "MEDIUM"
              ]
            },
            "description": "* `LOW` - Low\n* `MEDIUM` - Medium\n* `HIGH` - High"
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "CLOSED",
                "IN_PROGRESS",
                "OPEN"
              ]
            },
            "description": "* `OPEN` - Open\n* `IN_PROGRESS` - In Progress\n* `CLOSED` - Closed"
          },
          {
            "in": "query",
            "name": "technician",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "Service orders"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedDocumentList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-orders/{id}/history/": {
      "get": {
        "operationId": "serviceOrdersHistoryList",
        "description": "Stored versions, oldest first, with the fields each one changed.",
        "summary": "Change history of a service order",
        "parameters": [
          {
            "in": "query",
            "name": "asset_type",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "customer_asset",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service order identifiziert.",
            "required": true
          },
          {
            "in": "query",
            "name": "is_completed",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "is_started",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "needs_triage",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "scheduled_after",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "in": "query",
            "name": "scheduled_before",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "service_request",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "in": "query",
            "name": "severity",
            "schema": {
              "type": "string",
              "enum": [
                "HIGH",
                "LOW",
                "MEDIUM"
              ]
            },
            "description": "* `LOW` - Low\n* `MEDIUM` - Medium\n* `HIGH` - High"
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "CLOSED",
                "IN_PROGRESS",
                "OPEN"
              ]
            },
            "description": "* `OPEN` - Open\n* `IN_PROGRESS` - In Progress\n* `CLOSED` - Closed"
          },
          {
            "in": "query",
            "name": "technician",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "Service orders"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedHistoryList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-partners/": {
      "get": {
        "operationId": "servicePartnersList",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "List service partners",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Service partners"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ServicePartner"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "servicePartnersCreate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Create a service partner",
        "tags": [
          "Service partners"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServicePartner"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-partners/{id}/": {
      "get": {
        "operationId": "servicePartnersRetrieve",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Retrieve a service partner",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service partner identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service partners"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServicePartner"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "servicePartnersUpdate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Replace a service partner",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service partner identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service partners"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServicePartner"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "servicePartnersPartialUpdate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Update a service partner",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service partner identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service partners"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedServicePartnerRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedServicePartnerRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedServicePartnerRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServicePartner"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "servicePartnersDestroy",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Delete a service partner",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service partner identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service partners"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-partners/{id}/certifications/": {
      "get": {
        "operationId": "servicePartnersCertificationsList",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "List certifications of a service partner",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service partner identifiziert.",
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Service partners"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ServicePartnerCertification"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "servicePartnersCertificationsCreate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Add a certification to a service partner",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service partner identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service partners"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerCertificationRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerCertificationRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServicePartnerCertificationRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServicePartnerCertification"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-partners/{id}/certifications/{certificationId}/": {
      "delete": {
        "operationId": "servicePartnersCertificationsDestroy",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Delete a certification of a service partner",
        "parameters": [
          {
            "in": "path",
            "name": "certificationId",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "required": true
          },
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service partner identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service partners"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-reports/": {
      "get": {
        "operationId": "serviceReportsList",
        "description": "Admin endpoint to file a service report (protocol) for an order.",
        "summary": "List service reports",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "service_order",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "tags": [
          "Service reports"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ServiceReport"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "serviceReportsCreate",
        "description": "Files the report (protocol) of a service order and completes the order with it. `attachments` are the `fileUrl`s of uploads from `POST /api/presigned-urls/`; each becomes a document of the order.",
        "summary": "File a service report",
        "tags": [
          "Service reports"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServiceReportCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServiceReportCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceReportCreateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceReport"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-reports/{id}/": {
      "get": {
        "operationId": "serviceReportsRetrieve",
        "description": "Admin endpoint to file a service report (protocol) for an order.",
        "summary": "Retrieve a service report",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service report identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service reports"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceReport"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-requests/": {
      "get": {
        "operationId": "serviceRequestsList",
        "description": "All service requests of your tenant (not paginated).",
        "summary": "List service requests",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Service requests"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/ServiceRequest"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "serviceRequestsCreate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Create a service request",
        "tags": [
          "Service requests"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServiceRequestCreateRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServiceRequestCreateRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceRequestCreateRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceRequestCreate"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-requests/{id}/": {
      "get": {
        "operationId": "serviceRequestsRetrieve",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Retrieve a service request",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service requests"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceRequest"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "serviceRequestsUpdate",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Replace a service request",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service requests"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/ServiceRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/ServiceRequestRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceRequestRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceRequest"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "serviceRequestsPartialUpdate",
        "description": "Closing a request (`status` `CLOSED`) without a completed service order needs a `resolution`.",
        "summary": "Update a service request",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service requests"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedServiceRequestRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedServiceRequestRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedServiceRequestRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceRequest"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "serviceRequestsDestroy",
        "description": "Restricts the queryset to the requesting partner user's partner.\n\nViews set ``partner_scope_filter`` to the lookup path from the model to\n``ServicePartner`` (e.g. ``\"servicepartner\"`` for the M2M reverse on\nAsset, or ``\"customer_asset__asset__servicepartner\"`` for service\nrequests). Non-partner users are unaffected.",
        "summary": "Delete a service request",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service requests"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-requests/{id}/chat/": {
      "get": {
        "operationId": "serviceRequestsChatRetrieve",
        "description": "The self-service chat the request was handed over from; 204 when it was not created from a chat.",
        "summary": "Self-service chat of a service request",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service requests"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Chat"
                }
              }
            },
            "description": ""
          },
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-requests/{id}/diagnose/": {
      "post": {
        "operationId": "serviceRequestsDiagnoseCreate",
        "description": "(Re-)runs the AI error diagnosis in the background; poll the request's `diagnosis` for the result. Needs the COMPANION add-on.",
        "summary": "Run the AI diagnosis",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service requests"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DiagnosisStarted"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "409": {
            "description": "A diagnosis is already running."
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-requests/{id}/diagnosis/accept/": {
      "post": {
        "operationId": "serviceRequestsDiagnosisAcceptCreate",
        "description": "Human review: accept one suggestion of the latest diagnosis.",
        "summary": "Accept a diagnosis suggestion",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service requests"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DiagnosisAcceptRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DiagnosisAcceptRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DiagnosisAcceptRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceRequest"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-requests/{id}/diagnosis/reject/": {
      "post": {
        "operationId": "serviceRequestsDiagnosisRejectCreate",
        "description": "Human review: reject the latest diagnosis (no order is created).",
        "summary": "Reject the diagnosis",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service requests"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/DiagnosisRejectRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/DiagnosisRejectRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DiagnosisRejectRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceRequest"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-requests/{id}/history/": {
      "get": {
        "operationId": "serviceRequestsHistoryList",
        "description": "Stored versions, oldest first, with the fields each one changed.",
        "summary": "Change history of a service request",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Service requests"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/History"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/service-requests/{id}/order-presets/": {
      "post": {
        "operationId": "serviceRequestsOrderPresetsCreate",
        "description": "Proposes technician, time slot and description for a service order on this request. Nothing is saved.",
        "summary": "Suggest a service order",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der service request identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Service requests"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceOrderPresets"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/technicians/": {
      "get": {
        "operationId": "techniciansList",
        "description": "People a service order can be assigned to: internal technicians and the users of your service partners.",
        "summary": "List technicians",
        "parameters": [
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "tags": [
          "Technicians"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Assignee"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/technicians/{id}/": {
      "get": {
        "operationId": "techniciansRetrieve",
        "description": "People a service order can be assigned to (read-only).\n\nInternal technicians are users with the technician role, subcontractors\nare users bound to a service partner; both are managed under \"Benutzer\".",
        "summary": "Retrieve a technician",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der intuaid user identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Technicians"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Assignee"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/webhooks/deliveries/": {
      "get": {
        "operationId": "webhooksDeliveriesList",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "List deliveries",
        "parameters": [
          {
            "in": "query",
            "name": "endpoint",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "ordering",
            "required": false,
            "in": "query",
            "description": "Feld, das zum Sortieren der Ergebnisse verwendet werden soll.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "search",
            "required": false,
            "in": "query",
            "description": "Ein Suchbegriff.",
            "schema": {
              "type": "string"
            }
          },
          {
            "in": "query",
            "name": "status",
            "schema": {
              "type": "string",
              "enum": [
                "failed",
                "pending",
                "succeeded"
              ]
            },
            "description": "* `pending` - Pending\n* `succeeded` - Succeeded\n* `failed` - Failed"
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedWebhookDeliveryList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/webhooks/deliveries/{id}/": {
      "get": {
        "operationId": "webhooksDeliveriesRetrieve",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Retrieve a delivery",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der webhook delivery identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDelivery"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/webhooks/deliveries/{id}/redeliver/": {
      "post": {
        "operationId": "webhooksDeliveriesRedeliverCreate",
        "description": "Queues a new delivery of the same event (same `webhook-id`) to the same endpoint.",
        "summary": "Redeliver an event",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der webhook delivery identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDelivery"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/webhooks/endpoints/": {
      "get": {
        "operationId": "webhooksEndpointsList",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "List webhook endpoints",
        "parameters": [
          {
            "name": "limit",
            "required": false,
            "in": "query",
            "description": "Anzahl der pro Seite zurückzugebenden Ergebnisse.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "offset",
            "required": false,
            "in": "query",
            "description": "Der initiale Index, von dem die Ergebnisse zurückgegeben werden sollen.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaginatedWebhookEndpointList"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "post": {
        "operationId": "webhooksEndpointsCreate",
        "description": "Returns the signing secret once; store it to verify deliveries.",
        "summary": "Create a webhook endpoint",
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpointCreated"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/webhooks/endpoints/{id}/": {
      "get": {
        "operationId": "webhooksEndpointsRetrieve",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Retrieve a webhook endpoint",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der webhook endpoint identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpoint"
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "put": {
        "operationId": "webhooksEndpointsUpdate",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Replace a webhook endpoint",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der webhook endpoint identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookEndpointRequest"
              }
            }
          },
          "required": true
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpoint"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "patch": {
        "operationId": "webhooksEndpointsPartialUpdate",
        "description": "`isActive: true` re-enables an endpoint that was disabled after repeated failures.",
        "summary": "Update a webhook endpoint",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der webhook endpoint identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "$ref": "#/components/schemas/PatchedWebhookEndpointRequest"
              }
            },
            "multipart/form-data": {
              "schema": {
                "$ref": "#/components/schemas/PatchedWebhookEndpointRequest"
              }
            },
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PatchedWebhookEndpointRequest"
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookEndpoint"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      },
      "delete": {
        "operationId": "webhooksEndpointsDestroy",
        "description": "Mixin that adds ApiKeyAuthentication to a viewset.",
        "summary": "Delete a webhook endpoint",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der webhook endpoint identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "204": {
            "description": "No response body"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/webhooks/endpoints/{id}/rotate-secret/": {
      "post": {
        "operationId": "webhooksEndpointsRotateSecretCreate",
        "description": "Returns the new secret. Deliveries are signed with the previous secret as well for 24 hours.",
        "summary": "Rotate the signing secret",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der webhook endpoint identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookSecret"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/webhooks/endpoints/{id}/test/": {
      "post": {
        "operationId": "webhooksEndpointsTestCreate",
        "description": "Queues a `webhook.ping` event to this endpoint.",
        "summary": "Send a test event",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "description": "Ein UUID-String, der webhook endpoint identifiziert.",
            "required": true
          }
        ],
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "202": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookDelivery"
                }
              }
            },
            "description": ""
          },
          "400": {
            "$ref": "#/components/responses/ValidationFailed"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    },
    "/api/webhooks/event-types/": {
      "get": {
        "operationId": "webhooksEventTypesList",
        "description": "Every event type an endpoint can subscribe to.",
        "summary": "List event types",
        "tags": [
          "Webhooks"
        ],
        "security": [
          {
            "ApiKeyHeader": []
          },
          {
            "ApiKeyBearer": []
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/WebhookEventType"
                  }
                }
              }
            },
            "description": ""
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "AdvancedOcrOptionsRequest": {
        "type": "object",
        "properties": {
          "ocrEngine": {
            "allOf": [
              {
                "$ref": "#/components/schemas/OcrEngineEnum"
              }
            ],
            "default": "rapidocr"
          },
          "languages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/LanguagesEnum"
            }
          },
          "doOcr": {
            "type": "boolean",
            "default": true
          },
          "forceFullPageOcr": {
            "type": "boolean",
            "default": false
          },
          "doTableStructure": {
            "type": "boolean",
            "default": false
          },
          "tableStructureMode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/TableStructureModeEnum"
              }
            ],
            "default": "accurate"
          },
          "imagesScale": {
            "type": "number",
            "format": "double",
            "maximum": 2.5,
            "minimum": 0.5,
            "default": 1
          },
          "forceBackendText": {
            "type": "boolean",
            "default": false
          }
        }
      },
      "AdvancedTranscriptionOptionsRequest": {
        "type": "object",
        "properties": {
          "provider": {
            "$ref": "#/components/schemas/ProviderEnum"
          }
        }
      },
      "Asset": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AssetType"
              }
            ],
            "readOnly": true
          },
          "parent": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Asset this one is built into; its type must contain this type."
          },
          "parentName": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "customerAssetId": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "effectiveImageUrl": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "monitoringIntervals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssetMonitoringInterval"
            }
          },
          "monitoringStatus": {
            "type": [
              "string",
              "null"
            ],
            "description": "Aggregate (worst) traffic light across the asset's intervals.\n\nPrefers the ``earliest_monitoring_due`` annotation set by\n``AssetQuerySet.with_monitoring_status`` (the AssetViewSet list/detail\npath). Without\nit — nested uses such as ``CustomerAssetSerializer`` — it derives the\nvalue from the already-prefetched intervals only, never issuing a query;\nif the relation was not prefetched it returns ``None`` rather than risk\nan N+1.",
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "serialNumber": {
            "type": "string",
            "maxLength": 100
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "customMetadataOverview": {
            "description": "Per-asset values for overview fields (non-reserved keys)"
          },
          "customMetadata": {
            "description": "Custom metadata for dynamic form fields"
          },
          "selfServicePublic": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Override for self-service visibility. NULL inherits from the next level (asset type / tenant default)."
          }
        },
        "required": [
          "createdAt",
          "customerAssetId",
          "effectiveImageUrl",
          "monitoringStatus",
          "name",
          "parentName",
          "serialNumber",
          "type",
          "updatedAt"
        ]
      },
      "AssetCreate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "serialNumber": {
            "type": "string",
            "maxLength": 100
          },
          "assetType": {
            "type": "string",
            "format": "uuid"
          },
          "parent": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Asset this one is built into; its type must contain this type."
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "selfServicePublic": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Override for self-service visibility. NULL inherits from the next level (asset type / tenant default)."
          },
          "monitoringIntervals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssetMonitoringInterval"
            }
          }
        },
        "required": [
          "assetType",
          "serialNumber"
        ]
      },
      "AssetCreateRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "serialNumber": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "assetType": {
            "type": "string",
            "format": "uuid"
          },
          "parent": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Asset this one is built into; its type must contain this type."
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "selfServicePublic": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Override for self-service visibility. NULL inherits from the next level (asset type / tenant default)."
          },
          "customer": {
            "type": "string",
            "format": "uuid",
            "writeOnly": true
          },
          "monitoringIntervals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssetMonitoringIntervalRequest"
            }
          }
        },
        "required": [
          "assetType",
          "serialNumber"
        ]
      },
      "AssetData": {
        "type": "object",
        "properties": {
          "object": {
            "enum": [
              "asset"
            ],
            "type": "string",
            "description": "Kind of object the event is about.\n\n* `asset` - asset"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the object; fetch it via the API."
          }
        },
        "required": [
          "id",
          "object"
        ]
      },
      "AssetEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Event id, identical to the `webhook-id` header and stable across retries."
          },
          "type": {
            "enum": [
              "asset.created",
              "asset.updated",
              "asset.deleted"
            ],
            "type": "string",
            "description": "* `asset.created` - asset.created\n* `asset.updated` - asset.updated\n* `asset.deleted` - asset.deleted"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "When the event happened."
          },
          "data": {
            "$ref": "#/components/schemas/AssetData"
          }
        },
        "required": [
          "data",
          "id",
          "timestamp",
          "type"
        ]
      },
      "AssetMonitoringInterval": {
        "type": "object",
        "description": "Nested monitoring interval of an asset (replace-all list semantics).\n\nThe writable ``id`` drives the sync in ``AssetSerializer``: ids of\nexisting intervals update in place, unknown or missing ids create fresh\nrows, ids absent from the submitted list delete.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "description": {
            "type": "string",
            "description": "What has to be done for this inspection."
          },
          "intervalMonths": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 1
          },
          "nextDueDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "forms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssetTypeFormTemplate"
            },
            "readOnly": true
          },
          "documents": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MonitoringIntervalDocument"
            },
            "readOnly": true
          },
          "allowCustomerCompletion": {
            "type": "boolean",
            "description": "Whether an end customer may mark this interval done from the self-service page (also when unauthenticated)."
          },
          "reminderEmails": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "email"
            }
          },
          "resetAnchor": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ResetAnchorEnum"
              }
            ],
            "description": "How the next due date is computed on reset.\n\n* `completion` - Ab Erledigungsdatum\n* `due_date` - Ab Fälligkeitsdatum"
          },
          "lastResetDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "readOnly": true
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "hasOpenOrder": {
            "type": "boolean",
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "documents",
          "forms",
          "hasOpenOrder",
          "intervalMonths",
          "lastResetDate",
          "status",
          "updatedAt"
        ]
      },
      "AssetMonitoringIntervalRequest": {
        "type": "object",
        "description": "Nested monitoring interval of an asset (replace-all list semantics).\n\nThe writable ``id`` drives the sync in ``AssetSerializer``: ids of\nexisting intervals update in place, unknown or missing ids create fresh\nrows, ids absent from the submitted list delete.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "description": {
            "type": "string",
            "description": "What has to be done for this inspection."
          },
          "intervalMonths": {
            "type": "integer",
            "maximum": 2147483647,
            "minimum": 1
          },
          "nextDueDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "formIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "writeOnly": true
            },
            "writeOnly": true
          },
          "documentIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "writeOnly": true
          },
          "allowCustomerCompletion": {
            "type": "boolean",
            "description": "Whether an end customer may mark this interval done from the self-service page (also when unauthenticated)."
          },
          "reminderEmails": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "email",
              "minLength": 1
            }
          },
          "resetAnchor": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ResetAnchorEnum"
              }
            ],
            "description": "How the next due date is computed on reset.\n\n* `completion` - Ab Erledigungsdatum\n* `due_date` - Ab Fälligkeitsdatum"
          }
        },
        "required": [
          "intervalMonths"
        ]
      },
      "AssetRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "parent": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Asset this one is built into; its type must contain this type."
          },
          "monitoringIntervals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssetMonitoringIntervalRequest"
            }
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "serialNumber": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "customMetadataOverview": {
            "description": "Per-asset values for overview fields (non-reserved keys)"
          },
          "customMetadata": {
            "description": "Custom metadata for dynamic form fields"
          },
          "selfServicePublic": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Override for self-service visibility. NULL inherits from the next level (asset type / tenant default)."
          }
        },
        "required": [
          "name",
          "serialNumber"
        ]
      },
      "AssetServicePartnersAssigned": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "assignedCount": {
            "type": "integer"
          }
        },
        "required": [
          "assignedCount",
          "message"
        ]
      },
      "AssetStructureNode": {
        "type": "object",
        "description": "Slim asset row of the asset structure; ``parent`` links the tree.\n\nExpects ``with_monitoring_status`` and, for ``open_service_requests``,\n``location`` and ``parent_name``, the annotations set by\n``AssetViewSet.structure``.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "readOnly": true
          },
          "serialNumber": {
            "type": "string",
            "readOnly": true
          },
          "parent": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "readOnly": true,
            "description": "Asset this one is built into. Its type must directly contain this asset's type (see AssetTypeRelation)."
          },
          "parentName": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "assetType": {
            "allOf": [
              {
                "$ref": "#/components/schemas/AssetTypeReference"
              }
            ],
            "readOnly": true
          },
          "monitoringStatus": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "nextDueDate": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "readOnly": true
          },
          "openServiceRequests": {
            "type": [
              "integer",
              "null"
            ],
            "readOnly": true
          },
          "location": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Customer and site from ``AssetQuerySet.with_location``; null when\nunplaced.",
            "readOnly": true
          }
        },
        "required": [
          "assetType",
          "id",
          "location",
          "monitoringStatus",
          "name",
          "nextDueDate",
          "openServiceRequests",
          "parent",
          "parentName",
          "serialNumber"
        ]
      },
      "AssetType": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. factory, cog, cpu); empty uses the default.",
            "maxLength": 100
          },
          "forms": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssetTypeFormTemplate"
            },
            "readOnly": true
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "productData": {
            "description": "Product-specific data and configuration"
          },
          "overviewData": {
            "description": "Ordered overview fields: key + display label; serial_number is a reserved key."
          },
          "selfServiceSettings": {
            "description": "Self-service portal settings: visibility toggles, replacement parts URL, contact override."
          },
          "selfServicePublic": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Override for self-service visibility. NULL inherits from the next level (asset type / tenant default)."
          },
          "labelSettings": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Per-type label settings override. NULL inherits the tenant label settings."
          },
          "faq": {
            "description": "Ordered FAQ entries: [{'question': str, 'answer': str}, ...]"
          },
          "tutorials": {
            "description": "Ordered list of Video knowledge-item ids shown as self-service tutorials."
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "forms",
          "name",
          "updatedAt"
        ]
      },
      "AssetTypeFormTemplate": {
        "type": "object",
        "description": "Lightweight form template serializer for asset type listing.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "formType": {
            "$ref": "#/components/schemas/FormTypeEnum"
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. clipboard-list, file-text, settings)",
            "maxLength": 100
          },
          "isActive": {
            "type": "boolean",
            "title": "Active"
          }
        },
        "required": [
          "formType",
          "name"
        ]
      },
      "AssetTypeFormTemplateIdsRequest": {
        "type": "object",
        "properties": {
          "formTemplateIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          }
        },
        "required": [
          "formTemplateIds"
        ]
      },
      "AssetTypeFormTemplateRequest": {
        "type": "object",
        "description": "Lightweight form template serializer for asset type listing.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "formType": {
            "$ref": "#/components/schemas/FormTypeEnum"
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. clipboard-list, file-text, settings)",
            "maxLength": 100
          },
          "isActive": {
            "type": "boolean",
            "title": "Active"
          }
        },
        "required": [
          "formType",
          "name"
        ]
      },
      "AssetTypeHierarchy": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "icon": {
            "type": [
              "string",
              "null"
            ]
          },
          "parents": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            },
            "description": "Nested upwards: each node carries its own `parents`."
          },
          "children": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            },
            "description": "Nested downwards: each node carries its own `children`."
          },
          "truncated": {
            "type": "boolean",
            "description": "The trees were cut at the depth or size limit."
          }
        },
        "required": [
          "children",
          "icon",
          "id",
          "imageUrl",
          "name",
          "parents",
          "truncated"
        ]
      },
      "AssetTypeReference": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. factory, cog, cpu); empty uses the default.",
            "maxLength": 100
          }
        },
        "required": [
          "name"
        ]
      },
      "AssetTypeRelationRequest": {
        "type": "object",
        "description": "Adds ``child_id`` as a child of the ``parent`` asset type (context).",
        "properties": {
          "childId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "childId"
        ]
      },
      "AssetTypeRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. factory, cog, cpu); empty uses the default.",
            "maxLength": 100
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "productData": {
            "description": "Product-specific data and configuration"
          },
          "overviewData": {
            "description": "Ordered overview fields: key + display label; serial_number is a reserved key."
          },
          "selfServiceSettings": {
            "description": "Self-service portal settings: visibility toggles, replacement parts URL, contact override."
          },
          "selfServicePublic": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Override for self-service visibility. NULL inherits from the next level (asset type / tenant default)."
          },
          "labelSettings": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Per-type label settings override. NULL inherits the tenant label settings."
          },
          "faq": {
            "description": "Ordered FAQ entries: [{'question': str, 'answer': str}, ...]"
          },
          "tutorials": {
            "description": "Ordered list of Video knowledge-item ids shown as self-service tutorials."
          }
        },
        "required": [
          "name"
        ]
      },
      "Assignee": {
        "type": "object",
        "description": "A person assigned to (or assignable to) a service order.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "readOnly": true
          },
          "email": {
            "type": "string",
            "format": "email",
            "readOnly": true
          },
          "phone": {
            "type": "string",
            "readOnly": true
          },
          "servicePartner": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/AssigneeServicePartner"
              },
              {
                "type": "null"
              }
            ],
            "readOnly": true
          }
        },
        "required": [
          "email",
          "id",
          "name",
          "phone",
          "servicePartner"
        ]
      },
      "AssigneeServicePartner": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "BlankEnum": {
        "enum": [
          ""
        ]
      },
      "BulkProcessRequest": {
        "type": "object",
        "description": "Validate the payload for the ``bulk-process`` action.\n\n``mode`` selects the pipeline to run over the given ids:\n    - ``ocr``        -- (re)run OCR/extraction only\n    - ``ocr_ingest`` -- OCR, then chain a LightRAG ingest (default)\n    - ``ingest``     -- ingest existing OCR text only",
        "properties": {
          "ids": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "maxItems": 200
          },
          "mode": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ModeEnum"
              }
            ],
            "default": "ocr_ingest"
          }
        },
        "required": [
          "ids"
        ]
      },
      "BulkProcessResult": {
        "type": "object",
        "properties": {
          "requested": {
            "type": "integer"
          },
          "queued": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "skipped": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BulkProcessSkipped"
            }
          },
          "info": {
            "type": "string"
          },
          "aiBudgetBlocked": {
            "type": "boolean"
          }
        },
        "required": [
          "queued",
          "requested",
          "skipped"
        ]
      },
      "BulkProcessSkipped": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "reason": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "reason"
        ]
      },
      "CategoryEnum": {
        "enum": [
          "asset_images",
          "certifications",
          "documents",
          "employee_cvs",
          "form_imports",
          "manuals",
          "messages",
          "service_report_files",
          "service_reports",
          "tenant_logos",
          "user_profiles",
          "videos",
          "videos/thumbnails",
          "voice_recordings"
        ],
        "type": "string",
        "description": "* `asset_images` - asset_images\n* `certifications` - certifications\n* `documents` - documents\n* `employee_cvs` - employee_cvs\n* `form_imports` - form_imports\n* `manuals` - manuals\n* `messages` - messages\n* `service_report_files` - service_report_files\n* `service_reports` - service_reports\n* `tenant_logos` - tenant_logos\n* `user_profiles` - user_profiles\n* `videos` - videos\n* `videos/thumbnails` - videos/thumbnails\n* `voice_recordings` - voice_recordings"
      },
      "Chat": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "title": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "contextScope": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ContextScopeEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              },
              {
                "$ref": "#/components/schemas/NullEnum"
              }
            ]
          },
          "contextScopeId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "responseVariant": {
            "type": "string",
            "readOnly": true
          },
          "user": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "readOnly": true
          },
          "outcome": {
            "allOf": [
              {
                "$ref": "#/components/schemas/OutcomeEnum"
              }
            ],
            "readOnly": true
          },
          "messages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChatMessage"
            },
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "messages",
          "outcome",
          "responseVariant",
          "updatedAt",
          "user"
        ]
      },
      "ChatMessage": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Return id as string to match frontend expectations",
            "readOnly": true
          },
          "content": {
            "type": "string"
          },
          "role": {
            "$ref": "#/components/schemas/RoleEnum"
          },
          "sources": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChatMessageSource"
            },
            "readOnly": true
          },
          "attachments": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ChatMessageAttachment"
            },
            "readOnly": true
          },
          "options": {},
          "pendingAction": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "readOnly": true
          },
          "isStreaming": {
            "type": "boolean",
            "description": "Stored messages are never streaming",
            "readOnly": true
          },
          "rating": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/RatingEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              },
              {
                "$ref": "#/components/schemas/NullEnum"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "attachments",
          "content",
          "createdAt",
          "id",
          "isStreaming",
          "pendingAction",
          "role",
          "sources"
        ]
      },
      "ChatMessageAttachment": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "originalFilename": {
            "type": "string"
          },
          "fileUrl": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "fileUrl",
          "id",
          "originalFilename"
        ]
      },
      "ChatMessageSource": {
        "type": "object",
        "properties": {
          "knowledgeItemId": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "fileUrl": {
            "type": "string"
          },
          "referenceNumber": {
            "type": "integer"
          }
        },
        "required": [
          "fileUrl",
          "knowledgeItemId",
          "name",
          "referenceNumber"
        ]
      },
      "Comment": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "contentTypeLabel": {
            "type": "string"
          },
          "objectId": {
            "type": "string",
            "format": "uuid"
          },
          "author": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "readOnly": true
          },
          "authorName": {
            "type": "string",
            "readOnly": true
          },
          "body": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "author",
          "authorName",
          "body",
          "contentTypeLabel",
          "createdAt",
          "id",
          "objectId"
        ]
      },
      "CommentRequest": {
        "type": "object",
        "properties": {
          "contentTypeLabel": {
            "type": "string",
            "minLength": 1
          },
          "objectId": {
            "type": "string",
            "format": "uuid"
          },
          "body": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "body",
          "contentTypeLabel",
          "objectId"
        ]
      },
      "ContentLanguageEnum": {
        "enum": [
          "de",
          "en",
          "nl",
          "pl",
          "tr"
        ],
        "type": "string",
        "description": "* `de` - Deutsch\n* `en` - English\n* `nl` - Nederlands\n* `pl` - Polski\n* `tr` - Türkçe"
      },
      "ContextScopeEnum": {
        "enum": [
          "customers",
          "assets",
          "service_orders",
          "service_requests",
          "self_service",
          "forms",
          "interview"
        ],
        "type": "string",
        "description": "* `` - Undefined\n* `customers` - Customers\n* `assets` - Assets\n* `service_orders` - Service Orders\n* `service_requests` - Service Requests\n* `self_service` - Self Service\n* `forms` - Forms\n* `interview` - Knowledge Interview"
      },
      "Customer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "email": {
            "type": "string",
            "format": "email",
            "maxLength": 254
          },
          "phone": {
            "type": "string",
            "maxLength": 30
          },
          "street": {
            "type": "string",
            "maxLength": 100
          },
          "city": {
            "type": "string",
            "maxLength": 100
          },
          "zipCode": {
            "type": "string",
            "maxLength": 5
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "city",
          "createdAt",
          "email",
          "name",
          "street",
          "updatedAt",
          "zipCode"
        ]
      },
      "CustomerAsset": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "site": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CustomerSite"
              }
            ],
            "readOnly": true
          },
          "asset": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Asset"
              }
            ],
            "readOnly": true
          },
          "customer": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "details": {
            "description": "Customer-specific device details (e.g. purchase date, warranty) as ordered entries: [{'label': str, 'value': str}, ...]"
          },
          "printed": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "asset",
          "createdAt",
          "customer",
          "site",
          "updatedAt"
        ]
      },
      "CustomerAssetBulkCreateRequest": {
        "type": "object",
        "properties": {
          "count": {
            "type": "integer",
            "maximum": 100,
            "minimum": 1
          }
        },
        "required": [
          "count"
        ]
      },
      "CustomerAssetCreate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "asset": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "site": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "details": {
            "description": "Customer-specific device details (e.g. purchase date, warranty) as ordered entries: [{'label': str, 'value': str}, ...]"
          }
        }
      },
      "CustomerAssetCreateRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "asset": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "site": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "details": {
            "description": "Customer-specific device details (e.g. purchase date, warranty) as ordered entries: [{'label': str, 'value': str}, ...]"
          },
          "customer": {
            "type": "string",
            "format": "uuid",
            "writeOnly": true
          }
        }
      },
      "CustomerAssetRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "details": {
            "description": "Customer-specific device details (e.g. purchase date, warranty) as ordered entries: [{'label': str, 'value': str}, ...]"
          },
          "printed": {
            "type": "boolean"
          }
        }
      },
      "CustomerAssetUpdate": {
        "type": "object",
        "description": "Writable serializer for progressively assigning asset/site to a QR code.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "asset": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "site": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "details": {
            "description": "Customer-specific device details (e.g. purchase date, warranty) as ordered entries: [{'label': str, 'value': str}, ...]"
          },
          "printed": {
            "type": "boolean"
          }
        }
      },
      "CustomerAssetUpdateRequest": {
        "type": "object",
        "description": "Writable serializer for progressively assigning asset/site to a QR code.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "asset": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "site": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "details": {
            "description": "Customer-specific device details (e.g. purchase date, warranty) as ordered entries: [{'label': str, 'value': str}, ...]"
          },
          "customer": {
            "type": "string",
            "format": "uuid",
            "writeOnly": true
          },
          "printed": {
            "type": "boolean"
          }
        }
      },
      "CustomerData": {
        "type": "object",
        "properties": {
          "object": {
            "enum": [
              "customer"
            ],
            "type": "string",
            "description": "Kind of object the event is about.\n\n* `customer` - customer"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the object; fetch it via the API."
          }
        },
        "required": [
          "id",
          "object"
        ]
      },
      "CustomerEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Event id, identical to the `webhook-id` header and stable across retries."
          },
          "type": {
            "enum": [
              "customer.created",
              "customer.updated",
              "customer.deleted"
            ],
            "type": "string",
            "description": "* `customer.created` - customer.created\n* `customer.updated` - customer.updated\n* `customer.deleted` - customer.deleted"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "When the event happened."
          },
          "data": {
            "$ref": "#/components/schemas/CustomerData"
          }
        },
        "required": [
          "data",
          "id",
          "timestamp",
          "type"
        ]
      },
      "CustomerRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "email": {
            "type": "string",
            "format": "email",
            "minLength": 1,
            "maxLength": 254
          },
          "phone": {
            "type": "string",
            "maxLength": 30
          },
          "street": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "city": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "zipCode": {
            "type": "string",
            "minLength": 1,
            "maxLength": 5
          }
        },
        "required": [
          "city",
          "email",
          "name",
          "street",
          "zipCode"
        ]
      },
      "CustomerSite": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "uuid": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "customer": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Customer"
              }
            ],
            "readOnly": true
          },
          "street": {
            "type": "string",
            "maxLength": 100
          },
          "city": {
            "type": "string",
            "maxLength": 100
          },
          "zipCode": {
            "type": "string",
            "maxLength": 5
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "city",
          "createdAt",
          "customer",
          "street",
          "updatedAt",
          "uuid",
          "zipCode"
        ]
      },
      "CustomerSiteCreate": {
        "type": "object",
        "properties": {
          "customer": {
            "type": "string",
            "format": "uuid"
          },
          "street": {
            "type": "string",
            "maxLength": 100
          },
          "city": {
            "type": "string",
            "maxLength": 100
          },
          "zipCode": {
            "type": "string",
            "maxLength": 5
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          }
        },
        "required": [
          "city",
          "customer",
          "street",
          "zipCode"
        ]
      },
      "CustomerSiteCreateRequest": {
        "type": "object",
        "properties": {
          "customer": {
            "type": "string",
            "format": "uuid"
          },
          "street": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "city": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "zipCode": {
            "type": "string",
            "minLength": 1,
            "maxLength": 5
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          }
        },
        "required": [
          "city",
          "customer",
          "street",
          "zipCode"
        ]
      },
      "CustomerSiteRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "street": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "city": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "zipCode": {
            "type": "string",
            "minLength": 1,
            "maxLength": 5
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          }
        },
        "required": [
          "city",
          "street",
          "zipCode"
        ]
      },
      "CvUploadRequest": {
        "type": "object",
        "description": "A presigned ``employee_cvs`` upload to attach as the profile's CV.",
        "properties": {
          "storedFileId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "storedFileId"
        ]
      },
      "DiagnosisAcceptRequest": {
        "type": "object",
        "properties": {
          "suggestionId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "suggestionId"
        ]
      },
      "DiagnosisRejectRequest": {
        "type": "object",
        "properties": {
          "reason": {
            "type": "string",
            "minLength": 1
          }
        }
      },
      "DiagnosisReviewer": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "email": {
            "type": "string",
            "format": "email",
            "readOnly": true
          }
        },
        "required": [
          "email",
          "id"
        ]
      },
      "DiagnosisStarted": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "createdAt",
          "id",
          "status"
        ]
      },
      "DiagnosisSuggestion": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "error": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "errorCode": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "description": {
            "type": "string"
          },
          "solution": {
            "type": "string"
          },
          "severity": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/SeverityEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "confidence": {
            "type": "number",
            "format": "double",
            "maximum": 1,
            "minimum": 0
          },
          "serviceNeeded": {
            "type": "boolean"
          },
          "sourceRefs": {}
        },
        "required": [
          "confidence",
          "errorCode",
          "title"
        ]
      },
      "DisabledReasonEnum": {
        "enum": [
          "failing"
        ],
        "type": "string",
        "description": "* `` - Active or switched off by hand\n* `failing` - Deliveries kept failing"
      },
      "Document": {
        "type": "object",
        "description": "Document-ACL contract shared by the KnowledgeItem-backed serializers.\n\nDeclares ``allowed_users``/``allowed_groups``/``acl_version`` (the model's\n``restricted`` flag is picked up from ``Meta.fields``), validates the\nrestricted/is_public exclusion and dispatches an ACL propagation to\nLightRAG whenever an update changes the ACL. The dispatch MUST live here:\n``KnowledgeItemViewSet`` overrides ``update()`` wholesale and calls\n``serializer.save()`` directly, so ``perform_update`` hooks never run.\n\nBecause the documents API applies the same ACL as retrieval\n(``KnowledgeItem.objects.accessible_by``), a non-owner who restricts a document\nwithout granting themselves would lose it from every list right after\nsaving. ``_ensure_actor_keeps_access`` therefore adds the acting user to\n``allowed_users`` in that case — the ACL never locks its author out.",
        "properties": {
          "fileUrl": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "language": {
            "$ref": "#/components/schemas/ContentLanguageEnum"
          },
          "text": {
            "type": [
              "string",
              "null"
            ]
          },
          "hasText": {
            "type": "boolean",
            "readOnly": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "type": "string",
            "readOnly": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/KnowledgeItemStatusEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              },
              {
                "$ref": "#/components/schemas/NullEnum"
              }
            ]
          },
          "origin": {
            "$ref": "#/components/schemas/OriginEnum"
          },
          "aiGenerated": {
            "type": "boolean",
            "readOnly": true,
            "description": "Provenance flag: the text was produced (in whole or in part) by an LLM rather than authored or uploaded by a person, e.g. service report summaries. Read-only via the API."
          },
          "isPublic": {
            "type": "boolean"
          },
          "restricted": {
            "type": "boolean",
            "description": "Restrict knowledge-graph retrieval of this document to allowed_users/allowed_groups (tenant owners and superusers always pass). Independent of is_public, which only controls the anonymous self-service portal."
          },
          "allowedUsers": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "allowedGroups": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "aclVersion": {
            "type": "integer",
            "readOnly": true
          },
          "folderPath": {
            "type": "string",
            "default": "",
            "description": "Frontend-only folder hierarchy, slash-separated. Empty = root.",
            "maxLength": 500
          },
          "inheritedFrom": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "description": "Where this document is inherited from, or None if it is the\nentity's own.\n\nThe map is supplied by the view via the serializer context (see\n``AssetViewSet.documents``); endpoints that do not set it always\nreport ``None``.",
            "readOnly": true
          }
        },
        "required": [
          "aclVersion",
          "aiGenerated",
          "fileUrl",
          "hasText",
          "inheritedFrom",
          "name",
          "origin",
          "type"
        ]
      },
      "DocumentData": {
        "type": "object",
        "properties": {
          "status": {
            "enum": [
              "processing",
              "failed",
              "ocr_ready",
              "ingesting",
              "ingested",
              "ingest_failed"
            ],
            "type": "string",
            "description": "* `processing` - Processing\n* `failed` - Processing Failed\n* `ocr_ready` - OCR Ready\n* `ingesting` - Ingesting\n* `ingested` - Ingested\n* `ingest_failed` - Ingest Failed"
          },
          "object": {
            "enum": [
              "document"
            ],
            "type": "string",
            "description": "Kind of object the event is about.\n\n* `document` - document"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the object; fetch it via the API."
          }
        },
        "required": [
          "id",
          "object",
          "status"
        ]
      },
      "DocumentEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Event id, identical to the `webhook-id` header and stable across retries."
          },
          "type": {
            "enum": [
              "document.processed",
              "document.failed"
            ],
            "type": "string",
            "description": "* `document.processed` - document.processed\n* `document.failed` - document.failed"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "When the event happened."
          },
          "data": {
            "$ref": "#/components/schemas/DocumentData"
          }
        },
        "required": [
          "data",
          "id",
          "timestamp",
          "type"
        ]
      },
      "DocumentRequest": {
        "type": "object",
        "description": "Document-ACL contract shared by the KnowledgeItem-backed serializers.\n\nDeclares ``allowed_users``/``allowed_groups``/``acl_version`` (the model's\n``restricted`` flag is picked up from ``Meta.fields``), validates the\nrestricted/is_public exclusion and dispatches an ACL propagation to\nLightRAG whenever an update changes the ACL. The dispatch MUST live here:\n``KnowledgeItemViewSet`` overrides ``update()`` wholesale and calls\n``serializer.save()`` directly, so ``perform_update`` hooks never run.\n\nBecause the documents API applies the same ACL as retrieval\n(``KnowledgeItem.objects.accessible_by``), a non-owner who restricts a document\nwithout granting themselves would lose it from every list right after\nsaving. ``_ensure_actor_keeps_access`` therefore adds the acting user to\n``allowed_users`` in that case — the ACL never locks its author out.",
        "properties": {
          "fileId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "writeOnly": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "language": {
            "$ref": "#/components/schemas/ContentLanguageEnum"
          },
          "text": {
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/KnowledgeItemStatusEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              },
              {
                "$ref": "#/components/schemas/NullEnum"
              }
            ]
          },
          "origin": {
            "$ref": "#/components/schemas/OriginEnum"
          },
          "isPublic": {
            "type": "boolean"
          },
          "restricted": {
            "type": "boolean",
            "description": "Restrict knowledge-graph retrieval of this document to allowed_users/allowed_groups (tenant owners and superusers always pass). Independent of is_public, which only controls the anonymous self-service portal."
          },
          "allowedUsers": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "allowedGroups": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "assetTypes": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "writeOnly": true
          },
          "assets": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "writeOnly": true
          },
          "folderPath": {
            "type": "string",
            "default": "",
            "description": "Frontend-only folder hierarchy, slash-separated. Empty = root.",
            "maxLength": 500
          }
        },
        "required": [
          "name",
          "origin"
        ]
      },
      "EmployeeAssetType": {
        "type": "object",
        "properties": {
          "assetTypeId": {
            "type": "string",
            "format": "uuid"
          },
          "assetTypeName": {
            "type": "string",
            "readOnly": true
          },
          "level": {
            "$ref": "#/components/schemas/SkillLevelEnum"
          }
        },
        "required": [
          "assetTypeId",
          "assetTypeName"
        ]
      },
      "EmployeeAssetTypeRequest": {
        "type": "object",
        "properties": {
          "assetTypeId": {
            "type": "string",
            "format": "uuid"
          },
          "level": {
            "$ref": "#/components/schemas/SkillLevelEnum"
          }
        },
        "required": [
          "assetTypeId"
        ]
      },
      "EmployeeCertification": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "issuer": {
            "type": "string",
            "maxLength": 200
          },
          "issuedOn": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "expiresOn": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          }
        },
        "required": [
          "id",
          "name"
        ]
      },
      "EmployeeCertificationRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "issuer": {
            "type": "string",
            "maxLength": 200
          },
          "issuedOn": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "expiresOn": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          }
        },
        "required": [
          "name"
        ]
      },
      "EmployeeCvDocument": {
        "type": "object",
        "description": "The uploaded CV: file for the preview, parse status, proposal to review.",
        "properties": {
          "status": {
            "$ref": "#/components/schemas/EmployeeCvDocumentStatusEnum"
          },
          "error": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ErrorEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "proposal": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ]
          },
          "fileName": {
            "type": "string",
            "readOnly": true
          },
          "contentType": {
            "type": "string",
            "readOnly": true
          },
          "sizeBytes": {
            "type": [
              "integer",
              "null"
            ],
            "readOnly": true
          },
          "fileUrl": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "uploadedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "contentType",
          "fileName",
          "fileUrl",
          "sizeBytes",
          "uploadedAt"
        ]
      },
      "EmployeeCvDocumentStatusEnum": {
        "enum": [
          "processing",
          "ready",
          "stored",
          "failed"
        ],
        "type": "string",
        "description": "* `processing` - In Verarbeitung\n* `ready` - Vorschlag bereit\n* `stored` - Gespeichert\n* `failed` - Fehlgeschlagen"
      },
      "EmployeeEducation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "degree": {
            "type": "string",
            "maxLength": 200
          },
          "fieldOfStudy": {
            "type": "string",
            "maxLength": 200
          },
          "institution": {
            "type": "string",
            "maxLength": 200
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "endDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "description": {
            "type": "string",
            "maxLength": 2000
          }
        },
        "required": [
          "degree",
          "id"
        ]
      },
      "EmployeeEducationRequest": {
        "type": "object",
        "properties": {
          "degree": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "fieldOfStudy": {
            "type": "string",
            "maxLength": 200
          },
          "institution": {
            "type": "string",
            "maxLength": 200
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "endDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "description": {
            "type": "string",
            "maxLength": 2000
          }
        },
        "required": [
          "degree"
        ]
      },
      "EmployeeJob": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "company": {
            "type": "string",
            "maxLength": 200
          },
          "location": {
            "type": "string",
            "maxLength": 200
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "endDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "isCurrent": {
            "type": "boolean",
            "readOnly": true
          },
          "description": {
            "type": "string",
            "maxLength": 2000
          }
        },
        "required": [
          "id",
          "isCurrent",
          "title"
        ]
      },
      "EmployeeJobRequest": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "company": {
            "type": "string",
            "maxLength": 200
          },
          "location": {
            "type": "string",
            "maxLength": 200
          },
          "startDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "endDate": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^\\d{4}-\\d{2}$",
            "example": "2024-05"
          },
          "description": {
            "type": "string",
            "maxLength": 2000
          }
        },
        "required": [
          "title"
        ]
      },
      "EmployeeLanguage": {
        "type": "object",
        "properties": {
          "language": {
            "$ref": "#/components/schemas/EmployeeLanguageLanguageEnum"
          },
          "level": {
            "$ref": "#/components/schemas/EmployeeLanguageLevelEnum"
          }
        },
        "required": [
          "language",
          "level"
        ]
      },
      "EmployeeLanguageLanguageEnum": {
        "enum": [
          "af",
          "am",
          "ar",
          "az",
          "be",
          "bg",
          "bn",
          "br",
          "bs",
          "ca",
          "cs",
          "cy",
          "da",
          "de",
          "el",
          "en",
          "es",
          "et",
          "eu",
          "fa",
          "fi",
          "fr",
          "fy",
          "ga",
          "gd",
          "gl",
          "gu",
          "he",
          "hi",
          "hr",
          "ht",
          "hu",
          "hy",
          "id",
          "ig",
          "is",
          "it",
          "ja",
          "ka",
          "kk",
          "km",
          "kn",
          "ko",
          "ku",
          "ky",
          "lb",
          "lo",
          "lt",
          "lv",
          "mk",
          "ml",
          "mn",
          "mr",
          "ms",
          "mt",
          "my",
          "nb",
          "ne",
          "nl",
          "nn",
          "no",
          "os",
          "pa",
          "pl",
          "ps",
          "pt",
          "ro",
          "ru",
          "si",
          "sk",
          "sl",
          "so",
          "sq",
          "sr",
          "sv",
          "sw",
          "ta",
          "te",
          "tg",
          "th",
          "tk",
          "tl",
          "tr",
          "tt",
          "ug",
          "uk",
          "ur",
          "uz",
          "vi",
          "yo",
          "zh",
          "zu"
        ],
        "type": "string",
        "description": "* `af` - af\n* `am` - am\n* `ar` - ar\n* `az` - az\n* `be` - be\n* `bg` - bg\n* `bn` - bn\n* `br` - br\n* `bs` - bs\n* `ca` - ca\n* `cs` - cs\n* `cy` - cy\n* `da` - da\n* `de` - de\n* `el` - el\n* `en` - en\n* `es` - es\n* `et` - et\n* `eu` - eu\n* `fa` - fa\n* `fi` - fi\n* `fr` - fr\n* `fy` - fy\n* `ga` - ga\n* `gd` - gd\n* `gl` - gl\n* `gu` - gu\n* `he` - he\n* `hi` - hi\n* `hr` - hr\n* `ht` - ht\n* `hu` - hu\n* `hy` - hy\n* `id` - id\n* `ig` - ig\n* `is` - is\n* `it` - it\n* `ja` - ja\n* `ka` - ka\n* `kk` - kk\n* `km` - km\n* `kn` - kn\n* `ko` - ko\n* `ku` - ku\n* `ky` - ky\n* `lb` - lb\n* `lo` - lo\n* `lt` - lt\n* `lv` - lv\n* `mk` - mk\n* `ml` - ml\n* `mn` - mn\n* `mr` - mr\n* `ms` - ms\n* `mt` - mt\n* `my` - my\n* `nb` - nb\n* `ne` - ne\n* `nl` - nl\n* `nn` - nn\n* `no` - no\n* `os` - os\n* `pa` - pa\n* `pl` - pl\n* `ps` - ps\n* `pt` - pt\n* `ro` - ro\n* `ru` - ru\n* `si` - si\n* `sk` - sk\n* `sl` - sl\n* `so` - so\n* `sq` - sq\n* `sr` - sr\n* `sv` - sv\n* `sw` - sw\n* `ta` - ta\n* `te` - te\n* `tg` - tg\n* `th` - th\n* `tk` - tk\n* `tl` - tl\n* `tr` - tr\n* `tt` - tt\n* `ug` - ug\n* `uk` - uk\n* `ur` - ur\n* `uz` - uz\n* `vi` - vi\n* `yo` - yo\n* `zh` - zh\n* `zu` - zu"
      },
      "EmployeeLanguageLevelEnum": {
        "enum": [
          "a1",
          "a2",
          "b1",
          "b2",
          "c1",
          "c2",
          "native"
        ],
        "type": "string",
        "description": "* `a1` - A1\n* `a2` - A2\n* `b1` - B1\n* `b2` - B2\n* `c1` - C1\n* `c2` - C2\n* `native` - Muttersprache"
      },
      "EmployeeLanguageRequest": {
        "type": "object",
        "properties": {
          "language": {
            "$ref": "#/components/schemas/EmployeeLanguageLanguageEnum"
          },
          "level": {
            "$ref": "#/components/schemas/EmployeeLanguageLevelEnum"
          }
        },
        "required": [
          "language",
          "level"
        ]
      },
      "EmployeeList": {
        "type": "object",
        "description": "A tenant member in the employee list (``employee_list_queryset`` rows).",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "firstName": {
            "type": "string"
          },
          "lastName": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "roles": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "readOnly": true
          },
          "headline": {
            "type": "string",
            "readOnly": true
          },
          "hasProfile": {
            "type": "boolean"
          },
          "availableForInterviews": {
            "type": "boolean",
            "readOnly": true
          }
        },
        "required": [
          "availableForInterviews",
          "email",
          "firstName",
          "hasProfile",
          "headline",
          "id",
          "lastName",
          "name",
          "roles"
        ]
      },
      "EmployeeProfile": {
        "type": "object",
        "description": "An employee's CV (backoffice view: everything writable).\n\nWriting replaces each list that is part of the payload; the service\n(``EmployeeProfile.update_content``) stores it.",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "readOnly": true
          },
          "email": {
            "type": "string",
            "format": "email",
            "readOnly": true
          },
          "headline": {
            "type": "string",
            "description": "Short role description, e.g. 'Servicetechniker Kältetechnik'.",
            "maxLength": 200
          },
          "phone": {
            "type": "string",
            "maxLength": 50
          },
          "bio": {
            "type": "string",
            "maxLength": 4000
          },
          "availableForInterviews": {
            "type": "boolean",
            "description": "Considered when knowledge gaps are assigned automatically."
          },
          "jobs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeJob"
            }
          },
          "skills": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeSkill"
            }
          },
          "certifications": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeCertification"
            }
          },
          "education": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeEducation"
            }
          },
          "languages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeLanguage"
            }
          },
          "assetTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeAssetType"
            }
          },
          "yearsOfExperience": {
            "type": "integer",
            "readOnly": true
          },
          "hasProfile": {
            "type": "boolean",
            "readOnly": true
          },
          "cvDocument": {
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": {},
            "readOnly": true
          },
          "profileSource": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ProfileSourceEnum"
              }
            ],
            "readOnly": true
          },
          "profileUpdatedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "cvDocument",
          "email",
          "hasProfile",
          "name",
          "profileSource",
          "profileUpdatedAt",
          "userId",
          "yearsOfExperience"
        ]
      },
      "EmployeeSkill": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 60
          },
          "level": {
            "$ref": "#/components/schemas/SkillLevelEnum"
          }
        },
        "required": [
          "name"
        ]
      },
      "EmployeeSkillRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 60
          },
          "level": {
            "$ref": "#/components/schemas/SkillLevelEnum"
          }
        },
        "required": [
          "name"
        ]
      },
      "EntityTypeEnum": {
        "enum": [
          "asset",
          "assettype"
        ],
        "type": "string",
        "description": "* `asset` - asset\n* `assettype` - assettype"
      },
      "ErrorEnum": {
        "enum": [
          "unreadable",
          "extraction_failed",
          "budget"
        ],
        "type": "string",
        "description": "* `unreadable` - Kein Text erkannt\n* `extraction_failed` - Auswertung fehlgeschlagen\n* `budget` - KI-Budget erschöpft"
      },
      "EventTypesEnum": {
        "enum": [
          "form_response.submitted",
          "service_request.created",
          "service_request.status_changed",
          "service_request.closed",
          "service_order.created",
          "service_order.assigned",
          "service_order.completed",
          "service_report.generated",
          "asset.created",
          "asset.updated",
          "asset.deleted",
          "customer.created",
          "customer.updated",
          "customer.deleted",
          "document.processed",
          "document.failed"
        ],
        "type": "string",
        "description": "* `form_response.submitted` - A form was submitted completely, in the backoffice or the self-service portal.\n* `service_request.created` - A service request was filed (portal form, QR quick report, chat hand-off, backoffice, API, monitoring).\n* `service_request.status_changed` - A service request moved to another status (OPEN, IN_PROGRESS, CLOSED).\n* `service_request.closed` - A service request was closed; carries how it was resolved.\n* `service_order.created` - A service order was created for a service request.\n* `service_order.assigned` - A service order was assigned to a (different) technician.\n* `service_order.completed` - A technician completed a service order.\n* `service_report.generated` - The document of a service report was generated and can be downloaded.\n* `asset.created` - An asset was created.\n* `asset.updated` - An asset was changed.\n* `asset.deleted` - An asset was deleted.\n* `customer.created` - A customer was created.\n* `customer.updated` - A customer was changed.\n* `customer.deleted` - A customer was deleted.\n* `document.processed` - A knowledge document was processed and is available to the AI assistant.\n* `document.failed` - Processing a knowledge document failed."
      },
      "FormPopulateEntity": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "type"
        ]
      },
      "FormPopulateRequestRequest": {
        "type": "object",
        "properties": {
          "entityType": {
            "type": "string",
            "minLength": 1
          },
          "entityId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "entityId",
          "entityType"
        ]
      },
      "FormPopulateResult": {
        "type": "object",
        "properties": {
          "template": {
            "$ref": "#/components/schemas/FormTemplate"
          },
          "populatedData": {
            "type": "object",
            "additionalProperties": {}
          },
          "entityInfo": {
            "$ref": "#/components/schemas/FormPopulateEntity"
          }
        },
        "required": [
          "entityInfo",
          "populatedData",
          "template"
        ]
      },
      "FormResponse": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "template": {
            "type": "string",
            "format": "uuid"
          },
          "templateName": {
            "type": "string",
            "readOnly": true
          },
          "templateRevision": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "templateVersion": {
            "type": [
              "integer",
              "null"
            ],
            "readOnly": true
          },
          "responses": {},
          "entityType": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type of entity this response is associated with",
            "maxLength": 50
          },
          "entityId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "ID of the entity this response is associated with"
          },
          "entityObject": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/FormResponseEntity"
              },
              {
                "type": "null"
              }
            ],
            "readOnly": true
          },
          "submissionContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context about how this form was submitted"
          },
          "validationErrors": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Any validation errors that occurred during submission"
          },
          "validationStatus": {
            "type": "string",
            "readOnly": true
          },
          "isComplete": {
            "type": "boolean",
            "description": "Whether all required fields have been filled"
          },
          "knowledgeItems": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KnowledgeItemBrief"
            },
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "entityObject",
          "knowledgeItems",
          "responses",
          "template",
          "templateName",
          "templateRevision",
          "templateVersion",
          "updatedAt",
          "validationStatus"
        ]
      },
      "FormResponseApplied": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          }
        },
        "required": [
          "message"
        ]
      },
      "FormResponseCreate": {
        "type": "object",
        "properties": {
          "template": {
            "type": "string",
            "format": "uuid"
          },
          "responses": {},
          "entityType": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type of entity this response is associated with",
            "maxLength": 50
          },
          "entityId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "ID of the entity this response is associated with"
          },
          "submissionContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context about how this form was submitted"
          }
        },
        "required": [
          "responses",
          "template"
        ]
      },
      "FormResponseCreateRequest": {
        "type": "object",
        "properties": {
          "template": {
            "type": "string",
            "format": "uuid"
          },
          "responses": {},
          "entityType": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type of entity this response is associated with",
            "maxLength": 50
          },
          "entityId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "ID of the entity this response is associated with"
          },
          "submissionContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context about how this form was submitted"
          }
        },
        "required": [
          "responses",
          "template"
        ]
      },
      "FormResponseData": {
        "type": "object",
        "properties": {
          "templateId": {
            "type": "string",
            "format": "uuid",
            "description": "The form template."
          },
          "entityType": {
            "type": [
              "string",
              "null"
            ],
            "description": "What the response is linked to, e.g. `asset`, `service_request`, `service_order`, `service_report`."
          },
          "entityId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Id of the linked object."
          },
          "object": {
            "enum": [
              "form_response"
            ],
            "type": "string",
            "description": "Kind of object the event is about.\n\n* `form_response` - form_response"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the object; fetch it via the API."
          }
        },
        "required": [
          "entityId",
          "entityType",
          "id",
          "object",
          "templateId"
        ]
      },
      "FormResponseEntity": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name",
          "type"
        ]
      },
      "FormResponseEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Event id, identical to the `webhook-id` header and stable across retries."
          },
          "type": {
            "enum": [
              "form_response.submitted"
            ],
            "type": "string",
            "description": "* `form_response.submitted` - form_response.submitted"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "When the event happened."
          },
          "data": {
            "$ref": "#/components/schemas/FormResponseData"
          }
        },
        "required": [
          "data",
          "id",
          "timestamp",
          "type"
        ]
      },
      "FormResponseRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "template": {
            "type": "string",
            "format": "uuid"
          },
          "responses": {},
          "entityType": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type of entity this response is associated with",
            "maxLength": 50
          },
          "entityId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "ID of the entity this response is associated with"
          },
          "submissionContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context about how this form was submitted"
          },
          "validationErrors": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Any validation errors that occurred during submission"
          },
          "isComplete": {
            "type": "boolean",
            "description": "Whether all required fields have been filled"
          }
        },
        "required": [
          "responses",
          "template"
        ]
      },
      "FormSchemaRequest": {
        "type": "object",
        "properties": {
          "schema": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            }
          }
        },
        "required": [
          "schema"
        ]
      },
      "FormSchemaValidation": {
        "type": "object",
        "properties": {
          "valid": {
            "type": "boolean"
          },
          "errors": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "errors",
          "valid"
        ]
      },
      "FormTemplate": {
        "type": "object",
        "properties": {
          "currentVersion": {
            "type": [
              "integer",
              "null"
            ],
            "readOnly": true
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "formType": {
            "$ref": "#/components/schemas/FormTypeEnum"
          },
          "formTypeDisplay": {
            "type": "string",
            "readOnly": true
          },
          "isActive": {
            "type": "boolean",
            "title": "Active"
          },
          "isPublic": {
            "type": "boolean",
            "title": "Öffentlich",
            "description": "If enabled, this form is visible to unauthenticated self-service users"
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. clipboard-list, file-text, settings)",
            "maxLength": 100
          },
          "schema": {
            "title": "FormKit Schema",
            "description": "FormKit JSON Schema definition — single source of truth for form structure"
          },
          "builderMeta": {
            "title": "Builder Metadata",
            "description": "Builder-specific metadata (layout, sections, voice_enabled, submit_label)"
          },
          "entityContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context information for the entity"
          },
          "emailNotificationsEnabled": {
            "type": "boolean",
            "title": "Email Notifications",
            "description": "Send email notifications when a form response is submitted"
          },
          "emailRecipients": {
            "description": "List of email addresses to notify on form submission"
          },
          "usesSchema": {
            "type": "boolean",
            "readOnly": true
          },
          "questionsCount": {
            "type": "integer",
            "readOnly": true
          },
          "entityMappings": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FormTemplateEntityMapping"
            },
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "currentVersion",
          "entityMappings",
          "formType",
          "formTypeDisplay",
          "name",
          "questionsCount",
          "updatedAt",
          "usesSchema"
        ]
      },
      "FormTemplateAssetField": {
        "type": "object",
        "properties": {
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          }
        },
        "required": [
          "key",
          "label"
        ]
      },
      "FormTemplateCreate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "formType": {
            "$ref": "#/components/schemas/FormTypeEnum"
          },
          "isActive": {
            "type": "boolean",
            "title": "Active"
          },
          "isPublic": {
            "type": "boolean",
            "title": "Öffentlich",
            "description": "If enabled, this form is visible to unauthenticated self-service users"
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. clipboard-list, file-text, settings)",
            "maxLength": 100
          },
          "schema": {
            "title": "FormKit Schema",
            "description": "FormKit JSON Schema definition — single source of truth for form structure"
          },
          "builderMeta": {
            "title": "Builder Metadata",
            "description": "Builder-specific metadata (layout, sections, voice_enabled, submit_label)"
          },
          "entityContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context information for the entity"
          },
          "emailNotificationsEnabled": {
            "type": "boolean",
            "title": "Email Notifications",
            "description": "Send email notifications when a form response is submitted"
          },
          "emailRecipients": {
            "description": "List of email addresses to notify on form submission"
          }
        },
        "required": [
          "formType",
          "id",
          "name"
        ]
      },
      "FormTemplateCreateRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "formType": {
            "$ref": "#/components/schemas/FormTypeEnum"
          },
          "isActive": {
            "type": "boolean",
            "title": "Active"
          },
          "isPublic": {
            "type": "boolean",
            "title": "Öffentlich",
            "description": "If enabled, this form is visible to unauthenticated self-service users"
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. clipboard-list, file-text, settings)",
            "maxLength": 100
          },
          "schema": {
            "title": "FormKit Schema",
            "description": "FormKit JSON Schema definition — single source of truth for form structure"
          },
          "builderMeta": {
            "title": "Builder Metadata",
            "description": "Builder-specific metadata (layout, sections, voice_enabled, submit_label)"
          },
          "entityContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context information for the entity"
          },
          "emailNotificationsEnabled": {
            "type": "boolean",
            "title": "Email Notifications",
            "description": "Send email notifications when a form response is submitted"
          },
          "emailRecipients": {
            "description": "List of email addresses to notify on form submission"
          }
        },
        "required": [
          "formType",
          "name"
        ]
      },
      "FormTemplateEntityMapping": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "entityType": {
            "type": "string"
          },
          "entityTypeDisplay": {
            "type": "string"
          },
          "isActive": {
            "type": "boolean"
          }
        },
        "required": [
          "entityType",
          "entityTypeDisplay",
          "id",
          "isActive"
        ]
      },
      "FormTemplateRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "formType": {
            "$ref": "#/components/schemas/FormTypeEnum"
          },
          "isActive": {
            "type": "boolean",
            "title": "Active"
          },
          "isPublic": {
            "type": "boolean",
            "title": "Öffentlich",
            "description": "If enabled, this form is visible to unauthenticated self-service users"
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. clipboard-list, file-text, settings)",
            "maxLength": 100
          },
          "schema": {
            "title": "FormKit Schema",
            "description": "FormKit JSON Schema definition — single source of truth for form structure"
          },
          "builderMeta": {
            "title": "Builder Metadata",
            "description": "Builder-specific metadata (layout, sections, voice_enabled, submit_label)"
          },
          "entityContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context information for the entity"
          },
          "emailNotificationsEnabled": {
            "type": "boolean",
            "title": "Email Notifications",
            "description": "Send email notifications when a form response is submitted"
          },
          "emailRecipients": {
            "description": "List of email addresses to notify on form submission"
          }
        },
        "required": [
          "formType",
          "name"
        ]
      },
      "FormTemplateRevision": {
        "type": "object",
        "description": "A stored django-reversion version of a form template.\n\n``context[\"numbers\"]`` maps version pks to their 1-based number and\n``context[\"current_version\"]`` is the template's current number.",
        "properties": {
          "id": {
            "type": "string",
            "readOnly": true
          },
          "version": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "readOnly": true
          },
          "formType": {
            "type": "string",
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "createdBy": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "createdByName": {
            "type": "string",
            "readOnly": true
          },
          "isCurrent": {
            "type": "boolean",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "createdBy",
          "createdByName",
          "formType",
          "id",
          "isCurrent",
          "name",
          "version"
        ]
      },
      "FormTemplateRevisionDetail": {
        "type": "object",
        "description": "A stored django-reversion version of a form template.\n\n``context[\"numbers\"]`` maps version pks to their 1-based number and\n``context[\"current_version\"]`` is the template's current number.",
        "properties": {
          "id": {
            "type": "string",
            "readOnly": true
          },
          "version": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "readOnly": true
          },
          "formType": {
            "type": "string",
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "createdBy": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "createdByName": {
            "type": "string",
            "readOnly": true
          },
          "isCurrent": {
            "type": "boolean",
            "readOnly": true
          },
          "template": {
            "type": "string",
            "readOnly": true
          },
          "schema": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": {}
            },
            "readOnly": true
          },
          "builderMeta": {
            "type": "object",
            "additionalProperties": {},
            "readOnly": true
          }
        },
        "required": [
          "builderMeta",
          "createdAt",
          "createdBy",
          "createdByName",
          "formType",
          "id",
          "isCurrent",
          "name",
          "schema",
          "template",
          "version"
        ]
      },
      "FormTypeEnum": {
        "enum": [
          "asset",
          "service_order",
          "service_report",
          "service_request"
        ],
        "type": "string",
        "description": "* `asset` - Asset\n* `service_order` - Service Order\n* `service_report` - Service Report\n* `service_request` - Service Request"
      },
      "History": {
        "type": "object",
        "description": "Serialises a queryset of ``reversion.models.Version`` for a single object.\n\nThe serializer must be given the queryset *already ordered from oldest to\nnewest* so that the adjacent-version diff makes sense (``Version.objects\n.get_for_object`` returns newest-first, so callers reverse it).",
        "properties": {
          "id": {
            "type": "integer"
          },
          "revisionId": {
            "type": "integer"
          },
          "user": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "userName": {
            "type": "string",
            "readOnly": true
          },
          "timestamp": {
            "type": "string",
            "format": "date-time"
          },
          "comment": {
            "type": "string"
          },
          "changes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/HistoryChange"
            },
            "readOnly": true
          }
        },
        "required": [
          "changes",
          "comment",
          "id",
          "revisionId",
          "timestamp",
          "user",
          "userName"
        ]
      },
      "HistoryChange": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string"
          },
          "old": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ]
          },
          "new": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "field",
          "new",
          "old"
        ]
      },
      "KnowledgeFolder": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string"
          }
        },
        "required": [
          "path"
        ]
      },
      "KnowledgeItem": {
        "type": "object",
        "description": "Document-ACL contract shared by the KnowledgeItem-backed serializers.\n\nDeclares ``allowed_users``/``allowed_groups``/``acl_version`` (the model's\n``restricted`` flag is picked up from ``Meta.fields``), validates the\nrestricted/is_public exclusion and dispatches an ACL propagation to\nLightRAG whenever an update changes the ACL. The dispatch MUST live here:\n``KnowledgeItemViewSet`` overrides ``update()`` wholesale and calls\n``serializer.save()`` directly, so ``perform_update`` hooks never run.\n\nBecause the documents API applies the same ACL as retrieval\n(``KnowledgeItem.objects.accessible_by``), a non-owner who restricts a document\nwithout granting themselves would lose it from every list right after\nsaving. ``_ensure_actor_keeps_access`` therefore adds the acting user to\n``allowed_users`` in that case — the ACL never locks its author out.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "language": {
            "$ref": "#/components/schemas/ContentLanguageEnum"
          },
          "type": {
            "type": "string",
            "readOnly": true
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/KnowledgeItemStatusEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              },
              {
                "$ref": "#/components/schemas/NullEnum"
              }
            ]
          },
          "validatedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "validatedBy": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "readOnly": true
          },
          "assignedTo": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "assignedToUser": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/KnowledgeItemAssignee"
              },
              {
                "type": "null"
              }
            ],
            "readOnly": true
          },
          "isPublic": {
            "type": "boolean"
          },
          "restricted": {
            "type": "boolean",
            "description": "Restrict knowledge-graph retrieval of this document to allowed_users/allowed_groups (tenant owners and superusers always pass). Independent of is_public, which only controls the anonymous self-service portal."
          },
          "allowedUsers": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "allowedGroups": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "aclVersion": {
            "type": "integer",
            "readOnly": true
          },
          "origin": {
            "allOf": [
              {
                "$ref": "#/components/schemas/OriginEnum"
              }
            ],
            "default": "other"
          },
          "aiGenerated": {
            "type": "boolean",
            "readOnly": true,
            "description": "Provenance flag: the text was produced (in whole or in part) by an LLM rather than authored or uploaded by a person, e.g. service report summaries. Read-only via the API."
          },
          "fileUrl": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "thumbnailUrl": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "durationSeconds": {
            "type": [
              "integer",
              "null"
            ],
            "maximum": 2147483647,
            "minimum": 0
          },
          "text": {
            "type": [
              "string",
              "null"
            ]
          },
          "hasText": {
            "type": "boolean",
            "readOnly": true
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "relatedObjects": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/KnowledgeItemRelatedObject"
            },
            "readOnly": true
          },
          "myProgress": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/VideoWatchProgress"
              },
              {
                "type": "null"
              }
            ],
            "readOnly": true
          },
          "deletedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Timestamp when all relations were removed. Document will be permanently deleted 30 days after this date."
          },
          "folderPath": {
            "type": "string",
            "default": "",
            "description": "Frontend-only folder hierarchy, slash-separated. Empty = root.",
            "maxLength": 500
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "aclVersion",
          "aiGenerated",
          "assignedToUser",
          "createdAt",
          "fileUrl",
          "hasText",
          "myProgress",
          "name",
          "relatedObjects",
          "thumbnailUrl",
          "type",
          "updatedAt",
          "validatedBy"
        ]
      },
      "KnowledgeItemAssignRequest": {
        "type": "object",
        "properties": {
          "userId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "userId"
        ]
      },
      "KnowledgeItemAssigned": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "assignedTo": {
            "$ref": "#/components/schemas/KnowledgeItemAssignedUser"
          }
        },
        "required": [
          "assignedTo",
          "message"
        ]
      },
      "KnowledgeItemAssignedUser": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "email": {
            "type": "string",
            "format": "email"
          }
        },
        "required": [
          "email",
          "id"
        ]
      },
      "KnowledgeItemAssignee": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "email": {
            "type": "string",
            "format": "email"
          },
          "fullName": {
            "type": "string"
          }
        },
        "required": [
          "email",
          "fullName",
          "id"
        ]
      },
      "KnowledgeItemBrief": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "readOnly": true
          },
          "type": {
            "type": "string",
            "readOnly": true
          },
          "status": {
            "type": "string",
            "readOnly": true
          },
          "fileUrl": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "fileUrl",
          "id",
          "name",
          "status",
          "type"
        ]
      },
      "KnowledgeItemMoveRequest": {
        "type": "object",
        "properties": {
          "folderPath": {
            "type": "string",
            "default": "",
            "description": "Empty string = root folder."
          }
        }
      },
      "KnowledgeItemProcessingStatus": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "hasText": {
            "type": "boolean"
          },
          "hasFile": {
            "type": "boolean"
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        },
        "required": [
          "createdAt",
          "hasFile",
          "hasText",
          "id",
          "name",
          "status",
          "summary",
          "updatedAt"
        ]
      },
      "KnowledgeItemRelatedObject": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "type": {
            "type": "string"
          },
          "appLabel": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "appLabel",
          "id",
          "name",
          "type"
        ]
      },
      "KnowledgeItemRequest": {
        "type": "object",
        "description": "Document-ACL contract shared by the KnowledgeItem-backed serializers.\n\nDeclares ``allowed_users``/``allowed_groups``/``acl_version`` (the model's\n``restricted`` flag is picked up from ``Meta.fields``), validates the\nrestricted/is_public exclusion and dispatches an ACL propagation to\nLightRAG whenever an update changes the ACL. The dispatch MUST live here:\n``KnowledgeItemViewSet`` overrides ``update()`` wholesale and calls\n``serializer.save()`` directly, so ``perform_update`` hooks never run.\n\nBecause the documents API applies the same ACL as retrieval\n(``KnowledgeItem.objects.accessible_by``), a non-owner who restricts a document\nwithout granting themselves would lose it from every list right after\nsaving. ``_ensure_actor_keeps_access`` therefore adds the acting user to\n``allowed_users`` in that case — the ACL never locks its author out.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "language": {
            "$ref": "#/components/schemas/ContentLanguageEnum"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/KnowledgeItemStatusEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              },
              {
                "$ref": "#/components/schemas/NullEnum"
              }
            ]
          },
          "validatedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "assignedTo": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "isPublic": {
            "type": "boolean"
          },
          "restricted": {
            "type": "boolean",
            "description": "Restrict knowledge-graph retrieval of this document to allowed_users/allowed_groups (tenant owners and superusers always pass). Independent of is_public, which only controls the anonymous self-service portal."
          },
          "allowedUsers": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "allowedGroups": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "origin": {
            "allOf": [
              {
                "$ref": "#/components/schemas/OriginEnum"
              }
            ],
            "default": "other"
          },
          "fileId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "writeOnly": true
          },
          "thumbnailId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "writeOnly": true
          },
          "durationSeconds": {
            "type": [
              "integer",
              "null"
            ],
            "maximum": 2147483647,
            "minimum": 0
          },
          "text": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "deletedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Timestamp when all relations were removed. Document will be permanently deleted 30 days after this date."
          },
          "folderPath": {
            "type": "string",
            "default": "",
            "description": "Frontend-only folder hierarchy, slash-separated. Empty = root.",
            "maxLength": 500
          },
          "autoIngest": {
            "type": "boolean",
            "writeOnly": true,
            "default": false
          }
        },
        "required": [
          "name"
        ]
      },
      "KnowledgeItemStatusEnum": {
        "enum": [
          "processing",
          "failed",
          "ocr_ready",
          "ingesting",
          "ingested",
          "ingest_failed"
        ],
        "type": "string",
        "description": "* `processing` - Processing\n* `failed` - Processing Failed\n* `ocr_ready` - OCR Ready\n* `ingesting` - Ingesting\n* `ingested` - Ingested\n* `ingest_failed` - Ingest Failed"
      },
      "KnowledgeItemUnassigned": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          }
        },
        "required": [
          "message"
        ]
      },
      "KnowledgeItemsLinkRequest": {
        "type": "object",
        "properties": {
          "knowledgeItemIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "maxItems": 200
          },
          "entityType": {
            "$ref": "#/components/schemas/EntityTypeEnum"
          },
          "entityId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "entityId",
          "entityType",
          "knowledgeItemIds"
        ]
      },
      "KnowledgeItemsLinked": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "assignedCount": {
            "type": "integer"
          }
        },
        "required": [
          "assignedCount",
          "message"
        ]
      },
      "LanguagesEnum": {
        "enum": [
          "de",
          "en"
        ],
        "type": "string",
        "description": "* `de` - de\n* `en` - en"
      },
      "Message": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          }
        },
        "required": [
          "message"
        ]
      },
      "ModeEnum": {
        "enum": [
          "ocr",
          "ocr_ingest",
          "ingest"
        ],
        "type": "string",
        "description": "* `ocr` - ocr\n* `ocr_ingest` - ocr_ingest\n* `ingest` - ingest"
      },
      "MonitoringIntervalDocument": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "id",
          "name",
          "type"
        ]
      },
      "NullEnum": {
        "type": "null"
      },
      "OcrEngineEnum": {
        "enum": [
          "rapidocr",
          "tesseract"
        ],
        "type": "string",
        "description": "* `rapidocr` - RapidOCR\n* `tesseract` - Tesseract"
      },
      "OcrRequestRequest": {
        "type": "object",
        "properties": {
          "ingest": {
            "type": "boolean"
          },
          "advanced": {
            "$ref": "#/components/schemas/AdvancedOcrOptionsRequest"
          }
        }
      },
      "OriginEnum": {
        "enum": [
          "gdrive",
          "dropbox",
          "onedrive",
          "email",
          "form",
          "import",
          "other"
        ],
        "type": "string",
        "description": "* `gdrive` - Google Drive\n* `dropbox` - Dropbox\n* `onedrive` - OneDrive\n* `email` - Email\n* `form` - Form Submission\n* `import` - Import\n* `other` - Other"
      },
      "OutcomeEnum": {
        "enum": [
          "solved",
          "not_solved",
          "escalated"
        ],
        "type": "string",
        "description": "* `solved` - Solved\n* `not_solved` - Not solved\n* `escalated` - Escalated to a service request"
      },
      "PaginatedAssetList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Asset"
            }
          }
        }
      },
      "PaginatedAssetStructureNodeList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssetStructureNode"
            }
          }
        }
      },
      "PaginatedCustomerAssetList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CustomerAsset"
            }
          }
        }
      },
      "PaginatedCustomerList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Customer"
            }
          }
        }
      },
      "PaginatedDocumentList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Document"
            }
          }
        }
      },
      "PaginatedEmployeeListList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeList"
            }
          }
        }
      },
      "PaginatedHistoryList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/History"
            }
          }
        }
      },
      "PaginatedServiceOrderList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceOrder"
            }
          }
        }
      },
      "PaginatedServicePartnerList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServicePartner"
            }
          }
        }
      },
      "PaginatedWebhookDeliveryList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookDelivery"
            }
          }
        }
      },
      "PaginatedWebhookEndpointList": {
        "type": "object",
        "required": [
          "count",
          "next",
          "previous",
          "results"
        ],
        "properties": {
          "count": {
            "type": "integer",
            "description": "Number of matching objects across all pages.",
            "example": 123
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the next page, `null` on the last page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=50"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "description": "URL of the previous page, `null` on the first page.",
            "example": "https://acme.api.intuaid.com/api/assets/?limit=25&offset=0"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/WebhookEndpoint"
            }
          }
        }
      },
      "PatchedAssetRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "parent": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Asset this one is built into; its type must contain this type."
          },
          "monitoringIntervals": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AssetMonitoringIntervalRequest"
            }
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "serialNumber": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "customMetadataOverview": {
            "description": "Per-asset values for overview fields (non-reserved keys)"
          },
          "customMetadata": {
            "description": "Custom metadata for dynamic form fields"
          },
          "selfServicePublic": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Override for self-service visibility. NULL inherits from the next level (asset type / tenant default)."
          }
        }
      },
      "PatchedAssetTypeRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. factory, cog, cpu); empty uses the default.",
            "maxLength": 100
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "productData": {
            "description": "Product-specific data and configuration"
          },
          "overviewData": {
            "description": "Ordered overview fields: key + display label; serial_number is a reserved key."
          },
          "selfServiceSettings": {
            "description": "Self-service portal settings: visibility toggles, replacement parts URL, contact override."
          },
          "selfServicePublic": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Override for self-service visibility. NULL inherits from the next level (asset type / tenant default)."
          },
          "labelSettings": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Per-type label settings override. NULL inherits the tenant label settings."
          },
          "faq": {
            "description": "Ordered FAQ entries: [{'question': str, 'answer': str}, ...]"
          },
          "tutorials": {
            "description": "Ordered list of Video knowledge-item ids shown as self-service tutorials."
          }
        }
      },
      "PatchedCustomerAssetUpdateRequest": {
        "type": "object",
        "description": "Writable serializer for progressively assigning asset/site to a QR code.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "asset": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "site": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "details": {
            "description": "Customer-specific device details (e.g. purchase date, warranty) as ordered entries: [{'label': str, 'value': str}, ...]"
          },
          "customer": {
            "type": "string",
            "format": "uuid",
            "writeOnly": true
          },
          "printed": {
            "type": "boolean"
          }
        }
      },
      "PatchedCustomerRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "email": {
            "type": "string",
            "format": "email",
            "minLength": 1,
            "maxLength": 254
          },
          "phone": {
            "type": "string",
            "maxLength": 30
          },
          "street": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "city": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "zipCode": {
            "type": "string",
            "minLength": 1,
            "maxLength": 5
          }
        }
      },
      "PatchedCustomerSiteRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "street": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "city": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "zipCode": {
            "type": "string",
            "minLength": 1,
            "maxLength": 5
          },
          "name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          }
        }
      },
      "PatchedDocumentRequest": {
        "type": "object",
        "description": "Document-ACL contract shared by the KnowledgeItem-backed serializers.\n\nDeclares ``allowed_users``/``allowed_groups``/``acl_version`` (the model's\n``restricted`` flag is picked up from ``Meta.fields``), validates the\nrestricted/is_public exclusion and dispatches an ACL propagation to\nLightRAG whenever an update changes the ACL. The dispatch MUST live here:\n``KnowledgeItemViewSet`` overrides ``update()`` wholesale and calls\n``serializer.save()`` directly, so ``perform_update`` hooks never run.\n\nBecause the documents API applies the same ACL as retrieval\n(``KnowledgeItem.objects.accessible_by``), a non-owner who restricts a document\nwithout granting themselves would lose it from every list right after\nsaving. ``_ensure_actor_keeps_access`` therefore adds the acting user to\n``allowed_users`` in that case — the ACL never locks its author out.",
        "properties": {
          "fileId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "writeOnly": true
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "language": {
            "$ref": "#/components/schemas/ContentLanguageEnum"
          },
          "text": {
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/KnowledgeItemStatusEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              },
              {
                "$ref": "#/components/schemas/NullEnum"
              }
            ]
          },
          "origin": {
            "$ref": "#/components/schemas/OriginEnum"
          },
          "isPublic": {
            "type": "boolean"
          },
          "restricted": {
            "type": "boolean",
            "description": "Restrict knowledge-graph retrieval of this document to allowed_users/allowed_groups (tenant owners and superusers always pass). Independent of is_public, which only controls the anonymous self-service portal."
          },
          "allowedUsers": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "allowedGroups": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "assetTypes": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "writeOnly": true
          },
          "assets": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            },
            "writeOnly": true
          },
          "folderPath": {
            "type": "string",
            "default": "",
            "description": "Frontend-only folder hierarchy, slash-separated. Empty = root.",
            "maxLength": 500
          }
        }
      },
      "PatchedEmployeeProfileRequest": {
        "type": "object",
        "description": "An employee's CV (backoffice view: everything writable).\n\nWriting replaces each list that is part of the payload; the service\n(``EmployeeProfile.update_content``) stores it.",
        "properties": {
          "headline": {
            "type": "string",
            "description": "Short role description, e.g. 'Servicetechniker Kältetechnik'.",
            "maxLength": 200
          },
          "phone": {
            "type": "string",
            "maxLength": 50
          },
          "bio": {
            "type": "string",
            "maxLength": 4000
          },
          "availableForInterviews": {
            "type": "boolean",
            "description": "Considered when knowledge gaps are assigned automatically."
          },
          "jobs": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeJobRequest"
            }
          },
          "skills": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeSkillRequest"
            }
          },
          "certifications": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeCertificationRequest"
            }
          },
          "education": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeEducationRequest"
            }
          },
          "languages": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeLanguageRequest"
            }
          },
          "assetTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EmployeeAssetTypeRequest"
            }
          }
        }
      },
      "PatchedFormResponseRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "template": {
            "type": "string",
            "format": "uuid"
          },
          "responses": {},
          "entityType": {
            "type": [
              "string",
              "null"
            ],
            "description": "Type of entity this response is associated with",
            "maxLength": 50
          },
          "entityId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "ID of the entity this response is associated with"
          },
          "submissionContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context about how this form was submitted"
          },
          "validationErrors": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Any validation errors that occurred during submission"
          },
          "isComplete": {
            "type": "boolean",
            "description": "Whether all required fields have been filled"
          }
        }
      },
      "PatchedFormTemplateRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "formType": {
            "$ref": "#/components/schemas/FormTypeEnum"
          },
          "isActive": {
            "type": "boolean",
            "title": "Active"
          },
          "isPublic": {
            "type": "boolean",
            "title": "Öffentlich",
            "description": "If enabled, this form is visible to unauthenticated self-service users"
          },
          "icon": {
            "type": "string",
            "description": "Lucide icon name (e.g. clipboard-list, file-text, settings)",
            "maxLength": 100
          },
          "schema": {
            "title": "FormKit Schema",
            "description": "FormKit JSON Schema definition — single source of truth for form structure"
          },
          "builderMeta": {
            "title": "Builder Metadata",
            "description": "Builder-specific metadata (layout, sections, voice_enabled, submit_label)"
          },
          "entityContext": {
            "oneOf": [
              {},
              {
                "type": "null"
              }
            ],
            "description": "Additional context information for the entity"
          },
          "emailNotificationsEnabled": {
            "type": "boolean",
            "title": "Email Notifications",
            "description": "Send email notifications when a form response is submitted"
          },
          "emailRecipients": {
            "description": "List of email addresses to notify on form submission"
          }
        }
      },
      "PatchedKnowledgeItemRequest": {
        "type": "object",
        "description": "Document-ACL contract shared by the KnowledgeItem-backed serializers.\n\nDeclares ``allowed_users``/``allowed_groups``/``acl_version`` (the model's\n``restricted`` flag is picked up from ``Meta.fields``), validates the\nrestricted/is_public exclusion and dispatches an ACL propagation to\nLightRAG whenever an update changes the ACL. The dispatch MUST live here:\n``KnowledgeItemViewSet`` overrides ``update()`` wholesale and calls\n``serializer.save()`` directly, so ``perform_update`` hooks never run.\n\nBecause the documents API applies the same ACL as retrieval\n(``KnowledgeItem.objects.accessible_by``), a non-owner who restricts a document\nwithout granting themselves would lose it from every list right after\nsaving. ``_ensure_actor_keeps_access`` therefore adds the acting user to\n``allowed_users`` in that case — the ACL never locks its author out.",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "language": {
            "$ref": "#/components/schemas/ContentLanguageEnum"
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "status": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/KnowledgeItemStatusEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              },
              {
                "$ref": "#/components/schemas/NullEnum"
              }
            ]
          },
          "validatedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "assignedTo": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "isPublic": {
            "type": "boolean"
          },
          "restricted": {
            "type": "boolean",
            "description": "Restrict knowledge-graph retrieval of this document to allowed_users/allowed_groups (tenant owners and superusers always pass). Independent of is_public, which only controls the anonymous self-service portal."
          },
          "allowedUsers": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          },
          "allowedGroups": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          },
          "origin": {
            "allOf": [
              {
                "$ref": "#/components/schemas/OriginEnum"
              }
            ],
            "default": "other"
          },
          "fileId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "writeOnly": true
          },
          "thumbnailId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "writeOnly": true
          },
          "durationSeconds": {
            "type": [
              "integer",
              "null"
            ],
            "maximum": 2147483647,
            "minimum": 0
          },
          "text": {
            "type": [
              "string",
              "null"
            ]
          },
          "summary": {
            "type": [
              "string",
              "null"
            ]
          },
          "deletedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "description": "Timestamp when all relations were removed. Document will be permanently deleted 30 days after this date."
          },
          "folderPath": {
            "type": "string",
            "default": "",
            "description": "Frontend-only folder hierarchy, slash-separated. Empty = root.",
            "maxLength": 500
          },
          "autoIngest": {
            "type": "boolean",
            "writeOnly": true,
            "default": false
          }
        }
      },
      "PatchedServiceOrderRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "technician": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "formTemplateIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "writeOnly": true
            },
            "writeOnly": true
          },
          "description": {
            "type": "string",
            "minLength": 1
          },
          "scheduledBegin": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "scheduledEnd": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "startedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "onSite": {
            "type": "boolean",
            "description": "False when the job was done remotely."
          },
          "firstTimeFix": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Technician's answer whether the fault was fixed on this first visit; null = not asked (the KPI derives it then)."
          },
          "workMinutes": {
            "type": [
              "integer",
              "null"
            ],
            "maximum": 2147483647,
            "minimum": 0
          },
          "travelMinutes": {
            "type": [
              "integer",
              "null"
            ],
            "maximum": 2147483647,
            "minimum": 0
          },
          "briefing": {
            "type": "string",
            "description": "Cached AI briefing for the order: what to expect, from the request, recent reports and most common errors for the asset."
          },
          "briefingGeneratedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "monitoringInterval": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Monitoring interval this inspection order was auto-created for; completing the order resets that interval."
          }
        }
      },
      "PatchedServicePartnerRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "email": {
            "oneOf": [
              {
                "type": [
                  "string",
                  "null"
                ],
                "format": "email",
                "maxLength": 254
              },
              {
                "type": "string",
                "maxLength": 0
              }
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "street": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "zipCode": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 5
          },
          "website": {
            "oneOf": [
              {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uri",
                "maxLength": 200
              },
              {
                "type": "string",
                "maxLength": 0
              }
            ]
          }
        }
      },
      "PatchedServiceRequestRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "error": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "description": {
            "type": "string",
            "minLength": 1
          },
          "needsTriage": {
            "type": "boolean"
          },
          "severity": {
            "$ref": "#/components/schemas/SeverityEnum"
          },
          "status": {
            "$ref": "#/components/schemas/ServiceRequestStatusEnum"
          },
          "resolution": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ResolutionEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          }
        }
      },
      "PatchedWebhookEndpointRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "maxLength": 2048
          },
          "description": {
            "type": "string",
            "maxLength": 255
          },
          "eventTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventTypesEnum"
            },
            "description": "Event types delivered to this endpoint."
          },
          "isActive": {
            "type": "boolean"
          }
        }
      },
      "PingData": {
        "type": "object",
        "properties": {
          "object": {
            "enum": [
              "webhook_endpoint"
            ],
            "type": "string",
            "description": "Kind of object the event is about.\n\n* `webhook_endpoint` - webhook_endpoint"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the object; fetch it via the API."
          }
        },
        "required": [
          "id",
          "object"
        ]
      },
      "PingEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Event id, identical to the `webhook-id` header and stable across retries."
          },
          "type": {
            "enum": [
              "webhook.ping"
            ],
            "type": "string",
            "description": "* `webhook.ping` - webhook.ping"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "When the event happened."
          },
          "data": {
            "$ref": "#/components/schemas/PingData"
          }
        },
        "required": [
          "data",
          "id",
          "timestamp",
          "type"
        ]
      },
      "PresignedUpload": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "uploadUrl": {
            "type": "string",
            "format": "uri"
          },
          "fileUrl": {
            "type": "string",
            "format": "uri"
          }
        },
        "required": [
          "fileUrl",
          "id",
          "uploadUrl"
        ]
      },
      "PresignedUrlRequestRequest": {
        "type": "object",
        "properties": {
          "filename": {
            "type": "string",
            "minLength": 1,
            "maxLength": 255
          },
          "category": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CategoryEnum"
              }
            ],
            "default": "documents"
          },
          "folderPath": {
            "type": "string",
            "default": "",
            "maxLength": 500
          },
          "contentType": {
            "type": "string",
            "default": "",
            "maxLength": 255
          },
          "sizeBytes": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0
          }
        },
        "required": [
          "filename"
        ]
      },
      "ProcessingQueued": {
        "type": "object",
        "properties": {
          "message": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "info": {
            "type": "string"
          }
        },
        "required": [
          "message",
          "status"
        ]
      },
      "ProfileSourceEnum": {
        "enum": [
          "admin",
          "self",
          "assistant"
        ],
        "type": "string",
        "description": "* `admin` - Backoffice\n* `self` - Mitarbeiter (Portal)\n* `assistant` - Mitarbeiter (Chat mit Alex)"
      },
      "ProviderEnum": {
        "enum": [
          "faster_whisper",
          "speechmatics"
        ],
        "type": "string",
        "description": "* `faster_whisper` - Faster Whisper\n* `speechmatics` - Speechmatics"
      },
      "RatingEnum": {
        "enum": [
          "up",
          "down"
        ],
        "type": "string",
        "description": "* `up` - Thumbs Up\n* `down` - Thumbs Down"
      },
      "ResetAnchorEnum": {
        "enum": [
          "completion",
          "due_date"
        ],
        "type": "string",
        "description": "* `completion` - Ab Erledigungsdatum\n* `due_date` - Ab Fälligkeitsdatum"
      },
      "ResolutionEnum": {
        "enum": [
          "on_site",
          "remote",
          "self_service",
          "no_action",
          "duplicate"
        ],
        "type": "string",
        "description": "* `on_site` - On-site visit\n* `remote` - Remote support\n* `self_service` - Solved by the customer (self-service)\n* `no_action` - No action needed\n* `duplicate` - Duplicate"
      },
      "ReviewActionEnum": {
        "enum": [
          "ACCEPTED",
          "REJECTED"
        ],
        "type": "string",
        "description": "* `ACCEPTED` - Accepted\n* `REJECTED` - Rejected"
      },
      "RoleEnum": {
        "enum": [
          "user",
          "system",
          "assistant",
          "file",
          "info"
        ],
        "type": "string",
        "description": "* `user` - User\n* `system` - System\n* `assistant` - Assistant\n* `file` - File\n* `info` - Info"
      },
      "ServiceOrder": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "reports": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceReport"
            },
            "readOnly": true
          },
          "request": {
            "allOf": [
              {
                "$ref": "#/components/schemas/ServiceRequest"
              }
            ],
            "readOnly": true
          },
          "technician": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "formTemplates": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ServiceOrderFormTemplate"
            },
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "description": {
            "type": "string"
          },
          "scheduledBegin": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "scheduledEnd": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "startedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "onSite": {
            "type": "boolean",
            "description": "False when the job was done remotely."
          },
          "firstTimeFix": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Technician's answer whether the fault was fixed on this first visit; null = not asked (the KPI derives it then)."
          },
          "workMinutes": {
            "type": [
              "integer",
              "null"
            ],
            "maximum": 2147483647,
            "minimum": 0
          },
          "travelMinutes": {
            "type": [
              "integer",
              "null"
            ],
            "maximum": 2147483647,
            "minimum": 0
          },
          "briefing": {
            "type": "string",
            "description": "Cached AI briefing for the order: what to expect, from the request, recent reports and most common errors for the asset."
          },
          "briefingGeneratedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "monitoringInterval": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Monitoring interval this inspection order was auto-created for; completing the order resets that interval."
          },
          "followUpOf": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "description",
          "followUpOf",
          "formTemplates",
          "reports",
          "request",
          "updatedAt"
        ]
      },
      "ServiceOrderBriefing": {
        "type": "object",
        "properties": {
          "briefing": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "briefing"
        ]
      },
      "ServiceOrderCreate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "serviceRequest": {
            "type": "string",
            "format": "uuid"
          },
          "technician": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "description": {
            "type": "string"
          },
          "scheduledBegin": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "scheduledEnd": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        },
        "required": [
          "description"
        ]
      },
      "ServiceOrderCreateRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "serviceRequest": {
            "type": "string",
            "format": "uuid"
          },
          "customerAsset": {
            "type": "string",
            "format": "uuid",
            "writeOnly": true
          },
          "severity": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SeverityEnum"
              }
            ],
            "writeOnly": true,
            "default": "LOW"
          },
          "technician": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "description": {
            "type": "string",
            "minLength": 1
          },
          "scheduledBegin": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "scheduledEnd": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "formTemplateIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "writeOnly": true
            },
            "writeOnly": true
          }
        },
        "required": [
          "description"
        ]
      },
      "ServiceOrderData": {
        "type": "object",
        "properties": {
          "serviceRequestId": {
            "type": "string",
            "format": "uuid",
            "description": "The service request of the order."
          },
          "technicianId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "The assigned technician (user id); absent on completion."
          },
          "completedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Only on `service_order.completed`."
          },
          "followUpOrderId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Only on `service_order.completed`: the follow-up order created because the fault was not fixed on this visit."
          },
          "object": {
            "enum": [
              "service_order"
            ],
            "type": "string",
            "description": "Kind of object the event is about.\n\n* `service_order` - service_order"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the object; fetch it via the API."
          }
        },
        "required": [
          "id",
          "object",
          "serviceRequestId"
        ]
      },
      "ServiceOrderEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Event id, identical to the `webhook-id` header and stable across retries."
          },
          "type": {
            "enum": [
              "service_order.created",
              "service_order.assigned",
              "service_order.completed"
            ],
            "type": "string",
            "description": "* `service_order.created` - service_order.created\n* `service_order.assigned` - service_order.assigned\n* `service_order.completed` - service_order.completed"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "When the event happened."
          },
          "data": {
            "$ref": "#/components/schemas/ServiceOrderData"
          }
        },
        "required": [
          "data",
          "id",
          "timestamp",
          "type"
        ]
      },
      "ServiceOrderFormTemplate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string"
          },
          "formType": {
            "type": "string"
          },
          "icon": {
            "type": "string"
          },
          "isFilled": {
            "type": "boolean"
          },
          "formResponseId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          }
        },
        "required": [
          "formResponseId",
          "formType",
          "icon",
          "id",
          "isFilled",
          "name"
        ]
      },
      "ServiceOrderPresets": {
        "type": "object",
        "properties": {
          "technician": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Assignee"
              }
            ],
            "readOnly": true
          },
          "description": {
            "type": "string"
          },
          "scheduledBegin": {
            "type": "string",
            "format": "date-time"
          },
          "scheduledEnd": {
            "type": "string",
            "format": "date-time"
          },
          "estimatedDuration": {
            "type": "integer"
          }
        },
        "required": [
          "description",
          "scheduledBegin",
          "scheduledEnd",
          "technician"
        ]
      },
      "ServiceOrderRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "technician": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "formTemplateIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid",
              "writeOnly": true
            },
            "writeOnly": true
          },
          "description": {
            "type": "string",
            "minLength": 1
          },
          "scheduledBegin": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "scheduledEnd": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "startedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "completedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "onSite": {
            "type": "boolean",
            "description": "False when the job was done remotely."
          },
          "firstTimeFix": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Technician's answer whether the fault was fixed on this first visit; null = not asked (the KPI derives it then)."
          },
          "workMinutes": {
            "type": [
              "integer",
              "null"
            ],
            "maximum": 2147483647,
            "minimum": 0
          },
          "travelMinutes": {
            "type": [
              "integer",
              "null"
            ],
            "maximum": 2147483647,
            "minimum": 0
          },
          "briefing": {
            "type": "string",
            "description": "Cached AI briefing for the order: what to expect, from the request, recent reports and most common errors for the asset."
          },
          "briefingGeneratedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "monitoringInterval": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Monitoring interval this inspection order was auto-created for; completing the order resets that interval."
          }
        },
        "required": [
          "description"
        ]
      },
      "ServicePartner": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "maxLength": 100
          },
          "email": {
            "oneOf": [
              {
                "type": [
                  "string",
                  "null"
                ],
                "format": "email",
                "maxLength": 254
              },
              {
                "type": "string",
                "maxLength": 0
              }
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "street": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "zipCode": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 5
          },
          "website": {
            "oneOf": [
              {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uri",
                "maxLength": 200
              },
              {
                "type": "string",
                "maxLength": 0
              }
            ]
          },
          "assets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Asset"
            },
            "readOnly": true
          },
          "members": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Assignee"
            },
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "assets",
          "createdAt",
          "members",
          "name",
          "updatedAt"
        ]
      },
      "ServicePartnerCertification": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "name": {
            "type": "string",
            "maxLength": 200
          },
          "fileUrl": {
            "type": "string",
            "maxLength": 1024
          },
          "validUntil": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          },
          "uploadedByEmail": {
            "type": "string",
            "format": "email",
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "fileUrl",
          "id",
          "name",
          "updatedAt",
          "uploadedByEmail"
        ]
      },
      "ServicePartnerCertificationRequest": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          },
          "fileUrl": {
            "type": "string",
            "minLength": 1,
            "maxLength": 1024
          },
          "validUntil": {
            "type": [
              "string",
              "null"
            ],
            "format": "date"
          }
        },
        "required": [
          "fileUrl",
          "name"
        ]
      },
      "ServicePartnerIdRequest": {
        "type": "object",
        "properties": {
          "servicePartnerId": {
            "type": "string",
            "format": "uuid"
          }
        },
        "required": [
          "servicePartnerId"
        ]
      },
      "ServicePartnerIdsRequest": {
        "type": "object",
        "properties": {
          "servicePartnerIds": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uuid"
            }
          }
        },
        "required": [
          "servicePartnerIds"
        ]
      },
      "ServicePartnerRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "name": {
            "type": "string",
            "minLength": 1,
            "maxLength": 100
          },
          "email": {
            "oneOf": [
              {
                "type": [
                  "string",
                  "null"
                ],
                "format": "email",
                "maxLength": 254
              },
              {
                "type": "string",
                "maxLength": 0
              }
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "street": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "zipCode": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 5
          },
          "website": {
            "oneOf": [
              {
                "type": [
                  "string",
                  "null"
                ],
                "format": "uri",
                "maxLength": 200
              },
              {
                "type": "string",
                "maxLength": 0
              }
            ]
          }
        },
        "required": [
          "name"
        ]
      },
      "ServiceReport": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "serviceOrder": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "descriptionAiGenerated": {
            "type": "boolean",
            "readOnly": true
          },
          "document": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "voiceRecording": {
            "type": [
              "string",
              "null"
            ],
            "readOnly": true
          },
          "transcript": {
            "type": [
              "string",
              "null"
            ]
          },
          "customMetadata": {
            "description": "Custom metadata for dynamic form fields"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "descriptionAiGenerated",
          "document",
          "updatedAt",
          "voiceRecording"
        ]
      },
      "ServiceReportCreateRequest": {
        "type": "object",
        "properties": {
          "serviceOrder": {
            "type": "string",
            "format": "uuid"
          },
          "technician": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "startedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "completedAt": {
            "type": "string",
            "format": "date-time"
          },
          "serviceDone": {
            "type": "string",
            "minLength": 1
          },
          "servicePending": {
            "type": [
              "string",
              "null"
            ],
            "default": ""
          },
          "attachments": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri",
              "minLength": 1
            }
          },
          "firstTimeFix": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "followUpNeeded": {
            "type": "boolean",
            "default": false
          },
          "onSite": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "workMinutes": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0
          },
          "travelMinutes": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0
          }
        },
        "required": [
          "completedAt",
          "serviceDone",
          "serviceOrder"
        ]
      },
      "ServiceReportData": {
        "type": "object",
        "properties": {
          "serviceOrderId": {
            "type": "string",
            "format": "uuid",
            "description": "The service order of the report."
          },
          "object": {
            "enum": [
              "service_report"
            ],
            "type": "string",
            "description": "Kind of object the event is about.\n\n* `service_report` - service_report"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the object; fetch it via the API."
          }
        },
        "required": [
          "id",
          "object",
          "serviceOrderId"
        ]
      },
      "ServiceReportEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Event id, identical to the `webhook-id` header and stable across retries."
          },
          "type": {
            "enum": [
              "service_report.generated"
            ],
            "type": "string",
            "description": "* `service_report.generated` - service_report.generated"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "When the event happened."
          },
          "data": {
            "$ref": "#/components/schemas/ServiceReportData"
          }
        },
        "required": [
          "data",
          "id",
          "timestamp",
          "type"
        ]
      },
      "ServiceReportRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "serviceOrder": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "transcript": {
            "type": [
              "string",
              "null"
            ]
          },
          "customMetadata": {
            "description": "Custom metadata for dynamic form fields"
          }
        }
      },
      "ServiceRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "customerAsset": {
            "allOf": [
              {
                "$ref": "#/components/schemas/CustomerAsset"
              }
            ],
            "readOnly": true
          },
          "error": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "description": {
            "type": "string"
          },
          "needsTriage": {
            "type": "boolean"
          },
          "severity": {
            "$ref": "#/components/schemas/SeverityEnum"
          },
          "status": {
            "$ref": "#/components/schemas/ServiceRequestStatusEnum"
          },
          "source": {
            "allOf": [
              {
                "$ref": "#/components/schemas/SourceEnum"
              }
            ],
            "readOnly": true
          },
          "resolution": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ResolutionEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "triagedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "closedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "chat": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "readOnly": true,
            "description": "Self-service chat the request was escalated from."
          },
          "diagnosis": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ServiceRequestDiagnosis"
              },
              {
                "type": "null"
              }
            ],
            "readOnly": true
          },
          "formResponses": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/FormResponse"
            },
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "chat",
          "closedAt",
          "createdAt",
          "customerAsset",
          "description",
          "diagnosis",
          "formResponses",
          "source",
          "triagedAt",
          "updatedAt"
        ]
      },
      "ServiceRequestCreate": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "customerAsset": {
            "type": "string",
            "format": "uuid"
          },
          "error": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "description": {
            "type": "string"
          },
          "severity": {
            "$ref": "#/components/schemas/SeverityEnum"
          }
        },
        "required": [
          "customerAsset",
          "description"
        ]
      },
      "ServiceRequestCreateRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "customerAsset": {
            "type": "string",
            "format": "uuid"
          },
          "error": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "description": {
            "type": "string",
            "minLength": 1
          },
          "severity": {
            "$ref": "#/components/schemas/SeverityEnum"
          }
        },
        "required": [
          "customerAsset",
          "description"
        ]
      },
      "ServiceRequestData": {
        "type": "object",
        "properties": {
          "status": {
            "enum": [
              "OPEN",
              "IN_PROGRESS",
              "CLOSED"
            ],
            "type": "string",
            "description": "* `OPEN` - Open\n* `IN_PROGRESS` - In Progress\n* `CLOSED` - Closed"
          },
          "previousStatus": {
            "enum": [
              "OPEN",
              "IN_PROGRESS",
              "CLOSED"
            ],
            "type": "string",
            "description": "Only on `service_request.status_changed`.\n\n* `OPEN` - Open\n* `IN_PROGRESS` - In Progress\n* `CLOSED` - Closed"
          },
          "source": {
            "enum": [
              "unknown",
              "portal_form",
              "quick_report",
              "backoffice",
              "api",
              "agent",
              "monitoring"
            ],
            "type": "string",
            "description": "Only on `service_request.created`: the intake channel.\n\n* `unknown` - Unknown\n* `portal_form` - Self-service form\n* `quick_report` - Self-service quick report\n* `backoffice` - Backoffice\n* `api` - API\n* `agent` - AI agent / chat bot\n* `monitoring` - Monitoring inspection"
          },
          "resolution": {
            "enum": [
              "on_site",
              "remote",
              "self_service",
              "no_action",
              "duplicate",
              ""
            ],
            "type": "string",
            "description": "Only on `service_request.closed`; empty when not recorded.\n\n* `on_site` - On-site visit\n* `remote` - Remote support\n* `self_service` - Solved by the customer (self-service)\n* `no_action` - No action needed\n* `duplicate` - Duplicate"
          },
          "object": {
            "enum": [
              "service_request"
            ],
            "type": "string",
            "description": "Kind of object the event is about.\n\n* `service_request` - service_request"
          },
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Id of the object; fetch it via the API."
          }
        },
        "required": [
          "id",
          "object",
          "status"
        ]
      },
      "ServiceRequestDiagnosis": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "$ref": "#/components/schemas/ServiceRequestDiagnosisStatusEnum"
          },
          "serviceNeeded": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "serviceNeededConfidence": {
            "type": [
              "number",
              "null"
            ],
            "format": "double",
            "maximum": 1,
            "minimum": 0
          },
          "reasoning": {
            "type": "string"
          },
          "modelName": {
            "type": "string",
            "maxLength": 100
          },
          "errorMessage": {
            "type": "string"
          },
          "reviewAction": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ReviewActionEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "reviewComment": {
            "type": "string"
          },
          "reviewedBy": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/DiagnosisReviewer"
              },
              {
                "type": "null"
              }
            ],
            "readOnly": true
          },
          "reviewedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          },
          "acceptedSuggestion": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "suggestions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DiagnosisSuggestion"
            },
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "reviewedBy",
          "suggestions"
        ]
      },
      "ServiceRequestDiagnosisStatusEnum": {
        "enum": [
          "PENDING",
          "COMPLETED",
          "FAILED",
          "REVIEWED"
        ],
        "type": "string",
        "description": "* `PENDING` - Pending\n* `COMPLETED` - Completed\n* `FAILED` - Failed\n* `REVIEWED` - Reviewed"
      },
      "ServiceRequestEvent": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Event id, identical to the `webhook-id` header and stable across retries."
          },
          "type": {
            "enum": [
              "service_request.created",
              "service_request.status_changed",
              "service_request.closed"
            ],
            "type": "string",
            "description": "* `service_request.created` - service_request.created\n* `service_request.status_changed` - service_request.status_changed\n* `service_request.closed` - service_request.closed"
          },
          "timestamp": {
            "type": "string",
            "format": "date-time",
            "description": "When the event happened."
          },
          "data": {
            "$ref": "#/components/schemas/ServiceRequestData"
          }
        },
        "required": [
          "data",
          "id",
          "timestamp",
          "type"
        ]
      },
      "ServiceRequestRequest": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "error": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid"
          },
          "description": {
            "type": "string",
            "minLength": 1
          },
          "needsTriage": {
            "type": "boolean"
          },
          "severity": {
            "$ref": "#/components/schemas/SeverityEnum"
          },
          "status": {
            "$ref": "#/components/schemas/ServiceRequestStatusEnum"
          },
          "resolution": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/ResolutionEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          }
        },
        "required": [
          "description"
        ]
      },
      "ServiceRequestStatusEnum": {
        "enum": [
          "OPEN",
          "IN_PROGRESS",
          "CLOSED"
        ],
        "type": "string",
        "description": "* `OPEN` - Open\n* `IN_PROGRESS` - In Progress\n* `CLOSED` - Closed"
      },
      "SeverityEnum": {
        "enum": [
          "LOW",
          "MEDIUM",
          "HIGH"
        ],
        "type": "string",
        "description": "* `LOW` - Low\n* `MEDIUM` - Medium\n* `HIGH` - High"
      },
      "SkillLevelEnum": {
        "enum": [
          "basic",
          "advanced",
          "expert"
        ],
        "type": "string",
        "description": "* `basic` - Grundkenntnisse\n* `advanced` - Fortgeschritten\n* `expert` - Experte"
      },
      "SourceEnum": {
        "enum": [
          "unknown",
          "portal_form",
          "quick_report",
          "backoffice",
          "api",
          "agent",
          "monitoring"
        ],
        "type": "string",
        "description": "* `unknown` - Unknown\n* `portal_form` - Self-service form\n* `quick_report` - Self-service quick report\n* `backoffice` - Backoffice\n* `api` - API\n* `agent` - AI agent / chat bot\n* `monitoring` - Monitoring inspection"
      },
      "TableStructureModeEnum": {
        "enum": [
          "fast",
          "accurate"
        ],
        "type": "string",
        "description": "* `fast` - Fast\n* `accurate` - Accurate"
      },
      "TranscriptionRequestRequest": {
        "type": "object",
        "properties": {
          "advanced": {
            "$ref": "#/components/schemas/AdvancedTranscriptionOptionsRequest"
          }
        }
      },
      "VideoWatchProgress": {
        "type": "object",
        "properties": {
          "positionSeconds": {
            "type": "integer"
          },
          "completed": {
            "type": "boolean"
          },
          "lastWatchedAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time"
          }
        },
        "required": [
          "completed",
          "lastWatchedAt",
          "positionSeconds"
        ]
      },
      "WebhookDelivery": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "endpointId": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "eventId": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "eventType": {
            "type": "string",
            "readOnly": true
          },
          "payload": {
            "readOnly": true
          },
          "status": {
            "allOf": [
              {
                "$ref": "#/components/schemas/WebhookDeliveryStatusEnum"
              }
            ],
            "readOnly": true
          },
          "attempts": {
            "type": "integer",
            "readOnly": true
          },
          "lastAttemptAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "nextAttemptAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "responseStatus": {
            "type": [
              "integer",
              "null"
            ],
            "readOnly": true
          },
          "responseBody": {
            "type": "string",
            "readOnly": true
          },
          "error": {
            "type": "string",
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "attempts",
          "createdAt",
          "endpointId",
          "error",
          "eventId",
          "eventType",
          "id",
          "lastAttemptAt",
          "nextAttemptAt",
          "payload",
          "responseBody",
          "responseStatus",
          "status"
        ]
      },
      "WebhookDeliveryStatusEnum": {
        "enum": [
          "pending",
          "succeeded",
          "failed"
        ],
        "type": "string",
        "description": "* `pending` - Pending\n* `succeeded` - Succeeded\n* `failed` - Failed"
      },
      "WebhookEndpoint": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 2048
          },
          "description": {
            "type": "string",
            "maxLength": 255
          },
          "eventTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventTypesEnum"
            },
            "description": "Event types delivered to this endpoint."
          },
          "isActive": {
            "type": "boolean"
          },
          "disabledReason": {
            "readOnly": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/DisabledReasonEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "disabledAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "lastSuccessAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "lastFailureAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          }
        },
        "required": [
          "createdAt",
          "disabledAt",
          "disabledReason",
          "eventTypes",
          "id",
          "lastFailureAt",
          "lastSuccessAt",
          "updatedAt",
          "url"
        ]
      },
      "WebhookEndpointCreated": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "readOnly": true
          },
          "url": {
            "type": "string",
            "format": "uri",
            "maxLength": 2048
          },
          "description": {
            "type": "string",
            "maxLength": 255
          },
          "eventTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventTypesEnum"
            },
            "description": "Event types delivered to this endpoint."
          },
          "isActive": {
            "type": "boolean"
          },
          "disabledReason": {
            "readOnly": true,
            "oneOf": [
              {
                "$ref": "#/components/schemas/DisabledReasonEnum"
              },
              {
                "$ref": "#/components/schemas/BlankEnum"
              }
            ]
          },
          "disabledAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "lastSuccessAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "lastFailureAt": {
            "type": [
              "string",
              "null"
            ],
            "format": "date-time",
            "readOnly": true
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true
          },
          "secret": {
            "type": "string",
            "readOnly": true,
            "description": "Signing secret (whsec_…); returned only on creation."
          }
        },
        "required": [
          "createdAt",
          "disabledAt",
          "disabledReason",
          "eventTypes",
          "id",
          "lastFailureAt",
          "lastSuccessAt",
          "secret",
          "updatedAt",
          "url"
        ]
      },
      "WebhookEndpointRequest": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "minLength": 1,
            "maxLength": 2048
          },
          "description": {
            "type": "string",
            "maxLength": 255
          },
          "eventTypes": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/EventTypesEnum"
            },
            "description": "Event types delivered to this endpoint."
          },
          "isActive": {
            "type": "boolean"
          }
        },
        "required": [
          "eventTypes",
          "url"
        ]
      },
      "WebhookEventType": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        },
        "required": [
          "description",
          "type"
        ]
      },
      "WebhookSecret": {
        "type": "object",
        "properties": {
          "secret": {
            "type": "string",
            "readOnly": true
          }
        },
        "required": [
          "secret"
        ]
      },
      "Error": {
        "type": "object",
        "required": [
          "detail"
        ],
        "properties": {
          "detail": {
            "type": "string",
            "description": "What went wrong."
          }
        }
      },
      "ValidationError": {
        "type": "object",
        "description": "Field name (camelCase) to a list of messages; errors that concern no single field are listed under `nonFieldErrors`.",
        "additionalProperties": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "example": {
          "name": [
            "This field is required."
          ]
        }
      }
    },
    "securitySchemes": {
      "ApiKeyBearer": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "iak_…",
        "description": "The same API key as a bearer token: `Authorization: Bearer iak_…`."
      },
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key",
        "description": "The API key itself, e.g. `X-API-Key: iak_…`. Keys are created by a tenant owner under Profile → API keys."
      }
    },
    "responses": {
      "ValidationFailed": {
        "description": "The request body or a parameter is invalid.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ValidationError"
            }
          }
        }
      },
      "Forbidden": {
        "description": "The API key is missing, invalid or expired; or the key is read-only, its user lacks the permission, or the feature is not part of your plan.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "No such object, or it is not visible to you.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "Rate limit exceeded; retry after `Retry-After` seconds.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "headers": {
          "Retry-After": {
            "description": "Seconds to wait before the next request.",
            "schema": {
              "type": "integer"
            }
          }
        }
      }
    }
  },
  "x-tagGroups": [
    {
      "name": "Assets & customers",
      "tags": [
        "Assets",
        "Asset types",
        "Customers",
        "Customer sites",
        "Installed assets"
      ]
    },
    {
      "name": "Service",
      "tags": [
        "Service requests",
        "Service orders",
        "Service reports",
        "Comments",
        "Service partners",
        "Technicians"
      ]
    },
    {
      "name": "People",
      "tags": [
        "Employees"
      ]
    },
    {
      "name": "Forms",
      "tags": [
        "Form templates",
        "Form responses"
      ]
    },
    {
      "name": "Knowledge",
      "tags": [
        "Documents",
        "Knowledge items",
        "Files"
      ]
    },
    {
      "name": "Webhooks",
      "tags": [
        "Webhooks",
        "Webhook events"
      ]
    }
  ],
  "servers": [
    {
      "url": "https://{tenant}.api.intuaid.com",
      "description": "Your tenant's API host",
      "variables": {
        "tenant": {
          "default": "your-tenant",
          "description": "Your tenant's subdomain, as in https://<tenant>.app.intuaid.com"
        }
      }
    }
  ],
  "tags": [
    {
      "name": "Assets",
      "description": "Machines and installations you service."
    },
    {
      "name": "Asset types",
      "description": "Models or product lines. Assets inherit the documents and forms of their type; the type hierarchy defines which parts can be built into which assets."
    },
    {
      "name": "Customers",
      "description": "Your customers. Needs the Customers feature."
    },
    {
      "name": "Customer sites",
      "description": "Locations of a customer. Needs the Customers feature."
    },
    {
      "name": "Installed assets",
      "description": "An asset installed at a customer site, with the QR code of its self-service page. Needs the Customers feature."
    },
    {
      "name": "Service requests",
      "description": "Reported problems of an installed asset. Needs the Service requests feature."
    },
    {
      "name": "Service orders",
      "description": "Scheduled jobs for a technician or service partner. Needs the Service orders feature."
    },
    {
      "name": "Service reports",
      "description": "The protocol of a completed service order. Needs the Service orders feature."
    },
    {
      "name": "Comments",
      "description": "Comments on service requests and service orders."
    },
    {
      "name": "Service partners",
      "description": "Subcontractors and the assets assigned to them. Needs the Service partners feature."
    },
    {
      "name": "Technicians",
      "description": "People a service order can be assigned to."
    },
    {
      "name": "Employees",
      "description": "Members of your tenant and their CV."
    },
    {
      "name": "Form templates",
      "description": "Forms such as checklists and inspection protocols, built from a FormKit schema. Needs the Templates feature."
    },
    {
      "name": "Form responses",
      "description": "Submitted forms."
    },
    {
      "name": "Documents",
      "description": "Manuals, videos and other files, linked to assets and asset types. A compact view of the knowledge items."
    },
    {
      "name": "Knowledge items",
      "description": "The full knowledge base: documents with their processing (text extraction, transcription, AI ingest), folders, access rules and links."
    },
    {
      "name": "Files",
      "description": "Upload files to use them in documents and reports."
    },
    {
      "name": "Webhooks",
      "description": "Endpoints that receive events, and their deliveries."
    },
    {
      "name": "Webhook events",
      "description": "The events IntuAid sends to your webhook endpoints."
    }
  ],
  "externalDocs": {
    "description": "Developer portal",
    "url": "https://developers.intuaid.com"
  },
  "webhooks": {
    "form_response.submitted": {
      "post": {
        "description": "A form was submitted completely, in the backoffice or the self-service portal.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "form_response.submitted",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/FormResponseEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "service_request.created": {
      "post": {
        "description": "A service request was filed (portal form, QR quick report, chat hand-off, backoffice, API, monitoring).\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "service_request.created",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceRequestEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "service_request.status_changed": {
      "post": {
        "description": "A service request moved to another status (OPEN, IN_PROGRESS, CLOSED).\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "service_request.status_changed",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceRequestEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "service_request.closed": {
      "post": {
        "description": "A service request was closed; carries how it was resolved.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "service_request.closed",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceRequestEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "service_order.created": {
      "post": {
        "description": "A service order was created for a service request.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "service_order.created",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceOrderEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "service_order.assigned": {
      "post": {
        "description": "A service order was assigned to a (different) technician.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "service_order.assigned",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceOrderEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "service_order.completed": {
      "post": {
        "description": "A technician completed a service order.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "service_order.completed",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceOrderEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "service_report.generated": {
      "post": {
        "description": "The document of a service report was generated and can be downloaded.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "service_report.generated",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ServiceReportEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "asset.created": {
      "post": {
        "description": "An asset was created.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "asset.created",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "asset.updated": {
      "post": {
        "description": "An asset was changed.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "asset.updated",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "asset.deleted": {
      "post": {
        "description": "An asset was deleted.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "asset.deleted",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AssetEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "customer.created": {
      "post": {
        "description": "A customer was created.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "customer.created",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "customer.updated": {
      "post": {
        "description": "A customer was changed.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "customer.updated",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "customer.deleted": {
      "post": {
        "description": "A customer was deleted.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "customer.deleted",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomerEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "document.processed": {
      "post": {
        "description": "A knowledge document was processed and is available to the AI assistant.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "document.processed",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "document.failed": {
      "post": {
        "description": "Processing a knowledge document failed.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "document.failed",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DocumentEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    },
    "webhook.ping": {
      "post": {
        "description": "Sent by **Send test event** in the settings or `POST /api/webhooks/endpoints/{id}/test/`; never sent otherwise.\n\nSigned per Standard Webhooks: verify `webhook-signature` against `{webhook-id}.{webhook-timestamp}.{body}` with your endpoint secret, and use `webhook-id` to drop duplicates. Respond with any 2xx within 10 seconds; everything else is retried.",
        "summary": "webhook.ping",
        "tags": [
          "Webhook events"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PingEvent"
              }
            }
          },
          "required": true
        },
        "responses": {
          "2XX": {
            "description": "Received. The body is ignored."
          }
        }
      }
    }
  }
}
