{
  "openapi": "3.1.0",
  "info": {
    "title": "Skolu Institution API",
    "version": "1.0.0",
    "description": "Read-only academic data for your institution. Use an institution integration credential provisioned by Skolu. All branches are included. Free access allows 30 admitted requests in a rolling 60-second window, shared across all integration credentials for one institution.\n\n## Quick start\n\n1. Ask Skolu for an **Institution integration** token. It grants access to one institution and all its branches. Administrative tokens and normal app logins cannot use these endpoints.\n2. Send `Authorization: Bearer YOUR_TOKEN` with each request. Keep the token in your server's secret storage. Your dashboard backend should make these requests.\n3. Call `GET /me` to check the institution and expiry, then request `GET /students?limit=50`.\n4. Fetch the next page using `pagination.nextCursor`. Keep the same filters and endpoint. Stop when `pagination.hasMore` is false.\n\nEvery endpoint below is GET-only. There are no writes, webhooks or export jobs in v1. You choose your fetch schedule and whether to store the returned data.\n\nWith `SKOLU_API_TOKEN` already supplied by your server's secret storage, your first request is:\n\n```sh\nexport SKOLU_API_BASE='https://api-stg.skolu.id/api/integration/v1'\ncurl --fail-with-body --include \\\n  --header \"Authorization: Bearer $SKOLU_API_TOKEN\" \\\n  \"$SKOLU_API_BASE/me\"\n```\n\nUse the returned `institutionId` to confirm the intended school. Do not send an institution selector with later requests; the credential already determines it. All names and IDs in reference examples are fictional. Replace example IDs with IDs returned for your institution.\n\n## Building your dashboard\n\n- **Student profiles:** join `students` → `enrollments` → `classes` → `academic-years` and `branches` using their IDs. Student branch filters match retained class enrollments; they are not a single home-branch field.\n- **Teachers:** `staff.id` is an institution membership ID. `staff.profileId` is the optional staff profile ID. `teaching-assignments.staffId` and planning submission staff IDs use the membership ID.\n- **Teacher planning:** `student-plans` contains current saved planning; it does not imply approval. Use `approved-planning-submissions` and `approved-planning-items` for approved submissions. Pending and rejected submissions are excluded.\n- **Curriculum:** `/classes/{id}/curriculum` returns a flat hierarchy of AREA, SUBAREA, MATERIAL and LESSON items. Join `parentId` to `id`. Current plans, approved items and progress expose nullable `lessonInstanceId`, which matches a curriculum LESSON `id`; `lessonPlanId` is a separate class record ID. This reads the existing class snapshot; it does not create missing curriculum. Use `milestones` for institution-defined labels and ordering.\n- **Assessments:** `student-progress` contains the latest recorded student/lesson milestone. It is current state, not a complete revision history. `learning-activities` and `learning-activity-lessons` provide recorded activity evidence, including historical lesson snapshots.\n- **Learning posts:** ordinary activities and progress notes include both internal and parent-shared records. `shareWithParents=false` means internal. Filter with `shareWithParents=true` for parent-shared posts only. Fetch student links through `learning-activity-students`; links and evidence are paginated separately.\n- **Reports:** `student-reports` contains published reports. Use `student-report-results?reportId=…` for flat milestone snapshots and `student-report-classes?reportId=…` for covered classes. A STUDENT report can cover several classes. `classCoverage=EXPLICIT` means the saved class selection is available; `SOURCE_CLASS` means a class report; `UNSPECIFIED` means legacy student-mode coverage was not saved and cannot be reconstructed here. Class/branch filters use known covered classes; academic-year filters use the report year, which may differ from its source class year. Snapshot results preserve names; they do not invent current lesson IDs. Positional result IDs can change if a report is republished.\n\nRelationship IDs may refer to retained historical records or records that have since become unavailable. Do not assume every referenced record has a currently visible detail endpoint. Payroll, banking, private HR fields, guardian contacts, health data, arbitrary custom fields, media downloads, comments, reactions and private assessment/report notes are outside this contract.\n\n## Pagination, filters and history\n\nLists return `{ \"data\": [...], \"pagination\": { \"hasMore\": false, \"nextCursor\": null } }`. Page size defaults to 50 and is capped at 100. Each page counts as one request. Nested links, planning items and report results have separate paginated endpoints to keep responses bounded.\n\nCursors are opaque and signed. They are tied to the institution, endpoint and filters. Reusing a cursor with another filter or altering it returns 400. Restart from the first page after changing filters or if a server signing-key rotation invalidates a cursor. Sort order uses stable record keys, not dates or curriculum display order; use `sortOrder` for presentation.\n\nDates use `YYYY-MM-DD`; timestamps use ISO 8601 with a timezone. Range filters are inclusive. Boolean filters accept exactly `true` or `false`. Unsupported parameters, malformed UUIDs and reversed ranges return 400. `q` searches student names as literal text.\n\nCalendar dates retain the owning institution/branch's business-date meaning; timestamp responses use UTC. Filters accept timezone-qualified instants. For example, `plannedFrom`/`plannedTo` match planned calendar dates, `assessedFrom`/`assessedTo` match assessment instants, and `occurredFrom`/`occurredTo` match activity occurrence instants.\n\nReports use **period overlap**: `periodFrom=2026-01-01&periodTo=2026-03-31` matches a published report whose reporting interval overlaps any part of that quarter, including its boundary dates. These filters also apply to report results and class links. `publishedFrom`/`publishedTo` on report headers instead match the publication timestamp; publication can happen after the reporting period ends.\n\n```sh\n# Current class-wide planning for March; use a real class ID from /classes.\ncurl --fail-with-body --get \\\n  --header \"Authorization: Bearer $SKOLU_API_TOKEN\" \\\n  --data-urlencode 'classId=10000000-0000-4000-8000-000000000005' \\\n  --data-urlencode 'plannedFrom=2026-03-01' \\\n  --data-urlencode 'plannedTo=2026-03-31' \\\n  \"$SKOLU_API_BASE/student-plans\"\n\n# Published reports covering any part of the first quarter.\ncurl --fail-with-body --get \\\n  --header \"Authorization: Bearer $SKOLU_API_TOKEN\" \\\n  --data-urlencode 'periodFrom=2026-01-01' \\\n  --data-urlencode 'periodTo=2026-03-31' \\\n  \"$SKOLU_API_BASE/student-reports\"\n```\n\nThis Node.js example traverses student pages and honors temporary retry instructions. Keep filters unchanged while following cursors. Process or store each page as your dashboard requires.\n\n```js\nconst base = process.env.SKOLU_API_BASE;\nconst token = process.env.SKOLU_API_TOKEN;\nif (!base || !token) throw new Error('Configure the API base URL and token first');\nconst sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\nasync function getPage(url) {\n  for (let attempt = 0; attempt < 4; attempt++) {\n    const response = await fetch(url, { headers: { Authorization: `Bearer ${token}` } });\n    if ([429, 503].includes(response.status) && attempt < 3) {\n      const seconds = Number(response.headers.get('Retry-After'));\n      await sleep(\n        (Number.isFinite(seconds) && seconds > 0 ? seconds : 5) * 1000 + Math.random() * 1000,\n      );\n      continue;\n    }\n    if (!response.ok) {\n      // Record status/request ID for support, without logging credentials or student data.\n      throw new Error(\n        `HTTP ${response.status}; request ${response.headers.get('X-Api-Token-Request-Id')}`,\n      );\n    }\n    return response.json();\n  }\n}\nlet cursor;\ndo {\n  const url = new URL(`${base}/students`);\n  url.searchParams.set('limit', '50');\n  if (cursor) url.searchParams.set('cursor', cursor);\n  const page = await getPage(url);\n  console.log(`Received ${page.data.length} students`);\n  cursor = page.pagination.hasMore ? page.pagination.nextCursor : null;\n} while (cursor);\n```\n\nRetained historical records remain accessible: there is no 30-day API history restriction. Deleted records are omitted. There is no change/deletion feed or consistent multi-page snapshot in v1. Concurrent edits can affect later pages; periodic full refreshes are useful if you keep a local copy. Date filters match the documented event date, **not** all updates to a record. A missing record is not a deletion notification.\n\n## Shared request allowance\n\nFree access admits **30 requests in any rolling 60 seconds per institution**, across all its integration tokens and API servers. Creating another token does not increase the allowance. Admitted requests consume capacity even if input validation, operation authorization or the data handler fails. Authenticated unsupported methods and unknown paths under the integration prefix are denied with 403 and count. Retries and interactive “Test Request” calls count too. HEAD requests also count.\n\nWhen full, the API returns 429 with `Retry-After` in seconds. Wait at least that long, add a little random delay, then retry. Rejected requests do not extend the wait. `X-RateLimit-Remaining` is the capacity observed for that request; other concurrent callers may already have consumed it. `X-RateLimit-Reset-After` tells you when the oldest admission expires, not when all 30 slots reset.\n\nIf admission storage is unavailable, the API returns 503 before reading business data. Respect `Retry-After` (normally 5 seconds). Authentication failures do not consume the institution allowance. Viewing these docs, downloading OpenAPI, and browser CORS preflight do not consume it.\n\n## Credentials and errors\n\nTokens default to one year of validity, with shorter expiries available. Revocation and secret rotation take effect immediately; rotating a secret does not extend expiry. Provision a replacement to renew. Credentials remain valid if the issuing admin leaves, provided the institution remains active or in trial and the token has not expired or been revoked.\n\nErrors use `{ \"error\": { \"code\": \"INVALID_REQUEST\", \"message\": \"…\", \"requestId\": \"…\" } }`. Use the request ID when contacting Skolu; never send your secret or student payload as part of an error report. 401 means the credential is not valid; 403 means access is not permitted; 404 covers missing and inaccessible records.\n\n| Status | Stable code                       | Client action                                                             |\n| ------ | --------------------------------- | ------------------------------------------------------------------------- |\n| 400    | `INVALID_REQUEST`                 | Correct filters, IDs, dates or cursor before retrying.                    |\n| 401    | `UNAUTHENTICATED`                 | Check the token, expiry, rotation and revocation with your administrator. |\n| 403    | `ACCESS_DENIED`                   | Check the operation, credential kind and institution eligibility.         |\n| 404    | `NOT_FOUND`                       | The record is unavailable to this institution.                            |\n| 429    | `INTEGRATION_RATE_LIMITED`        | Wait for `Retry-After`, add jitter, and coordinate shared callers.        |\n| 500    | `INTERNAL_ERROR`                  | Use bounded retries; provide the request ID to Skolu if persistent.       |\n| 503    | `INTEGRATION_LIMITER_UNAVAILABLE` | Wait for `Retry-After` and use bounded retries.                           |\n\nThe interactive client sends requests directly to Skolu. Tokens entered here are kept in memory, not persisted across reloads. No third-party request proxy or analytics plugin is used. API responses are marked `private, no-store` for HTTP caches.\n\n## Versioning\n\nThis is the v1 contract. Clients should tolerate new optional fields. Changes to identifiers, field types, enum semantics, filtering or visibility require compatibility review; breaking changes require a new public version and a separately announced migration/retirement plan. No automatic v1 retirement is scheduled for this pilot. Download `/openapi.json` for the exact available fields, filters, types and error responses.\n\n## Changelog\n\n### 1.0.0 — initial v1 contract, pending deployment\n\n- Institution-bound read-only academic access, shared rolling allowance, and independently managed credentials.\n- Paginated directory, curriculum, current planning, approved submission, assessment, activity and published-report resources.\n- Inclusive report-period overlap filters, separately from publication-time filters. Published report snapshots remain available after source-class removal; unavailable class links are omitted.\n- Fictional request/response examples, structured errors and quota/retry headers. No dedicated change/deletion feed in this version.\n"
  },
  "servers": [
    {
      "url": "https://api-stg.skolu.id/api/integration/v1"
    }
  ],
  "security": [
    {
      "InstitutionToken": []
    }
  ],
  "paths": {
    "/me": {
      "get": {
        "operationId": "get-integration-identity",
        "summary": "get integration identity",
        "description": "Check this credential and its owning institution. This request consumes one admission.",
        "tags": [
          "Access"
        ],
        "parameters": [],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Me"
                },
                "example": {
                  "tokenId": "10000000-0000-4000-8000-000000000002",
                  "name": "Fictional school dashboard",
                  "institutionId": "10000000-0000-4000-8000-000000000001",
                  "institutionName": "Fictional School",
                  "expiresAt": "2027-01-01T00:00:00Z",
                  "capabilities": [
                    "institution_integration.read"
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/branches": {
      "get": {
        "operationId": "list-branches",
        "summary": "list branches",
        "description": "Institution branches, including lifecycle state.",
        "tags": [
          "branches"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "DRAFT",
                "ACTIVE",
                "ARCHIVED"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/branches-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/academic-years": {
      "get": {
        "operationId": "list-academic-years",
        "summary": "list academic years",
        "description": "Institution academic years. Dates are calendar dates.",
        "tags": [
          "academic-years"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/academic-years-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/classes": {
      "get": {
        "operationId": "list-classes",
        "summary": "list classes",
        "description": "Classes and their academic year, level and owning branch.",
        "tags": [
          "classes"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "academicYearId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/classes-page"
                },
                "example": {
                  "data": [
                    {
                      "id": "10000000-0000-4000-8000-000000000005",
                      "name": "Example Class",
                      "description": null,
                      "branchId": "10000000-0000-4000-8000-000000000003",
                      "academicYearId": "10000000-0000-4000-8000-000000000004",
                      "classLevelId": "10000000-0000-4000-8000-000000000014",
                      "status": "ACTIVE",
                      "createdAt": "2026-01-05T02:00:00Z",
                      "updatedAt": "2026-03-31T03:00:00Z"
                    }
                  ],
                  "pagination": {
                    "nextCursor": null,
                    "hasMore": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/classes/{id}": {
      "get": {
        "operationId": "get-classes",
        "summary": "get classes",
        "description": "Classes and their academic year, level and owning branch.",
        "tags": [
          "classes"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Resource UUID in the authenticated institution.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/classes"
                },
                "example": {
                  "id": "10000000-0000-4000-8000-000000000005",
                  "name": "Example Class",
                  "description": null,
                  "branchId": "10000000-0000-4000-8000-000000000003",
                  "academicYearId": "10000000-0000-4000-8000-000000000004",
                  "classLevelId": "10000000-0000-4000-8000-000000000014",
                  "status": "ACTIVE",
                  "createdAt": "2026-01-05T02:00:00Z",
                  "updatedAt": "2026-03-31T03:00:00Z"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/students": {
      "get": {
        "operationId": "list-students",
        "summary": "list students",
        "description": "Student identities. Class membership is exposed through enrollments.",
        "tags": [
          "students"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission.",
            "example": 50
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "example": "10000000-0000-4000-8000-000000000005"
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            }
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/students-page"
                },
                "example": {
                  "data": [
                    {
                      "id": "10000000-0000-4000-8000-000000000006",
                      "fullName": "Example Student",
                      "schoolStudentId": "EXAMPLE-001",
                      "status": "ACTIVE",
                      "isActive": true,
                      "createdAt": "2026-01-05T02:00:00Z",
                      "updatedAt": "2026-03-31T03:00:00Z"
                    }
                  ],
                  "pagination": {
                    "nextCursor": null,
                    "hasMore": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/students/{id}": {
      "get": {
        "operationId": "get-students",
        "summary": "get students",
        "description": "Student identities. Class membership is exposed through enrollments.",
        "tags": [
          "students"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Resource UUID in the authenticated institution.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/students"
                },
                "example": {
                  "id": "10000000-0000-4000-8000-000000000006",
                  "fullName": "Example Student",
                  "schoolStudentId": "EXAMPLE-001",
                  "status": "ACTIVE",
                  "isActive": true,
                  "createdAt": "2026-01-05T02:00:00Z",
                  "updatedAt": "2026-03-31T03:00:00Z"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/enrollments": {
      "get": {
        "operationId": "list-enrollments",
        "summary": "list enrollments",
        "description": "Student/class enrollments, including retained inactive history.",
        "tags": [
          "enrollments"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission.",
            "example": 50
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "example": "10000000-0000-4000-8000-000000000006"
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "academicYearId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/enrollments-page"
                },
                "example": {
                  "data": [
                    {
                      "id": "10000000-0000-4000-8000-000000000007",
                      "studentId": "10000000-0000-4000-8000-000000000006",
                      "classId": "10000000-0000-4000-8000-000000000005",
                      "enrollmentDate": "2026-01-05",
                      "status": "ACTIVE",
                      "createdAt": "2026-01-05T02:00:00Z",
                      "updatedAt": "2026-03-31T03:00:00Z"
                    }
                  ],
                  "pagination": {
                    "nextCursor": null,
                    "hasMore": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/staff": {
      "get": {
        "operationId": "list-staff",
        "summary": "list staff",
        "description": "Minimal staff directory. id is the institution membership ID; profileId is the optional Staff profile ID.",
        "tags": [
          "staff"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "isActive",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/staff-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/teaching-assignments": {
      "get": {
        "operationId": "list-teaching-assignments",
        "summary": "list teaching assignments",
        "description": "Teacher/class assignments. staffId matches the staff directory id.",
        "tags": [
          "teaching-assignments"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "staffId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "academicYearId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/teaching-assignments-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/classes/{id}/curriculum": {
      "get": {
        "operationId": "list-curriculum",
        "summary": "list curriculum",
        "description": "Flat paginated class curriculum hierarchy. Parent IDs relate the returned area, subarea, material and lesson items. Use /classes/{id}/curriculum.",
        "tags": [
          "curriculum"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Resource UUID in the authenticated institution.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "AREA",
                "SUBAREA",
                "MATERIAL",
                "LESSON"
              ]
            }
          },
          {
            "name": "parentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/curriculum-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/milestones": {
      "get": {
        "operationId": "list-milestones",
        "summary": "list milestones",
        "description": "Institution milestone definitions. Codes and labels are institution-defined.",
        "tags": [
          "milestones"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/milestones-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/student-plans": {
      "get": {
        "operationId": "list-student-plans",
        "summary": "list student plans",
        "description": "Current saved student planning. Current plans are not necessarily approved.",
        "tags": [
          "student-plans"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "example": "10000000-0000-4000-8000-000000000005"
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "academicYearId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "plannedFrom",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            },
            "example": "2026-03-01"
          },
          {
            "name": "plannedTo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            },
            "example": "2026-03-31"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/student-plans-page"
                },
                "example": {
                  "data": [
                    {
                      "id": "10000000-0000-4000-8000-000000000010",
                      "studentId": "10000000-0000-4000-8000-000000000006",
                      "classId": "10000000-0000-4000-8000-000000000005",
                      "lessonPlanId": "10000000-0000-4000-8000-000000000008",
                      "lessonInstanceId": "10000000-0000-4000-8000-000000000009",
                      "lessonTitle": "Example counting lesson",
                      "plannedDate": "2026-03-02",
                      "description": "Count objects from one to five.",
                      "createdAt": "2026-01-05T02:00:00Z",
                      "updatedAt": "2026-03-31T03:00:00Z"
                    }
                  ],
                  "pagination": {
                    "nextCursor": null,
                    "hasMore": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/approved-planning-submissions": {
      "get": {
        "operationId": "list-approved-planning-submissions",
        "summary": "list approved planning submissions",
        "description": "Approved planning submissions only. Fetch approved-planning-items for their items.",
        "tags": [
          "approved-planning-submissions"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "academicYearId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "approvedFrom",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            }
          },
          {
            "name": "approvedTo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/approved-planning-submissions-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/approved-planning-items": {
      "get": {
        "operationId": "list-approved-planning-items",
        "summary": "list approved planning items",
        "description": "Flat items of approved submissions; these are approved snapshots, distinct from current planning.",
        "tags": [
          "approved-planning-items"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "academicYearId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "submissionId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "plannedFrom",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          },
          {
            "name": "plannedTo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/approved-planning-items-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/student-progress": {
      "get": {
        "operationId": "list-student-progress",
        "summary": "list student progress",
        "description": "Latest recorded milestone per student/lesson. This is current state, not a complete assessment history.",
        "tags": [
          "student-progress"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "example": "10000000-0000-4000-8000-000000000005"
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "academicYearId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "lessonPlanId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "milestoneCode",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            }
          },
          {
            "name": "assessedFrom",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "example": "2026-03-01T00:00:00Z"
          },
          {
            "name": "assessedTo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            },
            "example": "2026-03-31T23:59:59Z"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/student-progress-page"
                },
                "example": {
                  "data": [
                    {
                      "id": "10000000-0000-4000-8000-000000000010",
                      "studentId": "10000000-0000-4000-8000-000000000006",
                      "classId": "10000000-0000-4000-8000-000000000005",
                      "lessonPlanId": "10000000-0000-4000-8000-000000000008",
                      "lessonInstanceId": "10000000-0000-4000-8000-000000000009",
                      "lessonTitle": "Example counting lesson",
                      "milestoneCode": "DEVELOPING",
                      "assessedAt": "2026-03-02T03:00:00Z",
                      "sourceActivityPostId": "10000000-0000-4000-8000-000000000011",
                      "createdAt": "2026-01-05T02:00:00Z",
                      "updatedAt": "2026-03-31T03:00:00Z"
                    }
                  ],
                  "pagination": {
                    "nextCursor": null,
                    "hasMore": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/learning-activities": {
      "get": {
        "operationId": "list-learning-activities",
        "summary": "list learning activities",
        "description": "Ordinary learning activities and progress notes, both internal and parent-shared. shareWithParents=false means internal. Student links and lesson evidence are paginated separately.",
        "tags": [
          "learning-activities"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            },
            "example": "10000000-0000-4000-8000-000000000005"
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "lessonPlanId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "postType",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "ACTIVITY",
                "PROGRESS_NOTE"
              ]
            }
          },
          {
            "name": "shareWithParents",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "true",
                "false"
              ]
            },
            "example": "false"
          },
          {
            "name": "occurredFrom",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            }
          },
          {
            "name": "occurredTo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/learning-activities-page"
                },
                "example": {
                  "data": [
                    {
                      "id": "10000000-0000-4000-8000-000000000011",
                      "postType": "PROGRESS_NOTE",
                      "content": "Example Student counted five objects.",
                      "title": null,
                      "branchId": "10000000-0000-4000-8000-000000000003",
                      "classId": "10000000-0000-4000-8000-000000000005",
                      "authorStaffId": null,
                      "shareWithParents": false,
                      "occurredAt": "2026-03-02T03:00:00Z",
                      "createdAt": "2026-01-05T02:00:00Z",
                      "updatedAt": "2026-03-31T03:00:00Z"
                    }
                  ],
                  "pagination": {
                    "nextCursor": null,
                    "hasMore": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/learning-activities/{id}": {
      "get": {
        "operationId": "get-learning-activities",
        "summary": "get learning activities",
        "description": "Ordinary learning activities and progress notes, both internal and parent-shared. shareWithParents=false means internal. Student links and lesson evidence are paginated separately.",
        "tags": [
          "learning-activities"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Resource UUID in the authenticated institution.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/learning-activities"
                },
                "example": {
                  "id": "10000000-0000-4000-8000-000000000011",
                  "postType": "PROGRESS_NOTE",
                  "content": "Example Student counted five objects.",
                  "title": null,
                  "branchId": "10000000-0000-4000-8000-000000000003",
                  "classId": "10000000-0000-4000-8000-000000000005",
                  "authorStaffId": null,
                  "shareWithParents": false,
                  "occurredAt": "2026-03-02T03:00:00Z",
                  "createdAt": "2026-01-05T02:00:00Z",
                  "updatedAt": "2026-03-31T03:00:00Z"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/learning-activity-students": {
      "get": {
        "operationId": "list-learning-activity-students",
        "summary": "list learning activity students",
        "description": "Flat student links for accessible learning posts. Includes both internal and shared posts.",
        "tags": [
          "learning-activity-students"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "activityPostId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/learning-activity-students-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/learning-activity-lessons": {
      "get": {
        "operationId": "list-learning-activity-lessons",
        "summary": "list learning activity lessons",
        "description": "Recorded lesson and milestone evidence, including historical snapshots of removed lessons. Parent legacy evidence is used only when child entries are absent.",
        "tags": [
          "learning-activity-lessons"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "activityPostId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "lessonPlanId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/learning-activity-lessons-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/student-reports": {
      "get": {
        "operationId": "list-student-reports",
        "summary": "list student reports",
        "description": "Published academic report snapshots. classId is the batch source class; generationMode identifies multi-class student reports. Results and included classes are paginated separately.",
        "tags": [
          "student-reports"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "classId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "branchId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "academicYearId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "periodFrom",
            "in": "query",
            "required": false,
            "schema": {
              "description": "Inclusive calendar-date start; matches reports ending on or after this date.",
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            },
            "example": "2026-01-01"
          },
          {
            "name": "periodTo",
            "in": "query",
            "required": false,
            "schema": {
              "description": "Inclusive calendar-date end; matches reports starting on or before this date.",
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            },
            "example": "2026-03-31"
          },
          {
            "name": "publishedFrom",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            }
          },
          {
            "name": "publishedTo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/student-reports-page"
                },
                "example": {
                  "data": [
                    {
                      "id": "10000000-0000-4000-8000-000000000012",
                      "studentId": "10000000-0000-4000-8000-000000000006",
                      "batchId": "10000000-0000-4000-8000-000000000013",
                      "classId": "10000000-0000-4000-8000-000000000005",
                      "academicYearId": "10000000-0000-4000-8000-000000000004",
                      "title": "Example first-quarter report",
                      "generationMode": "CLASS",
                      "classCoverage": "SOURCE_CLASS",
                      "dateFrom": "2026-01-01",
                      "dateTo": "2026-03-31",
                      "publishedAt": "2026-04-02T03:00:00Z",
                      "createdAt": "2026-01-05T02:00:00Z",
                      "updatedAt": "2026-03-31T03:00:00Z"
                    }
                  ],
                  "pagination": {
                    "nextCursor": null,
                    "hasMore": false
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/student-reports/{id}": {
      "get": {
        "operationId": "get-student-reports",
        "summary": "get student reports",
        "description": "Published academic report snapshots. classId is the batch source class; generationMode identifies multi-class student reports. Results and included classes are paginated separately.",
        "tags": [
          "student-reports"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Resource UUID in the authenticated institution.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/student-reports"
                },
                "example": {
                  "id": "10000000-0000-4000-8000-000000000012",
                  "studentId": "10000000-0000-4000-8000-000000000006",
                  "batchId": "10000000-0000-4000-8000-000000000013",
                  "classId": "10000000-0000-4000-8000-000000000005",
                  "academicYearId": "10000000-0000-4000-8000-000000000004",
                  "title": "Example first-quarter report",
                  "generationMode": "CLASS",
                  "classCoverage": "SOURCE_CLASS",
                  "dateFrom": "2026-01-01",
                  "dateTo": "2026-03-31",
                  "publishedAt": "2026-04-02T03:00:00Z",
                  "createdAt": "2026-01-05T02:00:00Z",
                  "updatedAt": "2026-03-31T03:00:00Z"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/student-report-results": {
      "get": {
        "operationId": "list-student-report-results",
        "summary": "list student report results",
        "description": "Flat published academic snapshot results. Snapshot lesson names do not imply current lesson IDs. Notes, photos and attendance JSON are not included.",
        "tags": [
          "student-report-results"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "reportId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "periodFrom",
            "in": "query",
            "required": false,
            "schema": {
              "description": "Inclusive calendar-date start; matches reports ending on or after this date.",
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          },
          {
            "name": "periodTo",
            "in": "query",
            "required": false,
            "schema": {
              "description": "Inclusive calendar-date end; matches reports starting on or before this date.",
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/student-report-results-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    },
    "/student-report-classes": {
      "get": {
        "operationId": "list-student-report-classes",
        "summary": "list student report classes",
        "description": "Class coverage of published reports, including multi-class student report batches.",
        "tags": [
          "student-report-classes"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "default": 50,
              "type": "integer",
              "minimum": 1,
              "maximum": 100
            },
            "description": "Page size: 1–100, default 50. Each page consumes one admission."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 4096
            },
            "description": "Opaque nextCursor from the previous page. Keep the same institution, resource and filters. Page size may change."
          },
          {
            "name": "reportId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "uuid",
              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
            }
          },
          {
            "name": "periodFrom",
            "in": "query",
            "required": false,
            "schema": {
              "description": "Inclusive calendar-date start; matches reports ending on or after this date.",
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          },
          {
            "name": "periodTo",
            "in": "query",
            "required": false,
            "schema": {
              "description": "Inclusive calendar-date end; matches reports starting on or before this date.",
              "type": "string",
              "format": "date",
              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Successful read. Responses are private and must not be stored by shared HTTP caches.",
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/student-report-classes-page"
                }
              }
            }
          },
          "400": {
            "description": "Invalid ID, cursor, query parameter, filter or date range.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INVALID_REQUEST",
                    "message": "Invalid ID, cursor, query parameter, filter or date range.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "401": {
            "description": "Missing, invalid, expired or revoked credential.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "UNAUTHENTICATED",
                    "message": "Missing, invalid, expired or revoked credential.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "403": {
            "description": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "ACCESS_DENIED",
                    "message": "Wrong credential type, prohibited operation, institution override, or unavailable institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "404": {
            "description": "Resource does not exist or is not available in this institution.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "NOT_FOUND",
                    "message": "Resource does not exist or is not available in this institution.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "429": {
            "description": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_RATE_LIMITED",
                    "message": "Institution allowance exhausted. Respect Retry-After; rejected requests do not extend the wait.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server failure.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTERNAL_ERROR",
                    "message": "Unexpected server failure.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          },
          "503": {
            "description": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "error": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "string"
                        },
                        "message": {
                          "type": "string"
                        },
                        "requestId": {
                          "anyOf": [
                            {
                              "type": "string",
                              "format": "uuid",
                              "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "required": [
                        "code",
                        "message",
                        "requestId"
                      ],
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "error"
                  ],
                  "additionalProperties": false
                },
                "example": {
                  "error": {
                    "code": "INTEGRATION_LIMITER_UNAVAILABLE",
                    "message": "Admission storage unavailable. No business data handler runs; retry after the indicated delay.",
                    "requestId": "10000000-0000-4000-8000-000000000099"
                  }
                }
              }
            },
            "headers": {
              "X-Api-Token-Request-Id": {
                "description": "Request ID for support, including authentication failures.",
                "schema": {
                  "type": "string",
                  "format": "uuid"
                }
              },
              "X-RateLimit-Limit": {
                "description": "Shared rolling-window capacity.",
                "schema": {
                  "type": "integer",
                  "const": 30
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Remaining admissions at the time this request was admitted.",
                "schema": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 29
                }
              },
              "X-RateLimit-Reset-After": {
                "description": "Seconds until the oldest admission leaves the rolling window; this does not reset the entire allowance.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "Retry-After": {
                "description": "Wait at least this many seconds, then retry with jitter.",
                "schema": {
                  "type": "integer",
                  "minimum": 1
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "InstitutionToken": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "Skolu institution integration token",
        "description": "Paste the token only, without the Bearer prefix. Obtain it from your Skolu administrator; never embed it in a public dashboard or client-side application."
      }
    },
    "schemas": {
      "Me": {
        "type": "object",
        "properties": {
          "tokenId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "name": {
            "type": "string"
          },
          "institutionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "institutionName": {
            "type": "string"
          },
          "expiresAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "capabilities": {
            "type": "array",
            "items": {
              "type": "string",
              "const": "institution_integration.read"
            }
          }
        },
        "required": [
          "tokenId",
          "name",
          "institutionId",
          "institutionName",
          "expiresAt",
          "capabilities"
        ],
        "additionalProperties": false
      },
      "branches": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "string"
          },
          "timezone": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "name",
          "status",
          "timezone",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "branches-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "name": {
                  "type": "string"
                },
                "status": {
                  "type": "string"
                },
                "timezone": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "name",
                "status",
                "timezone",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "academic-years": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "name": {
            "type": "string"
          },
          "startDate": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "endDate": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "status": {
            "type": "string"
          },
          "isCurrent": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "name",
          "startDate",
          "endDate",
          "status",
          "isCurrent",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "academic-years-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "name": {
                  "type": "string"
                },
                "startDate": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                },
                "endDate": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                },
                "status": {
                  "type": "string"
                },
                "isCurrent": {
                  "type": "boolean"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "name",
                "startDate",
                "endDate",
                "status",
                "isCurrent",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "classes": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "name": {
            "type": "string"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "branchId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "academicYearId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classLevelId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "status": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "name",
          "description",
          "branchId",
          "academicYearId",
          "classLevelId",
          "status",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "classes-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "name": {
                  "type": "string"
                },
                "description": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "branchId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "academicYearId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classLevelId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "status": {
                  "type": "string"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "name",
                "description",
                "branchId",
                "academicYearId",
                "classLevelId",
                "status",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "students": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "fullName": {
            "type": "string"
          },
          "schoolStudentId": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string"
          },
          "isActive": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "fullName",
          "schoolStudentId",
          "status",
          "isActive",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "students-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "fullName": {
                  "type": "string"
                },
                "schoolStudentId": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "status": {
                  "type": "string"
                },
                "isActive": {
                  "type": "boolean"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "fullName",
                "schoolStudentId",
                "status",
                "isActive",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "enrollments": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "enrollmentDate": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "status": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "studentId",
          "classId",
          "enrollmentDate",
          "status",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "enrollments-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "studentId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "enrollmentDate": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                },
                "status": {
                  "type": "string"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "studentId",
                "classId",
                "enrollmentDate",
                "status",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "staff": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "profileId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "fullName": {
            "type": "string"
          },
          "jobTitle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "isActive": {
            "type": "boolean"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "profileId",
          "fullName",
          "jobTitle",
          "isActive",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "staff-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "profileId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "fullName": {
                  "type": "string"
                },
                "jobTitle": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "isActive": {
                  "type": "boolean"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "profileId",
                "fullName",
                "jobTitle",
                "isActive",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "teaching-assignments": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "staffId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "role": {
            "type": "string"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "staffId",
          "classId",
          "role",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "teaching-assignments-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "staffId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "role": {
                  "type": "string"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "staffId",
                "classId",
                "role",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "curriculum": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "parentId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "type": {
            "type": "string",
            "enum": [
              "AREA",
              "SUBAREA",
              "MATERIAL",
              "LESSON"
            ]
          },
          "name": {
            "type": "string"
          },
          "content": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "sortOrder": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          },
          "lessonTemplateId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "classId",
          "parentId",
          "type",
          "name",
          "content",
          "sortOrder",
          "lessonTemplateId"
        ],
        "additionalProperties": false
      },
      "curriculum-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "parentId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "type": {
                  "type": "string",
                  "enum": [
                    "AREA",
                    "SUBAREA",
                    "MATERIAL",
                    "LESSON"
                  ]
                },
                "name": {
                  "type": "string"
                },
                "content": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sortOrder": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                },
                "lessonTemplateId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "id",
                "classId",
                "parentId",
                "type",
                "name",
                "content",
                "sortOrder",
                "lessonTemplateId"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "milestones": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "code": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "sortOrder": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "id",
          "code",
          "label",
          "sortOrder"
        ],
        "additionalProperties": false
      },
      "milestones-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "code": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "sortOrder": {
                  "type": "integer",
                  "minimum": -9007199254740991,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "id",
                "code",
                "label",
                "sortOrder"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "student-plans": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "lessonPlanId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "lessonInstanceId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "lessonTitle": {
            "type": "string"
          },
          "plannedDate": {
            "anyOf": [
              {
                "type": "string",
                "format": "date",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "studentId",
          "classId",
          "lessonPlanId",
          "lessonInstanceId",
          "lessonTitle",
          "plannedDate",
          "description",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "student-plans-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "studentId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "lessonPlanId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "lessonInstanceId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lessonTitle": {
                  "type": "string"
                },
                "plannedDate": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "description": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "studentId",
                "classId",
                "lessonPlanId",
                "lessonInstanceId",
                "lessonTitle",
                "plannedDate",
                "description",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "approved-planning-submissions": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "submittedByStaffId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "approvedByStaffId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "approvedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "submittedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "studentId",
          "classId",
          "submittedByStaffId",
          "approvedByStaffId",
          "approvedAt",
          "submittedAt",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "approved-planning-submissions-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "studentId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "submittedByStaffId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "approvedByStaffId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "approvedAt": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "submittedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "studentId",
                "classId",
                "submittedByStaffId",
                "approvedByStaffId",
                "approvedAt",
                "submittedAt",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "approved-planning-items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "submissionId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "lessonPlanId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "lessonInstanceId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "plannedDate": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "submissionId",
          "studentId",
          "classId",
          "lessonPlanId",
          "lessonInstanceId",
          "plannedDate",
          "description",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "approved-planning-items-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "submissionId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "studentId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "lessonPlanId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "lessonInstanceId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "plannedDate": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                },
                "description": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "submissionId",
                "studentId",
                "classId",
                "lessonPlanId",
                "lessonInstanceId",
                "plannedDate",
                "description",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "student-progress": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "lessonPlanId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "lessonInstanceId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "lessonTitle": {
            "type": "string"
          },
          "milestoneCode": {
            "type": "string"
          },
          "assessedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "sourceActivityPostId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "studentId",
          "classId",
          "lessonPlanId",
          "lessonInstanceId",
          "lessonTitle",
          "milestoneCode",
          "assessedAt",
          "sourceActivityPostId",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "student-progress-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "studentId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "lessonPlanId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "lessonInstanceId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lessonTitle": {
                  "type": "string"
                },
                "milestoneCode": {
                  "type": "string"
                },
                "assessedAt": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "sourceActivityPostId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "studentId",
                "classId",
                "lessonPlanId",
                "lessonInstanceId",
                "lessonTitle",
                "milestoneCode",
                "assessedAt",
                "sourceActivityPostId",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "learning-activities": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "postType": {
            "type": "string",
            "enum": [
              "ACTIVITY",
              "PROGRESS_NOTE"
            ]
          },
          "content": {
            "type": "string"
          },
          "title": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "branchId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "classId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "authorStaffId": {
            "anyOf": [
              {
                "type": "string",
                "format": "uuid",
                "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
              },
              {
                "type": "null"
              }
            ]
          },
          "shareWithParents": {
            "type": "boolean"
          },
          "occurredAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "postType",
          "content",
          "title",
          "branchId",
          "classId",
          "authorStaffId",
          "shareWithParents",
          "occurredAt",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "learning-activities-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "postType": {
                  "type": "string",
                  "enum": [
                    "ACTIVITY",
                    "PROGRESS_NOTE"
                  ]
                },
                "content": {
                  "type": "string"
                },
                "title": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "branchId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "classId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "authorStaffId": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uuid",
                      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "shareWithParents": {
                  "type": "boolean"
                },
                "occurredAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "postType",
                "content",
                "title",
                "branchId",
                "classId",
                "authorStaffId",
                "shareWithParents",
                "occurredAt",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "learning-activity-students": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "activityPostId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "activityPostId",
          "studentId",
          "createdAt"
        ],
        "additionalProperties": false
      },
      "learning-activity-students-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "activityPostId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "studentId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "activityPostId",
                "studentId",
                "createdAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "learning-activity-lessons": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "activityPostId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "lessonPlanId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "lessonTitle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "areaName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "subAreaName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "materialName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "milestoneCode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "milestoneLabel": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "activityPostId",
          "lessonPlanId",
          "lessonTitle",
          "areaName",
          "subAreaName",
          "materialName",
          "milestoneCode",
          "milestoneLabel"
        ],
        "additionalProperties": false
      },
      "learning-activity-lessons-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "activityPostId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "lessonPlanId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "lessonTitle": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "areaName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "subAreaName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "materialName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "milestoneCode": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "milestoneLabel": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "id",
                "activityPostId",
                "lessonPlanId",
                "lessonTitle",
                "areaName",
                "subAreaName",
                "materialName",
                "milestoneCode",
                "milestoneLabel"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "student-reports": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "batchId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "academicYearId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "title": {
            "type": "string"
          },
          "generationMode": {
            "type": "string"
          },
          "classCoverage": {
            "type": "string",
            "enum": [
              "SOURCE_CLASS",
              "EXPLICIT",
              "UNSPECIFIED"
            ]
          },
          "dateFrom": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "dateTo": {
            "type": "string",
            "format": "date",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
          },
          "publishedAt": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
              },
              {
                "type": "null"
              }
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
          }
        },
        "required": [
          "id",
          "studentId",
          "batchId",
          "classId",
          "academicYearId",
          "title",
          "generationMode",
          "classCoverage",
          "dateFrom",
          "dateTo",
          "publishedAt",
          "createdAt",
          "updatedAt"
        ],
        "additionalProperties": false
      },
      "student-reports-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "studentId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "batchId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "academicYearId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "title": {
                  "type": "string"
                },
                "generationMode": {
                  "type": "string"
                },
                "classCoverage": {
                  "type": "string",
                  "enum": [
                    "SOURCE_CLASS",
                    "EXPLICIT",
                    "UNSPECIFIED"
                  ]
                },
                "dateFrom": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                },
                "dateTo": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"
                },
                "publishedAt": {
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "date-time",
                      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "createdAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                },
                "updatedAt": {
                  "type": "string",
                  "format": "date-time",
                  "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
                }
              },
              "required": [
                "id",
                "studentId",
                "batchId",
                "classId",
                "academicYearId",
                "title",
                "generationMode",
                "classCoverage",
                "dateFrom",
                "dateTo",
                "publishedAt",
                "createdAt",
                "updatedAt"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "student-report-results": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "reportId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "studentId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "areaName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "subAreaName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "materialName": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "lessonTitle": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "milestoneCode": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "reportId",
          "studentId",
          "areaName",
          "subAreaName",
          "materialName",
          "lessonTitle",
          "milestoneCode"
        ],
        "additionalProperties": false
      },
      "student-report-results-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "reportId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "studentId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "areaName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "subAreaName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "materialName": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "lessonTitle": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "milestoneCode": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "id",
                "reportId",
                "studentId",
                "areaName",
                "subAreaName",
                "materialName",
                "lessonTitle",
                "milestoneCode"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      },
      "student-report-classes": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "reportId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "classId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          }
        },
        "required": [
          "id",
          "reportId",
          "classId"
        ],
        "additionalProperties": false
      },
      "student-report-classes-page": {
        "type": "object",
        "properties": {
          "data": {
            "maxItems": 100,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "reportId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                },
                "classId": {
                  "type": "string",
                  "format": "uuid",
                  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
                }
              },
              "required": [
                "id",
                "reportId",
                "classId"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "nextCursor": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "hasMore": {
                "type": "boolean"
              }
            },
            "required": [
              "nextCursor",
              "hasMore"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "data",
          "pagination"
        ],
        "additionalProperties": false
      }
    }
  }
}
