{
  "openapi": "3.1.0",
  "info": {
    "title": "NWEA MAP",
    "description": "The NWEA MAP API stores tenant-scoped MAP import facts and versioned reference data used by Results and Analytics. MAP imports are bulk CDF bundle writes that validate CDF files, mirror raw rows, and materialize typed facts keyed by NWEA account, student, term, subject, and strand. Growth rollups, effective-grade joins, and longitudinal report surfaces belong to Analytics and Results; this module owns the MAP facts and norms-tagged inputs.",
    "version": "1.0"
  },
  "tags": [
    {
      "name": "MAP assessment result",
      "description": "The typed test-of-record materialization for MAP assessment sittings. Each row represents the selected test-of-record result for a student, term, and subject combination. Selection logic applies testOfRecordReason to pick exactly one sitting per natural key from all raw CDF rows."
    },
    {
      "name": "MAP goal strand",
      "description": "A hook-written MAP assessment goal-strand fact. Each row unpivots one NWEA `Goal1..Goal8` block from the selected typed assessment result into the natural strand tuple. `goalGap` follows `strandRit - overallRit` and is persisted by the import hook."
    },
    {
      "name": "MAP import receipt",
      "description": "An immutable receipt recording the outcome of a MAP CDF bundle import. Each successful call to `importMapCdfBundle` produces exactly one receipt capturing row counts, the canonical bundle hash, and any problem summary. Receipts are never mutated or soft-deleted; they serve as the audit trail for all materialized MAP fact rows that reference `mapImportId`."
    },
    {
      "name": "MAP import file",
      "description": "Per-CDF-file validation evidence captured during a MAP import. Each row records the processing outcome for one source file within an import batch, including row counts, header fingerprint, and column metadata. Evidence rows are immutable once written."
    },
    {
      "name": "MAP norm table",
      "description": "Global NWEA MAP norms/percentile reference table. Each row maps a (normsSet, subject, grade, percentile, tableVersion) tuple to the corresponding RIT score and growth norms across standard NWEA windows. The table is tenantScoped:false because it is publisher reference data shared across all tenants."
    },
    {
      "name": "MAP projection",
      "description": "A hook-written forward NWEA projection fact. The import hook derives each norms-tagged row from CDF projected-growth and typical-growth columns plus typed MAP result facts. The row is input to downstream Analytics; it does not compute Growth X, 99-levels, or effective-grade joins."
    },
    {
      "name": "MAP raw accommodation",
      "description": "Raw CDF mirror of the NWEA MAP Accommodations export file. Each row corresponds 1:1 with a source CSV row; typed sidecar fields carry the natural key and platform metadata while the open `cdf` blob preserves all original CDF columns as ingested."
    },
    {
      "name": "MAP raw assessment result",
      "description": "Raw CDF mirror of the NWEA MAP AssessmentResults export file. Each row corresponds 1:1 with a source CSV row; typed sidecar fields carry the natural key and platform metadata while the open `cdf` blob preserves all original CDF columns as ingested."
    },
    {
      "name": "MAP raw class assignment",
      "description": "Raw CDF mirror of the NWEA MAP ClassAssignments export file. Each row corresponds 1:1 with a source CSV row; typed sidecar fields carry the natural key and platform metadata while the open `cdf` blob preserves all original CDF columns as ingested."
    },
    {
      "name": "MAP raw program assignment",
      "description": "Raw CDF mirror of the NWEA MAP ProgramAssignments export file. Each row corresponds 1:1 with a source CSV row; typed sidecar fields carry the natural key and platform metadata while the open `cdf` blob preserves all original CDF columns as ingested."
    },
    {
      "name": "MAP raw student-by-school",
      "description": "Raw CDF mirror of the NWEA MAP StudentsBySchool export file. Each row corresponds 1:1 with a source CSV row; typed sidecar fields carry the natural key and platform metadata while the open `cdf` blob preserves all original CDF columns as ingested."
    },
    {
      "name": "RIT-to-grade reference",
      "description": "Global RIT-to-grade reference table that maps each integer RIT score to its NWEA-published 50th-percentile grade position and Alpha-extrapolated 90th-percentile grade position. The table is cross-tenant reference data seeded from PowerPath; downstream computed reads interpolate between stored points and derive effective-grade bands."
    }
  ],
  "paths": {
    "/nweamap/v1/assessment-results": {
      "get": {
        "operationId": "listMapAssessmentResults",
        "summary": "List MAP assessment results",
        "description": "Lists typed test-of-record MAP assessment results. When sittingScope is `test_of_record` (default), returns from this entity; when `all`, dispatches to the raw sitting store.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP assessment result"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "query",
            "required": true,
            "description": "Tenant-local NWEA account filter (required).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "description": "NWEA student id filter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termId",
            "in": "query",
            "description": "Canonical MAP term id filter.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subjectId",
            "in": "query",
            "description": "Canonical MAP/RIT subject id filter.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            }
          },
          {
            "name": "sittingScope",
            "in": "query",
            "description": "Controls result scope: `test_of_record` returns from this entity (default); `all` dispatches to the raw sitting store.",
            "schema": {
              "type": "string",
              "enum": [
                "test_of_record",
                "all"
              ],
              "default": "test_of_record"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapAssessmentResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/assessment-results/{nweaAccountId}/{studentId}/{studentStateId}/{termId}/{subjectId}": {
      "get": {
        "operationId": "getMapAssessmentResult",
        "summary": "Get a MAP assessment result",
        "description": "Returns one typed test-of-record MAP assessment result by its NWEA-native natural key.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP assessment result"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "path",
            "required": true,
            "description": "Tenant-local NWEA account id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "description": "NWEA student id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentStateId",
            "in": "path",
            "required": true,
            "description": "NWEA student state id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termId",
            "in": "path",
            "required": true,
            "description": "Canonical term id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subjectId",
            "in": "path",
            "required": true,
            "description": "Canonical MAP/RIT subject id.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapAssessmentResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_assessment_result_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/map-goal-strands": {
      "get": {
        "operationId": "listMapGoalStrands",
        "summary": "List MAP goal strands",
        "description": "Lists hook-written MAP goal-strand facts. Subject and term filters use canonical ids set at import time; display aliases are not folded on read.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP goal strand"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "query",
            "description": "Tenant-local NWEA account filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "nweaAccountId",
              "operator": "eq"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "description": "NWEA student id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "studentId",
              "operator": "eq"
            }
          },
          {
            "name": "termId",
            "in": "query",
            "description": "Canonical MAP term id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "termId",
              "operator": "eq"
            }
          },
          {
            "name": "subjectId",
            "in": "query",
            "description": "Canonical MAP/RIT subject id filter.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            },
            "x-filter": {
              "column": "subjectId",
              "operator": "eq"
            }
          },
          {
            "name": "goalStrandId",
            "in": "query",
            "description": "Canonical goal-strand id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "goalStrandId",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapGoalStrand"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/map-goal-strands/{nweaAccountId}/{studentId}/{studentStateId}/{termId}/{subjectId}/{goalStrandId}": {
      "get": {
        "operationId": "getMapGoalStrand",
        "summary": "Get a MAP goal strand",
        "description": "Returns one MAP goal-strand fact by its NWEA-native natural key.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP goal strand"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "path",
            "required": true,
            "description": "Tenant-local NWEA account id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "description": "NWEA student id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentStateId",
            "in": "path",
            "required": true,
            "description": "NWEA student state id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termId",
            "in": "path",
            "required": true,
            "description": "Canonical term id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subjectId",
            "in": "path",
            "required": true,
            "description": "Canonical MAP/RIT subject id.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            }
          },
          {
            "name": "goalStrandId",
            "in": "path",
            "required": true,
            "description": "Canonical goal-strand id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapGoalStrand"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_goal_strand_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/imports": {
      "post": {
        "operationId": "importMapCdfBundle",
        "summary": "Import a MAP CDF bundle",
        "description": "Validates and imports a five-file NWEA MAP CDF bundle. The handler computes the canonical bundle hash, checks for idempotent replay, validates rows, materializes fact entities, and returns an immutable import receipt. Returns 201 on first apply, 200 on idempotent replay.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP import receipt"
        ],
        "parameters": [
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "description": "The idempotency key (max 128 chars). Optional — when present, the call is replay-protected; a completed replay returns the stored response at 200 with idempotency-replayed: true.",
            "schema": {
              "type": "string",
              "maxLength": 128
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "nweaAccountId": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Tenant-local NWEA account partition."
                  },
                  "termName": {
                    "type": "string",
                    "minLength": 1,
                    "description": "Raw NWEA term name (e.g. 'Spring 2025-2026')."
                  },
                  "files": {
                    "type": "array",
                    "items": {
                      "type": "object",
                      "properties": {
                        "sourceFile": {
                          "type": "string",
                          "enum": [
                            "AssessmentResults",
                            "StudentBySchool",
                            "ClassAssignments",
                            "ProgramAssignments",
                            "Accommodations"
                          ]
                        },
                        "header": {
                          "type": "array",
                          "items": {
                            "type": "string"
                          }
                        },
                        "rows": {
                          "type": "array",
                          "items": {
                            "type": "object"
                          }
                        }
                      },
                      "required": [
                        "sourceFile",
                        "header",
                        "rows"
                      ],
                      "additionalProperties": false
                    },
                    "minItems": 1
                  }
                },
                "required": [
                  "nweaAccountId",
                  "termName",
                  "files"
                ],
                "additionalProperties": false
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapImport"
                }
              }
            },
            "headers": {
              "nweamap-bundle-hash": {
                "schema": {
                  "type": "string",
                  "pattern": "^sha256:[0-9a-f]{64}$"
                }
              },
              "idempotency-replayed": {
                "description": "true when this response is a stored idempotent replay (the hook did not run).",
                "schema": {
                  "type": "string",
                  "enum": [
                    "true",
                    "false"
                  ]
                }
              }
            }
          },
          "201": {
            "description": "Created.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapImport"
                }
              }
            },
            "headers": {
              "nweamap-bundle-hash": {
                "schema": {
                  "type": "string",
                  "pattern": "^sha256:[0-9a-f]{64}$"
                }
              },
              "idempotency-replayed": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict — an operation with this Idempotency-Key is already in progress (60s lock).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "422": {
            "description": "Problem (nweamap:row_validation_failed).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "428": {
            "description": "Precondition Required — this operation requires the Idempotency-Key header.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "listMapImports",
        "summary": "List MAP import receipts",
        "description": "Lists immutable import receipts for the tenant, ordered by most recent first. Supports filtering by NWEA account partition.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP import receipt"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "query",
            "description": "Filter by tenant-local NWEA account partition.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "nweaAccountId",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapImport"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/imports/{mapImportId}": {
      "get": {
        "operationId": "getMapImport",
        "summary": "Get a MAP import receipt",
        "description": "Returns a single import receipt by its UUID.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP import receipt"
        ],
        "parameters": [
          {
            "name": "mapImportId",
            "in": "path",
            "required": true,
            "description": "The import receipt identifier.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapImport"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_import_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/import-files": {
      "get": {
        "operationId": "listMapImportFiles",
        "summary": "List MAP import files",
        "description": "Lists per-CDF-file validation evidence rows. Filter by mapImportId to see all files processed within a single import batch.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP import file"
        ],
        "parameters": [
          {
            "name": "mapImportId",
            "in": "query",
            "description": "Filter by import receipt id.",
            "schema": {
              "type": "string",
              "format": "uuid"
            },
            "x-filter": {
              "column": "mapImportId",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapImportFile"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/import-files/{mapImportId}/{sourceFile}": {
      "get": {
        "operationId": "getMapImportFile",
        "summary": "Get a MAP import file",
        "description": "Returns one per-CDF-file validation evidence row by its composite natural key.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP import file"
        ],
        "parameters": [
          {
            "name": "mapImportId",
            "in": "path",
            "required": true,
            "description": "Import receipt id.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "sourceFile",
            "in": "path",
            "required": true,
            "description": "CDF file type.",
            "schema": {
              "type": "string",
              "enum": [
                "AssessmentResults",
                "StudentBySchool",
                "ClassAssignments",
                "ProgramAssignments",
                "Accommodations"
              ]
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapImportFile"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_import_file_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/percentile-rit": {
      "get": {
        "operationId": "translatePercentileRit",
        "summary": "Translate between percentile and RIT",
        "description": "Looks up the norms table to translate a percentile to a RIT score or a RIT score to a percentile for a given subject and grade. Exactly one of `percentile` or `rit` must be supplied (mutually exclusive). Returns the resolved value plus interpolation metadata and growth norms at the resolved point.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP norm table"
        ],
        "parameters": [
          {
            "name": "subjectId",
            "in": "query",
            "required": true,
            "description": "Canonical MAP subject id.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science"
              ]
            }
          },
          {
            "name": "gradePosition",
            "in": "query",
            "required": true,
            "description": "Grade level (K=0 through 12).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 12
            }
          },
          {
            "name": "normsSet",
            "in": "query",
            "required": false,
            "description": "NWEA norms edition. Defaults to the current active norms set when omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2020",
                "2025"
              ]
            }
          },
          {
            "name": "tableVersion",
            "in": "query",
            "required": false,
            "description": "Optional table version pin. When omitted, the latest loaded version is used.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "percentile",
            "in": "query",
            "required": false,
            "description": "Percentile to translate to a RIT score. Mutually exclusive with `rit`.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 99
            }
          },
          {
            "name": "rit",
            "in": "query",
            "required": false,
            "description": "RIT score to translate to a percentile. Mutually exclusive with `percentile`.",
            "schema": {
              "type": "integer",
              "minimum": 100,
              "maximum": 350
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "subjectId": {
                      "type": "string",
                      "description": "Echo of the requested subject."
                    },
                    "gradePosition": {
                      "type": "integer",
                      "description": "Echo of the requested grade position."
                    },
                    "normsSet": {
                      "type": "string",
                      "description": "The norms set used for the lookup (echoed or defaulted)."
                    },
                    "tableVersion": {
                      "type": "string",
                      "description": "The table version used for the lookup."
                    },
                    "inputPercentile": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "The percentile supplied as input, or null if the input was a RIT."
                    },
                    "inputRit": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "The RIT supplied as input, or null if the input was a percentile."
                    },
                    "ritScore": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "description": "The resolved RIT score, or null if no source data matched."
                    },
                    "percentile": {
                      "type": [
                        "number",
                        "null"
                      ],
                      "description": "The resolved percentile (may be fractional for interpolated values), or null if no source data matched."
                    },
                    "sourcePointKind": {
                      "type": "string",
                      "enum": [
                        "exact",
                        "interpolated",
                        "extrapolated",
                        "source_missing"
                      ],
                      "description": "Indicates how the result was derived: exact table match, interpolated between bracket rows, extrapolated beyond table bounds, or missing source data."
                    },
                    "bracketLow": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "percentile": {
                          "type": "integer",
                          "description": "Lower bracket percentile."
                        },
                        "ritScore": {
                          "type": "integer",
                          "description": "RIT at the lower bracket percentile."
                        }
                      },
                      "required": [
                        "percentile",
                        "ritScore"
                      ],
                      "description": "The lower bounding table row used for interpolation, or null for exact matches and source_missing.",
                      "additionalProperties": false
                    },
                    "bracketHigh": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "percentile": {
                          "type": "integer",
                          "description": "Upper bracket percentile."
                        },
                        "ritScore": {
                          "type": "integer",
                          "description": "RIT at the upper bracket percentile."
                        }
                      },
                      "required": [
                        "percentile",
                        "ritScore"
                      ],
                      "description": "The upper bounding table row used for interpolation, or null for exact matches and source_missing.",
                      "additionalProperties": false
                    },
                    "growthNorms": {
                      "type": [
                        "object",
                        "null"
                      ],
                      "properties": {
                        "fallToWinter": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Typical fall-to-winter growth at the resolved point."
                        },
                        "fallToSpring": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Typical fall-to-spring growth at the resolved point."
                        },
                        "winterToSpring": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Typical winter-to-spring growth at the resolved point."
                        },
                        "springToSpring": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Typical spring-to-spring growth at the resolved point."
                        },
                        "fallToFall": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Typical fall-to-fall growth at the resolved point."
                        },
                        "winterToWinter": {
                          "type": [
                            "number",
                            "null"
                          ],
                          "description": "Typical winter-to-winter growth at the resolved point."
                        }
                      },
                      "required": [
                        "fallToWinter",
                        "fallToSpring",
                        "winterToSpring",
                        "springToSpring",
                        "fallToFall",
                        "winterToWinter"
                      ],
                      "description": "Growth norms at the resolved percentile/RIT point, or null when source_missing.",
                      "additionalProperties": false
                    }
                  },
                  "required": [
                    "subjectId",
                    "gradePosition",
                    "normsSet",
                    "tableVersion",
                    "inputPercentile",
                    "inputRit",
                    "ritScore",
                    "percentile",
                    "sourcePointKind",
                    "bracketLow",
                    "bracketHigh",
                    "growthNorms"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/norms-table": {
      "get": {
        "operationId": "listMapNormTableEntries",
        "summary": "List MAP norm table entries",
        "description": "Lists rows from the global MAP norms/percentile reference table with optional filters for normsSet, subjectId, gradePosition, and tableVersion.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP norm table"
        ],
        "parameters": [
          {
            "name": "normsSet",
            "in": "query",
            "description": "Filter by NWEA norms edition.",
            "schema": {
              "type": "string",
              "enum": [
                "2020",
                "2025"
              ]
            },
            "x-filter": {
              "column": "normsSet",
              "operator": "eq"
            }
          },
          {
            "name": "subjectId",
            "in": "query",
            "description": "Filter by canonical MAP subject id.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science"
              ]
            },
            "x-filter": {
              "column": "subjectId",
              "operator": "eq"
            }
          },
          {
            "name": "gradePosition",
            "in": "query",
            "description": "Filter by grade level (K=0 through 12).",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 12
            },
            "x-filter": {
              "column": "gradePosition",
              "operator": "eq"
            }
          },
          {
            "name": "tableVersion",
            "in": "query",
            "description": "Filter by table version.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "tableVersion",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapNormTable"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/map-projections": {
      "get": {
        "operationId": "listMapProjections",
        "summary": "List MAP projections",
        "description": "Lists hook-written NWEA forward projection rows. Growth X, 99-levels, and effective-grade joins are not computed by this module.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP projection"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "query",
            "description": "Tenant-local NWEA account filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "nweaAccountId",
              "operator": "eq"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "description": "NWEA student id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "studentId",
              "operator": "eq"
            }
          },
          {
            "name": "subjectId",
            "in": "query",
            "description": "Canonical MAP/RIT subject id filter.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            },
            "x-filter": {
              "column": "subjectId",
              "operator": "eq"
            }
          },
          {
            "name": "startTermId",
            "in": "query",
            "description": "Canonical starting term id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "startTermId",
              "operator": "eq"
            }
          },
          {
            "name": "projectedTermId",
            "in": "query",
            "description": "Canonical projected term id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "projectedTermId",
              "operator": "eq"
            }
          },
          {
            "name": "normsSet",
            "in": "query",
            "description": "NWEA norms edition filter.",
            "schema": {
              "type": "string",
              "enum": [
                "2020",
                "2025"
              ]
            },
            "x-filter": {
              "column": "normsSet",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapProjection"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/map-projections/{nweaAccountId}/{studentId}/{studentStateId}/{subjectId}/{startTermId}/{projectedTermId}/{normsSet}": {
      "get": {
        "operationId": "getMapProjection",
        "summary": "Get a MAP projection",
        "description": "Returns one MAP forward projection by its NWEA-native natural key.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP projection"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "path",
            "required": true,
            "description": "Tenant-local NWEA account id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "description": "NWEA student id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentStateId",
            "in": "path",
            "required": true,
            "description": "NWEA student state id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subjectId",
            "in": "path",
            "required": true,
            "description": "Canonical MAP/RIT subject id.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            }
          },
          {
            "name": "startTermId",
            "in": "path",
            "required": true,
            "description": "Canonical start term id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "projectedTermId",
            "in": "path",
            "required": true,
            "description": "Canonical projected term id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "normsSet",
            "in": "path",
            "required": true,
            "description": "NWEA norms edition.",
            "schema": {
              "type": "string",
              "enum": [
                "2020",
                "2025"
              ]
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapProjection"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_projection_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-accommodations": {
      "get": {
        "operationId": "listMapRawAccommodations",
        "summary": "List MAP raw accommodations",
        "description": "Lists raw CDF Accommodations rows ingested from NWEA MAP exports.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw accommodation"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "query",
            "required": true,
            "description": "Tenant-local NWEA account filter (required).",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "nweaAccountId",
              "operator": "eq"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "description": "NWEA student id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "studentId",
              "operator": "eq"
            }
          },
          {
            "name": "termName",
            "in": "query",
            "description": "Raw CDF term name filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "termName",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapRawAccommodation"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-accommodations/{nweaAccountId}/{termName}/{studentId}/{studentStateId}/{testId}/{accommodationCategory}/{accommodation}": {
      "get": {
        "operationId": "getMapRawAccommodation",
        "summary": "Get a MAP raw accommodation",
        "description": "Returns one raw CDF Accommodations row by its natural key.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw accommodation"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "path",
            "required": true,
            "description": "Tenant-local NWEA account id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termName",
            "in": "path",
            "required": true,
            "description": "Raw CDF term name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "description": "NWEA student id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentStateId",
            "in": "path",
            "required": true,
            "description": "NWEA student state id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "testId",
            "in": "path",
            "required": true,
            "description": "NWEA test identifier.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "accommodationCategory",
            "in": "path",
            "required": true,
            "description": "Accommodation category.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "accommodation",
            "in": "path",
            "required": true,
            "description": "Specific accommodation.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapRawAccommodation"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_raw_accommodation_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-assessment-results": {
      "get": {
        "operationId": "listMapRawAssessmentResults",
        "summary": "List MAP raw assessment results",
        "description": "Lists raw CDF AssessmentResults rows ingested from NWEA MAP exports.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw assessment result"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "query",
            "required": true,
            "description": "Tenant-local NWEA account filter (required).",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "nweaAccountId",
              "operator": "eq"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "description": "NWEA student id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "studentId",
              "operator": "eq"
            }
          },
          {
            "name": "termName",
            "in": "query",
            "description": "Raw CDF term name filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "termName",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapRawAssessmentResult"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-assessment-results/{nweaAccountId}/{termName}/{studentId}/{studentStateId}/{subject}/{course}/{testId}/{testStartDate}/{testStartTime}": {
      "get": {
        "operationId": "getMapRawAssessmentResult",
        "summary": "Get a MAP raw assessment result",
        "description": "Returns one raw CDF AssessmentResults row by its natural key.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw assessment result"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "path",
            "required": true,
            "description": "Tenant-local NWEA account id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termName",
            "in": "path",
            "required": true,
            "description": "Raw CDF term name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "description": "NWEA student id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentStateId",
            "in": "path",
            "required": true,
            "description": "NWEA student state id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subject",
            "in": "path",
            "required": true,
            "description": "Raw NWEA subject name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "course",
            "in": "path",
            "required": true,
            "description": "Course name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "testId",
            "in": "path",
            "required": true,
            "description": "NWEA test identifier.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "testStartDate",
            "in": "path",
            "required": true,
            "description": "Test start date.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "testStartTime",
            "in": "path",
            "required": true,
            "description": "Test start time.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapRawAssessmentResult"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_raw_assessment_result_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-class-assignments": {
      "get": {
        "operationId": "listMapRawClassAssignments",
        "summary": "List MAP raw class assignments",
        "description": "Lists raw CDF ClassAssignments rows ingested from NWEA MAP exports.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw class assignment"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "query",
            "required": true,
            "description": "Tenant-local NWEA account filter (required).",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "nweaAccountId",
              "operator": "eq"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "description": "NWEA student id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "studentId",
              "operator": "eq"
            }
          },
          {
            "name": "termName",
            "in": "query",
            "description": "Raw CDF term name filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "termName",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapRawClassAssignment"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-class-assignments/{nweaAccountId}/{termName}/{schoolStateId}/{studentId}/{studentStateId}/{className}/{teacherId}": {
      "get": {
        "operationId": "getMapRawClassAssignment",
        "summary": "Get a MAP raw class assignment",
        "description": "Returns one raw CDF ClassAssignments row by its natural key.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw class assignment"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "path",
            "required": true,
            "description": "Tenant-local NWEA account id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termName",
            "in": "path",
            "required": true,
            "description": "Raw CDF term name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "schoolStateId",
            "in": "path",
            "required": true,
            "description": "State-assigned school identifier.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "description": "NWEA student id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentStateId",
            "in": "path",
            "required": true,
            "description": "NWEA student state id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "className",
            "in": "path",
            "required": true,
            "description": "Class name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "teacherId",
            "in": "path",
            "required": true,
            "description": "NWEA teacher identifier.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapRawClassAssignment"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_raw_class_assignment_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-program-assignments": {
      "get": {
        "operationId": "listMapRawProgramAssignments",
        "summary": "List MAP raw program assignments",
        "description": "Lists raw CDF ProgramAssignments rows ingested from NWEA MAP exports.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw program assignment"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "query",
            "required": true,
            "description": "Tenant-local NWEA account filter (required).",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "nweaAccountId",
              "operator": "eq"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "description": "NWEA student id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "studentId",
              "operator": "eq"
            }
          },
          {
            "name": "termName",
            "in": "query",
            "description": "Raw CDF term name filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "termName",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapRawProgramAssignment"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-program-assignments/{nweaAccountId}/{termName}/{studentId}/{studentStateId}/{program}/{nweaStandardProgram}": {
      "get": {
        "operationId": "getMapRawProgramAssignment",
        "summary": "Get a MAP raw program assignment",
        "description": "Returns one raw CDF ProgramAssignments row by its natural key.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw program assignment"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "path",
            "required": true,
            "description": "Tenant-local NWEA account id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termName",
            "in": "path",
            "required": true,
            "description": "Raw CDF term name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "description": "NWEA student id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentStateId",
            "in": "path",
            "required": true,
            "description": "NWEA student state id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "program",
            "in": "path",
            "required": true,
            "description": "Program name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "nweaStandardProgram",
            "in": "path",
            "required": true,
            "description": "NWEA standard program classification.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapRawProgramAssignment"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_raw_program_assignment_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-student-by-school": {
      "get": {
        "operationId": "listMapRawStudentBySchool",
        "summary": "List MAP raw student-by-school records",
        "description": "Lists raw CDF StudentsBySchool rows ingested from NWEA MAP exports.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw student-by-school"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "query",
            "required": true,
            "description": "Tenant-local NWEA account filter (required).",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "nweaAccountId",
              "operator": "eq"
            }
          },
          {
            "name": "studentId",
            "in": "query",
            "description": "NWEA student id filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "studentId",
              "operator": "eq"
            }
          },
          {
            "name": "termName",
            "in": "query",
            "description": "Raw CDF term name filter.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "termName",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/MapRawStudentBySchool"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/raw-student-by-school/{nweaAccountId}/{termName}/{schoolStateId}/{schoolName}/{studentId}/{studentStateId}": {
      "get": {
        "operationId": "getMapRawStudentBySchool",
        "summary": "Get a MAP raw student-by-school record",
        "description": "Returns one raw CDF StudentsBySchool row by its natural key.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "MAP raw student-by-school"
        ],
        "parameters": [
          {
            "name": "nweaAccountId",
            "in": "path",
            "required": true,
            "description": "Tenant-local NWEA account id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "termName",
            "in": "path",
            "required": true,
            "description": "Raw CDF term name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "schoolStateId",
            "in": "path",
            "required": true,
            "description": "State-assigned school identifier.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "schoolName",
            "in": "path",
            "required": true,
            "description": "School name.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentId",
            "in": "path",
            "required": true,
            "description": "NWEA student id.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "studentStateId",
            "in": "path",
            "required": true,
            "description": "NWEA student state id.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MapRawStudentBySchool"
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Problem (map_raw_student_by_school_not_found).",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/rit-to-grade": {
      "get": {
        "operationId": "lookupRitToGrade",
        "summary": "Lookup RIT-to-grade position",
        "description": "Computed read that resolves a RIT score to its grade-position envelope. The handler interpolates between stored reference points when an exact match is absent, folds subject aliases (vocabulary->reading, writing->language), and derives the full effective-grade band from the r50 and r90 positions.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "RIT-to-grade reference"
        ],
        "parameters": [
          {
            "name": "subjectId",
            "in": "query",
            "required": true,
            "description": "Canonical MAP/RIT subject id. Vocabulary and writing are folded to their parent table subject at lookup time.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            }
          },
          {
            "name": "rit",
            "in": "query",
            "required": true,
            "description": "The RIT score to resolve. May be fractional; the handler interpolates between stored integer reference points.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "normsSet",
            "in": "query",
            "required": false,
            "description": "NWEA norms edition. Defaults to the current active norms set when omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2020",
                "2025"
              ]
            }
          },
          {
            "name": "tableVersion",
            "in": "query",
            "required": false,
            "description": "Explicit table version to resolve against. When omitted the handler selects the latest version for the given norms set.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "subjectId": {
                      "type": "string",
                      "enum": [
                        "math",
                        "reading",
                        "language",
                        "science",
                        "vocabulary",
                        "writing"
                      ],
                      "description": "The requested subject id echoed back, including alias subjects."
                    },
                    "tableSubjectId": {
                      "type": "string",
                      "enum": [
                        "math",
                        "reading",
                        "language",
                        "science"
                      ],
                      "description": "The canonical 4-value table subject used for the lookup after alias folding."
                    },
                    "rit": {
                      "type": "number",
                      "description": "The RIT score that was resolved."
                    },
                    "rit50GradePosition": {
                      "type": "number",
                      "description": "Grade position at the 50th percentile for the resolved RIT."
                    },
                    "rit90GradePosition": {
                      "type": "number",
                      "description": "Grade position at the 90th percentile for the resolved RIT."
                    },
                    "mapInferredHighestMasteredGrade": {
                      "type": "integer",
                      "description": "The highest whole grade considered mastered based on the r90 grade position."
                    },
                    "mapInferredWorkingGrade": {
                      "type": "integer",
                      "description": "The grade the student is currently working in based on the r90 grade position."
                    },
                    "mapInferredEffectiveGrade": {
                      "type": "integer",
                      "description": "The effective instructional grade derived from the r90 grade band."
                    },
                    "mapInferredStartingGrade": {
                      "type": "integer",
                      "description": "The lowest grade in the effective-grade band, used as a placement floor."
                    },
                    "mapInferredMaximumPlacementGrade": {
                      "type": "integer",
                      "description": "The maximum grade for placement purposes derived from the grade band ceiling."
                    },
                    "rit90GradeBandPercent": {
                      "type": "number",
                      "description": "Fractional progress through the current grade band at the 90th percentile, expressed as a decimal between 0 and 1."
                    },
                    "normsSet": {
                      "type": "string",
                      "enum": [
                        "2020",
                        "2025"
                      ],
                      "description": "The norms edition used for this lookup."
                    },
                    "tableVersion": {
                      "type": "string",
                      "description": "The table version resolved for this lookup."
                    },
                    "sourcePointKind": {
                      "type": "string",
                      "enum": [
                        "exact",
                        "interpolated",
                        "extrapolated",
                        "source_missing"
                      ],
                      "description": "Indicates how the grade positions were derived: exact match from table, interpolated between two stored points, extrapolated beyond table range, or source data missing."
                    },
                    "interpolationRitRange": {
                      "type": "array",
                      "items": {
                        "type": "integer"
                      },
                      "minItems": 2,
                      "maxItems": 2,
                      "description": "When sourcePointKind is 'interpolated', the two bounding integer RIT scores used. Null for exact matches or when source is missing.",
                      "nullable": true
                    },
                    "sourceRef": {
                      "type": "string",
                      "description": "Source reference URI for the resolved reference data."
                    }
                  },
                  "required": [
                    "subjectId",
                    "tableSubjectId",
                    "rit",
                    "rit50GradePosition",
                    "rit90GradePosition",
                    "mapInferredHighestMasteredGrade",
                    "mapInferredWorkingGrade",
                    "mapInferredEffectiveGrade",
                    "mapInferredStartingGrade",
                    "mapInferredMaximumPlacementGrade",
                    "rit90GradeBandPercent",
                    "normsSet",
                    "tableVersion",
                    "sourcePointKind",
                    "interpolationRitRange",
                    "sourceRef"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/r90": {
      "get": {
        "operationId": "lookupRitToGradeR90Alias",
        "summary": "Lookup RIT-to-grade position (r90 alias)",
        "description": "Deprecated alias for lookupRitToGrade. Delegates to the same calculator and returns an identical response envelope. Retained for backward compatibility with existing consumers.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "RIT-to-grade reference"
        ],
        "parameters": [
          {
            "name": "subjectId",
            "in": "query",
            "required": true,
            "description": "Canonical MAP/RIT subject id. Vocabulary and writing are folded to their parent table subject at lookup time.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science",
                "vocabulary",
                "writing"
              ]
            }
          },
          {
            "name": "rit",
            "in": "query",
            "required": true,
            "description": "The RIT score to resolve.",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "normsSet",
            "in": "query",
            "required": false,
            "description": "NWEA norms edition. Defaults to the current active norms set when omitted.",
            "schema": {
              "type": "string",
              "enum": [
                "2020",
                "2025"
              ]
            }
          },
          {
            "name": "tableVersion",
            "in": "query",
            "required": false,
            "description": "Explicit table version to resolve against.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": true,
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "subjectId": {
                      "type": "string",
                      "enum": [
                        "math",
                        "reading",
                        "language",
                        "science",
                        "vocabulary",
                        "writing"
                      ],
                      "description": "The requested subject id echoed back."
                    },
                    "tableSubjectId": {
                      "type": "string",
                      "enum": [
                        "math",
                        "reading",
                        "language",
                        "science"
                      ],
                      "description": "The canonical 4-value table subject used for the lookup after alias folding."
                    },
                    "rit": {
                      "type": "number",
                      "description": "The RIT score that was resolved."
                    },
                    "rit50GradePosition": {
                      "type": "number",
                      "description": "Grade position at the 50th percentile for the resolved RIT."
                    },
                    "rit90GradePosition": {
                      "type": "number",
                      "description": "Grade position at the 90th percentile for the resolved RIT."
                    },
                    "mapInferredHighestMasteredGrade": {
                      "type": "integer",
                      "description": "The highest whole grade considered mastered based on the r90 grade position."
                    },
                    "mapInferredWorkingGrade": {
                      "type": "integer",
                      "description": "The grade the student is currently working in based on the r90 grade position."
                    },
                    "mapInferredEffectiveGrade": {
                      "type": "integer",
                      "description": "The effective instructional grade derived from the r90 grade band."
                    },
                    "mapInferredStartingGrade": {
                      "type": "integer",
                      "description": "The lowest grade in the effective-grade band."
                    },
                    "mapInferredMaximumPlacementGrade": {
                      "type": "integer",
                      "description": "The maximum grade for placement purposes."
                    },
                    "rit90GradeBandPercent": {
                      "type": "number",
                      "description": "Fractional progress through the current grade band at the 90th percentile."
                    },
                    "normsSet": {
                      "type": "string",
                      "enum": [
                        "2020",
                        "2025"
                      ],
                      "description": "The norms edition used for this lookup."
                    },
                    "tableVersion": {
                      "type": "string",
                      "description": "The table version resolved for this lookup."
                    },
                    "sourcePointKind": {
                      "type": "string",
                      "enum": [
                        "exact",
                        "interpolated",
                        "extrapolated",
                        "source_missing"
                      ],
                      "description": "How the grade positions were derived."
                    },
                    "interpolationRitRange": {
                      "type": "array",
                      "items": {
                        "type": "integer"
                      },
                      "minItems": 2,
                      "maxItems": 2,
                      "description": "The two bounding integer RIT scores used for interpolation. Null when not interpolated.",
                      "nullable": true
                    },
                    "sourceRef": {
                      "type": "string",
                      "description": "Source reference URI for the resolved reference data."
                    }
                  },
                  "required": [
                    "subjectId",
                    "tableSubjectId",
                    "rit",
                    "rit50GradePosition",
                    "rit90GradePosition",
                    "mapInferredHighestMasteredGrade",
                    "mapInferredWorkingGrade",
                    "mapInferredEffectiveGrade",
                    "mapInferredStartingGrade",
                    "mapInferredMaximumPlacementGrade",
                    "rit90GradeBandPercent",
                    "normsSet",
                    "tableVersion",
                    "sourcePointKind",
                    "interpolationRitRange",
                    "sourceRef"
                  ],
                  "additionalProperties": false
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/rit-to-grade/table": {
      "get": {
        "operationId": "getRitToGradeTable",
        "summary": "List RIT-to-grade reference table",
        "description": "Returns the raw reference table rows with optional filters. This is a plain list endpoint over the stored reference data, not a computed read.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "RIT-to-grade reference"
        ],
        "parameters": [
          {
            "name": "subjectId",
            "in": "query",
            "description": "Filter by MAP-measured subject.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science"
              ]
            },
            "x-filter": {
              "column": "subjectId",
              "operator": "eq"
            }
          },
          {
            "name": "normsSet",
            "in": "query",
            "description": "Filter by NWEA norms edition.",
            "schema": {
              "type": "string",
              "enum": [
                "2020",
                "2025"
              ]
            },
            "x-filter": {
              "column": "normsSet",
              "operator": "eq"
            }
          },
          {
            "name": "tableVersion",
            "in": "query",
            "description": "Filter by table version string.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "tableVersion",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RitToGradeReference"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    },
    "/nweamap/v1/r90/table": {
      "get": {
        "operationId": "getRitToGradeTableR90Alias",
        "summary": "List RIT-to-grade reference table (r90 alias)",
        "description": "Deprecated alias for getRitToGradeTable. Returns the same reference table rows. Retained for backward compatibility.\n\n> **Auth required:** a verified bearer token is required.",
        "tags": [
          "RIT-to-grade reference"
        ],
        "parameters": [
          {
            "name": "subjectId",
            "in": "query",
            "description": "Filter by MAP-measured subject.",
            "schema": {
              "type": "string",
              "enum": [
                "math",
                "reading",
                "language",
                "science"
              ]
            },
            "x-filter": {
              "column": "subjectId",
              "operator": "eq"
            }
          },
          {
            "name": "normsSet",
            "in": "query",
            "description": "Filter by NWEA norms edition.",
            "schema": {
              "type": "string",
              "enum": [
                "2020",
                "2025"
              ]
            },
            "x-filter": {
              "column": "normsSet",
              "operator": "eq"
            }
          },
          {
            "name": "tableVersion",
            "in": "query",
            "description": "Filter by table version string.",
            "schema": {
              "type": "string"
            },
            "x-filter": {
              "column": "tableVersion",
              "operator": "eq"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Maximum number of items to return on this page (clamped server-side).",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "description": "Opaque pagination cursor — pass the previous page's `nextCursor` to fetch the next page.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "deprecated": true,
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "responses": {
          "200": {
            "description": "OK.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "required": [
                    "data",
                    "nextCursor"
                  ],
                  "properties": {
                    "data": {
                      "type": "array",
                      "items": {
                        "$ref": "#/components/schemas/RitToGradeReference"
                      }
                    },
                    "nextCursor": {
                      "type": [
                        "string",
                        "null"
                      ],
                      "description": "Cursor for the next page, or null when this is the last page."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Bad Request.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "401": {
            "description": "Unauthorized.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "403": {
            "description": "Forbidden.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "Not Found.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "409": {
            "description": "Conflict.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "500": {
            "description": "Internal Server Error.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "501": {
            "description": "Not Implemented.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "MapAssessmentResult": {
        "type": "object",
        "properties": {
          "nweaAccountId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Tenant-local NWEA account partition supplied to the import. It is not a platform tenant and is intentionally not a OneRoster foreign key."
          },
          "studentId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA `StudentID` for the assessed student, preserved as an external MAP identifier for downstream identity resolution."
          },
          "studentStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA `Student_StateID` for the assessed student. Together with `studentId` it preserves the CDF identity tuple without asserting a roster FK."
          },
          "termId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Canonical MAP term key parsed at import time from the raw CDF `TermName`, such as `spring-2025-2026`. Public reads filter by this canonical key, not by regexing the source term string."
          },
          "canonicalTerm": {
            "type": "object",
            "properties": {
              "season": {
                "type": "string",
                "enum": [
                  "fall",
                  "winter",
                  "spring",
                  "summer"
                ],
                "description": "Canonical MAP season parsed at import time."
              },
              "schoolYear": {
                "type": "string",
                "pattern": "^[0-9]{4}-[0-9]{4}$",
                "description": "Canonical school-year span parsed from the NWEA term name."
              }
            },
            "required": [
              "season",
              "schoolYear"
            ],
            "description": "Structured term metadata set by the import hook so consumers never infer term season or year at read time.",
            "additionalProperties": false
          },
          "subjectId": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical MAP/RIT subject id set at write time by the import alias fold. Public read filters must use these canonical ids; display aliases such as `Mathematics`, `Math`, `ELA`, `Vocab`, and `FastMath` are rejected elsewhere."
          },
          "normsSet": {
            "type": "string",
            "enum": [
              "2020",
              "2025"
            ],
            "description": "NWEA norms edition classified at import time. The row carries the edition explicitly so reports can regenerate under a selected norms set instead of relying on a hidden constant."
          },
          "rit": {
            "type": "integer",
            "minimum": 100,
            "maximum": 350,
            "description": "The test-of-record RIT score for this student, term, and subject."
          },
          "percentile": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 99,
            "description": "Percentile rank if available from the norms lookup; null when norms data is unavailable for this sitting."
          },
          "ritStandardError": {
            "type": [
              "number",
              "null"
            ],
            "minimum": 0,
            "description": "Standard error of the RIT measurement; null when not reported by NWEA for this sitting."
          },
          "isTestOfRecord": {
            "type": "boolean",
            "description": "Always true for rows in this table; the entity exclusively holds test-of-record materializations."
          },
          "testOfRecordReason": {
            "type": "string",
            "enum": [
              "highest_rit",
              "latest_date",
              "largest_test_id"
            ],
            "description": "The deterministic tie-breaking rule that selected this sitting as the test of record."
          },
          "growthMeasureYn": {
            "type": [
              "boolean",
              "null"
            ],
            "description": "Whether this sitting counts as a growth measure per NWEA classification; null when the source CDF did not populate the field."
          },
          "testStartDate": {
            "type": "string",
            "minLength": 1,
            "description": "The test start date from the source CDF sitting row."
          },
          "testStartTime": {
            "type": "string",
            "minLength": 1,
            "description": "The test start time from the source CDF sitting row."
          },
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "Import receipt id that last materialized this test-of-record row."
          },
          "sourceRawKey": {
            "type": "string",
            "minLength": 1,
            "description": "Serialized natural key of the raw CDF AssessmentResults row that was selected as the test of record."
          },
          "sourceRowHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "Canonical SHA-256 hash of the source CDF row, used for audit and deterministic re-import comparisons."
          },
          "materializedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Instant the import hook last materialized this test-of-record row."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "nweaAccountId",
          "studentId",
          "studentStateId",
          "termId",
          "canonicalTerm",
          "subjectId",
          "normsSet",
          "rit",
          "isTestOfRecord",
          "testOfRecordReason",
          "testStartDate",
          "testStartTime",
          "mapImportId",
          "sourceRawKey",
          "sourceRowHash",
          "materializedAt",
          "updatedAt"
        ]
      },
      "MapGoalStrand": {
        "type": "object",
        "properties": {
          "nweaAccountId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Tenant-local NWEA account partition supplied to the import. It is not a platform tenant and is intentionally not a OneRoster foreign key."
          },
          "studentId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA `StudentID` for the assessed student, preserved as an external MAP identifier for downstream identity resolution."
          },
          "studentStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA `Student_StateID` for the assessed student. Together with `studentId` it preserves the CDF identity tuple without asserting a roster FK."
          },
          "termId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Canonical MAP term key parsed at import time from the raw CDF `TermName`, such as `spring-2025-2026`. Public reads filter by this canonical key, not by regexing the source term string."
          },
          "canonicalTerm": {
            "type": "object",
            "properties": {
              "season": {
                "type": "string",
                "enum": [
                  "fall",
                  "winter",
                  "spring",
                  "summer"
                ],
                "description": "Canonical MAP season parsed at import time."
              },
              "schoolYear": {
                "type": "string",
                "pattern": "^[0-9]{4}-[0-9]{4}$",
                "description": "Canonical school-year span parsed from the NWEA term name."
              }
            },
            "required": [
              "season",
              "schoolYear"
            ],
            "description": "Structured term metadata set by the import hook so consumers never infer term season or year at read time.",
            "additionalProperties": false
          },
          "subjectId": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical MAP/RIT subject id set at write time by the import alias fold. Public read filters must use these canonical ids; display aliases such as `Mathematics`, `Math`, `ELA`, `Vocab`, and `FastMath` are rejected elsewhere."
          },
          "normsSet": {
            "type": "string",
            "enum": [
              "2020",
              "2025"
            ],
            "description": "NWEA norms edition classified at import time. The row carries the edition explicitly so reports can regenerate under a selected norms set instead of relying on a hidden constant."
          },
          "goalStrandId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "description": "Canonical strand identifier derived by the import hook from the NWEA goal block. It is stable within the account, subject, term, and student result and is the final natural-key leg."
          },
          "goalName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "Human-readable NWEA goal or strand name from the source CDF goal block, retained for report display and audit."
          },
          "sourceGoalPosition": {
            "type": "integer",
            "minimum": 1,
            "maximum": 8,
            "description": "The 1-based positional CDF goal block (`Goal1` through `Goal8`) unpivoted into this row. It is audit evidence only; row identity uses `goalStrandId`."
          },
          "overallRit": {
            "type": "integer",
            "minimum": 100,
            "maximum": 350,
            "description": "The selected test-of-record overall RIT score copied from `mapAssessmentResult.rit` so `goalGap` can be calculated from the exact result used for the strand row."
          },
          "strandRit": {
            "type": "integer",
            "minimum": 100,
            "maximum": 350,
            "description": "The NWEA strand RIT score from the goal block."
          },
          "strandStandardError": {
            "type": "number",
            "minimum": 0,
            "description": "The NWEA strand standard error from the goal block."
          },
          "goalAdjective": {
            "type": "string",
            "enum": [
              "low",
              "low_average",
              "average",
              "high_average",
              "high"
            ],
            "description": "Canonicalized NWEA goal adjective for the strand. The import hook maps source spellings such as `LoAvg`, `Avg`, and `HiAvg` into this closed vocabulary."
          },
          "goalGap": {
            "type": "integer",
            "minimum": -250,
            "maximum": 250,
            "description": "Difference between the strand RIT and the selected overall RIT: `strandRit - overallRit`. The import hook calculates and persists this value."
          },
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "Import receipt id that last materialized this strand row. The inherited module anchor defines the tenant-carrying FK to `mapImport`; this fragment keeps the evidence field without asserting an FK until that target is present in the loaded module."
          },
          "sourceRawKey": {
            "type": "string",
            "minLength": 1,
            "description": "Opaque serialized key of the raw CDF AssessmentResults row used as source evidence for this strand."
          },
          "sourceRowHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "Canonical SHA-256 hash of the source CDF row that produced this strand, used for audit and deterministic re-import comparisons."
          },
          "materializedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Instant the import hook last materialized this hook-written fact row."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "nweaAccountId",
          "studentId",
          "studentStateId",
          "termId",
          "canonicalTerm",
          "subjectId",
          "normsSet",
          "goalStrandId",
          "goalName",
          "sourceGoalPosition",
          "overallRit",
          "strandRit",
          "strandStandardError",
          "goalAdjective",
          "goalGap",
          "mapImportId",
          "materializedAt",
          "updatedAt"
        ]
      },
      "MapImport": {
        "type": "object",
        "properties": {
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "Unique receipt identifier generated server-side for the import operation."
          },
          "nweaAccountId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Tenant-local NWEA account partition supplied in the import request."
          },
          "termName": {
            "type": "string",
            "minLength": 1,
            "description": "The raw NWEA term name from the import request (e.g. 'Spring 2025-2026'). Preserved verbatim for audit; canonical parsing happens downstream."
          },
          "status": {
            "type": "string",
            "enum": [
              "completed",
              "no_op",
              "partial"
            ],
            "description": "Import outcome. `completed` means all rows applied successfully; `no_op` means the bundle hash matched an existing import with no changes; `partial` means some rows had errors but the valid subset was applied."
          },
          "bundleHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "Canonical SHA-256 hash of the JSON-serialized bundle payload, used for idempotency detection and audit."
          },
          "rowCounts": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer",
                "minimum": 0,
                "description": "Total number of rows in the bundle."
              },
              "inserted": {
                "type": "integer",
                "minimum": 0,
                "description": "Number of new rows inserted."
              },
              "updated": {
                "type": "integer",
                "minimum": 0,
                "description": "Number of existing rows updated with changed data."
              },
              "softDeleted": {
                "type": "integer",
                "minimum": 0,
                "description": "Number of rows soft-deleted because they were absent from the authoritative bundle."
              },
              "skipped": {
                "type": "integer",
                "minimum": 0,
                "description": "Number of rows skipped because their content hash matched the existing row."
              },
              "errors": {
                "type": "integer",
                "minimum": 0,
                "description": "Number of rows that failed validation and were not applied."
              }
            },
            "required": [
              "total",
              "inserted",
              "updated",
              "softDeleted",
              "skipped",
              "errors"
            ],
            "description": "Breakdown of row-level outcomes for the import operation.",
            "additionalProperties": false
          },
          "problemSummary": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "totalProblems": {
                "type": "integer",
                "minimum": 0,
                "description": "Total number of row-level problems across all files."
              },
              "byFile": {
                "type": "object",
                "description": "Problem counts keyed by source file name.",
                "additionalProperties": {
                  "type": "object",
                  "required": [
                    "problems"
                  ],
                  "additionalProperties": false,
                  "properties": {
                    "problems": {
                      "type": "integer",
                      "minimum": 0,
                      "description": "Number of problems in this source file."
                    }
                  }
                }
              }
            },
            "required": [
              "totalProblems",
              "byFile"
            ],
            "description": "Summary of row-level problems encountered during import. Null when there are no problems.",
            "additionalProperties": false
          },
          "appliedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Instant when the import was applied and fact rows were materialized."
          },
          "importedBy": {
            "type": "string",
            "description": "The principal (user or service account) who performed the import. Set server-side from the authenticated caller."
          }
        },
        "required": [
          "mapImportId",
          "nweaAccountId",
          "termName",
          "status",
          "bundleHash",
          "rowCounts",
          "appliedAt",
          "importedBy"
        ]
      },
      "MapImportFile": {
        "type": "object",
        "properties": {
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "Import receipt id that owns this file evidence row.",
            "x-references": "mapImport.mapImportId"
          },
          "sourceFile": {
            "type": "string",
            "enum": [
              "AssessmentResults",
              "StudentBySchool",
              "ClassAssignments",
              "ProgramAssignments",
              "Accommodations"
            ],
            "description": "The CDF file type within the import batch that this row describes."
          },
          "rowCount": {
            "type": "integer",
            "minimum": 0,
            "description": "Total number of data rows in this source file."
          },
          "validRowCount": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of rows that passed validation."
          },
          "errorRowCount": {
            "type": "integer",
            "minimum": 0,
            "description": "Number of rows that failed validation."
          },
          "headerHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "SHA-256 hash of the header row, used to detect schema drift between imports."
          },
          "headerColumns": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Ordered list of CSV column headers found in the source file."
          },
          "processedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Instant when processing completed for this file within the import batch."
          }
        },
        "required": [
          "mapImportId",
          "sourceFile",
          "rowCount",
          "validRowCount",
          "errorRowCount",
          "headerHash",
          "headerColumns",
          "processedAt"
        ]
      },
      "MapNormTable": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Stable identifier derived deterministically from the natural key tuple (normsSet, subjectId, gradePosition, percentile, tableVersion). Client-supplied so rows are idempotent across bulk loads."
          },
          "normsSet": {
            "type": "string",
            "enum": [
              "2020",
              "2025"
            ],
            "description": "NWEA norms edition year. Each edition publishes an independent percentile-to-RIT mapping."
          },
          "subjectId": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science"
            ],
            "description": "Canonical MAP subject id. The norms table covers the four MAP-measured subjects only."
          },
          "gradePosition": {
            "type": "integer",
            "minimum": 0,
            "maximum": 12,
            "description": "Grade level where K=0 through 12. Each grade has its own percentile-to-RIT curve."
          },
          "percentile": {
            "type": "integer",
            "minimum": 1,
            "maximum": 99,
            "description": "Percentile rank within the norms edition, subject, and grade."
          },
          "ritScore": {
            "type": "integer",
            "minimum": 100,
            "maximum": 350,
            "description": "The RIT score at this percentile for the given norms edition, subject, and grade."
          },
          "fallToWinterGrowth": {
            "type": [
              "number",
              "null"
            ],
            "description": "Typical growth for the fall-to-winter testing window at this percentile point. Null when the norms edition does not publish this window for the subject/grade."
          },
          "fallToSpringGrowth": {
            "type": [
              "number",
              "null"
            ],
            "description": "Typical growth for the fall-to-spring testing window at this percentile point. Null when the norms edition does not publish this window for the subject/grade."
          },
          "winterToSpringGrowth": {
            "type": [
              "number",
              "null"
            ],
            "description": "Typical growth for the winter-to-spring testing window at this percentile point. Null when the norms edition does not publish this window for the subject/grade."
          },
          "springToSpringGrowth": {
            "type": [
              "number",
              "null"
            ],
            "description": "Typical growth for the spring-to-spring testing window at this percentile point. Null when the norms edition does not publish this window for the subject/grade."
          },
          "fallToFallGrowth": {
            "type": [
              "number",
              "null"
            ],
            "description": "Typical growth for the fall-to-fall testing window at this percentile point. Null when the norms edition does not publish this window for the subject/grade."
          },
          "winterToWinterGrowth": {
            "type": [
              "number",
              "null"
            ],
            "description": "Typical growth for the winter-to-winter testing window at this percentile point. Null when the norms edition does not publish this window for the subject/grade."
          },
          "tableVersion": {
            "type": "string",
            "minLength": 1,
            "description": "Version tag for the loaded norms table snapshot, e.g. 'nweamap.norms.2025.v2026-06-15'. Allows multiple versions to coexist during transitions."
          },
          "sourceRef": {
            "type": "string",
            "description": "Provenance reference indicating the authoritative source of this norm row, e.g. 'nwea:/norms/2025'."
          }
        },
        "required": [
          "id",
          "normsSet",
          "subjectId",
          "gradePosition",
          "percentile",
          "ritScore",
          "fallToWinterGrowth",
          "fallToSpringGrowth",
          "winterToSpringGrowth",
          "springToSpringGrowth",
          "fallToFallGrowth",
          "winterToWinterGrowth",
          "tableVersion",
          "sourceRef"
        ]
      },
      "MapProjection": {
        "type": "object",
        "properties": {
          "nweaAccountId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Tenant-local NWEA account partition supplied to the import. It is not a platform tenant and is intentionally not a OneRoster foreign key."
          },
          "studentId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA `StudentID` for the assessed student, preserved as an external MAP identifier."
          },
          "studentStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA `Student_StateID` for the assessed student, preserved with `studentId` as part of the CDF identity tuple."
          },
          "subjectId": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science",
              "vocabulary",
              "writing"
            ],
            "description": "Canonical MAP/RIT subject id set at write time by the import alias fold. Public read filters use canonical ids only; display aliases are rejected elsewhere."
          },
          "startTermId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Canonical term id for the assessment result from which the forward projection starts."
          },
          "canonicalStartTerm": {
            "type": "object",
            "properties": {
              "season": {
                "type": "string",
                "enum": [
                  "fall",
                  "winter",
                  "spring",
                  "summer"
                ],
                "description": "Canonical MAP season parsed at import time."
              },
              "schoolYear": {
                "type": "string",
                "pattern": "^[0-9]{4}-[0-9]{4}$",
                "description": "Canonical school-year span parsed from the NWEA term name."
              }
            },
            "required": [
              "season",
              "schoolYear"
            ],
            "description": "Structured term metadata for the starting MAP term, set by the import hook.",
            "additionalProperties": false
          },
          "projectedTermId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80,
            "description": "Canonical future term id for the NWEA projection row."
          },
          "canonicalProjectedTerm": {
            "type": "object",
            "properties": {
              "season": {
                "type": "string",
                "enum": [
                  "fall",
                  "winter",
                  "spring",
                  "summer"
                ],
                "description": "Canonical MAP season for the projected term."
              },
              "schoolYear": {
                "type": "string",
                "pattern": "^[0-9]{4}-[0-9]{4}$",
                "description": "Canonical school-year span for the projected term."
              }
            },
            "required": [
              "season",
              "schoolYear"
            ],
            "description": "Structured term metadata for the projected MAP term. The projected term may not yet have a result row, so it is not modeled as an enforced FK.",
            "additionalProperties": false
          },
          "normsSet": {
            "type": "string",
            "enum": [
              "2020",
              "2025"
            ],
            "description": "NWEA norms edition threaded on every projection row so reports can regenerate under either edition by changing a parameter."
          },
          "growthWindow": {
            "type": "string",
            "enum": [
              "fall_to_winter",
              "fall_to_spring",
              "fall_to_summer",
              "winter_to_spring",
              "winter_to_summer",
              "spring_to_summer",
              "custom"
            ],
            "description": "Canonical NWEA growth window for the projection, derived from the CDF projected-growth or typical-growth source columns at import."
          },
          "startRit": {
            "type": "integer",
            "minimum": 100,
            "maximum": 350,
            "description": "RIT score at the starting term, copied from the typed MAP result fact used for this projection."
          },
          "projectedGrowth": {
            "type": "number",
            "description": "NWEA projected growth from the starting term to the projected term, sourced from the CDF projected-growth columns."
          },
          "projectedRit": {
            "type": "number",
            "minimum": 100,
            "maximum": 350,
            "description": "Projected RIT for the projected term. The import hook materializes this as `startRit + projectedGrowth` from the same source columns used for `projectedGrowth`."
          },
          "typicalGrowth": {
            "type": "number",
            "description": "NWEA typical growth for the same subject, grade/term context, growth window, and norms edition. It is an input to downstream analytics, not a Growth X rollup."
          },
          "observedGrowth": {
            "type": "number",
            "description": "Observed growth when an assessment result exists for the projected term. It is nullable for forward-looking projections and is consumed by Analytics when computing Growth X."
          },
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "Import receipt id that last materialized this projection row. The inherited module anchor defines the tenant-carrying FK to `mapImport`; this fragment keeps the evidence field without asserting an FK until that target is present in the loaded module."
          },
          "sourceProjectedGrowthColumn": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "description": "Name of the CDF `*ProjectedGrowth` source column used to derive this row."
          },
          "sourceTypicalGrowthColumn": {
            "type": "string",
            "minLength": 1,
            "maxLength": 160,
            "description": "Name of the CDF `Typical*Growth` source column used to derive this row."
          },
          "sourceRawKey": {
            "type": "string",
            "minLength": 1,
            "description": "Opaque serialized key of the raw CDF AssessmentResults row used as source evidence for this projection."
          },
          "sourceRowHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "Canonical SHA-256 hash of the source CDF row that produced this projection, used for audit and deterministic re-import comparisons."
          },
          "materializedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Instant the import hook last materialized this hook-written fact row."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "nweaAccountId",
          "studentId",
          "studentStateId",
          "subjectId",
          "startTermId",
          "canonicalStartTerm",
          "projectedTermId",
          "canonicalProjectedTerm",
          "normsSet",
          "growthWindow",
          "startRit",
          "projectedGrowth",
          "projectedRit",
          "typicalGrowth",
          "mapImportId",
          "materializedAt",
          "updatedAt"
        ]
      },
      "MapRawAccommodation": {
        "type": "object",
        "properties": {
          "nweaAccountId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Tenant-local NWEA account partition."
          },
          "termName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Raw NWEA TermName from the CDF export row."
          },
          "studentId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA StudentID from the CDF export."
          },
          "studentStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA Student_StateID from the CDF export."
          },
          "testId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA test identifier from the CDF export."
          },
          "accommodationCategory": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Accommodation category from the CDF export."
          },
          "accommodation": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "Specific accommodation from the CDF export."
          },
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "FK to the mapImport that ingested this row.",
            "x-references": "mapImport.mapImportId"
          },
          "sourceRowNumber": {
            "type": "integer",
            "minimum": 1,
            "description": "Position of this row in the source CSV file."
          },
          "sourceRowHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "SHA-256 hash of the source CSV row for deduplication and audit."
          },
          "ingestedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was first ingested."
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was last modified."
          },
          "deletionImportId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Import that soft-deleted this row, if applicable."
          },
          "deletionReason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Reason for soft deletion, if applicable."
          },
          "cdf": {
            "type": "object",
            "description": "Raw CDF fields from the source CSV row preserved as a jsonb blob."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "nweaAccountId",
          "termName",
          "studentId",
          "studentStateId",
          "testId",
          "accommodationCategory",
          "accommodation",
          "mapImportId",
          "sourceRowNumber",
          "sourceRowHash",
          "ingestedAt",
          "modifiedAt",
          "cdf",
          "updatedAt"
        ]
      },
      "MapRawAssessmentResult": {
        "type": "object",
        "properties": {
          "nweaAccountId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Tenant-local NWEA account partition."
          },
          "termName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Raw NWEA TermName from the CDF export row."
          },
          "studentId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA StudentID from the CDF export."
          },
          "studentStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA Student_StateID from the CDF export."
          },
          "subject": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Raw NWEA subject name from the CDF export (not the canonical enum)."
          },
          "course": {
            "type": "string",
            "minLength": 1,
            "maxLength": 200,
            "description": "Course name from the CDF export."
          },
          "testId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA test identifier from the CDF export."
          },
          "testStartDate": {
            "type": "string",
            "minLength": 1,
            "maxLength": 30,
            "description": "Test start date from the CDF export."
          },
          "testStartTime": {
            "type": "string",
            "minLength": 1,
            "maxLength": 30,
            "description": "Test start time from the CDF export."
          },
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "FK to the mapImport that ingested this row.",
            "x-references": "mapImport.mapImportId"
          },
          "sourceRowNumber": {
            "type": "integer",
            "minimum": 1,
            "description": "Position of this row in the source CSV file."
          },
          "sourceRowHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "SHA-256 hash of the source CSV row for deduplication and audit."
          },
          "ingestedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was first ingested."
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was last modified."
          },
          "deletionImportId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Import that soft-deleted this row, if applicable."
          },
          "deletionReason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Reason for soft deletion, if applicable."
          },
          "cdf": {
            "type": "object",
            "description": "Raw CDF fields from the source CSV row preserved as a jsonb blob."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "nweaAccountId",
          "termName",
          "studentId",
          "studentStateId",
          "subject",
          "course",
          "testId",
          "testStartDate",
          "testStartTime",
          "mapImportId",
          "sourceRowNumber",
          "sourceRowHash",
          "ingestedAt",
          "modifiedAt",
          "cdf",
          "updatedAt"
        ]
      },
      "MapRawClassAssignment": {
        "type": "object",
        "properties": {
          "nweaAccountId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Tenant-local NWEA account partition."
          },
          "termName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Raw NWEA TermName from the CDF export row."
          },
          "schoolStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "State-assigned school identifier from the CDF export."
          },
          "studentId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA StudentID from the CDF export."
          },
          "studentStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA Student_StateID from the CDF export."
          },
          "className": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "Class name from the CDF export."
          },
          "teacherId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA teacher identifier from the CDF export."
          },
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "FK to the mapImport that ingested this row.",
            "x-references": "mapImport.mapImportId"
          },
          "sourceRowNumber": {
            "type": "integer",
            "minimum": 1,
            "description": "Position of this row in the source CSV file."
          },
          "sourceRowHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "SHA-256 hash of the source CSV row for deduplication and audit."
          },
          "ingestedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was first ingested."
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was last modified."
          },
          "deletionImportId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Import that soft-deleted this row, if applicable."
          },
          "deletionReason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Reason for soft deletion, if applicable."
          },
          "cdf": {
            "type": "object",
            "description": "Raw CDF fields from the source CSV row preserved as a jsonb blob."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "nweaAccountId",
          "termName",
          "schoolStateId",
          "studentId",
          "studentStateId",
          "className",
          "teacherId",
          "mapImportId",
          "sourceRowNumber",
          "sourceRowHash",
          "ingestedAt",
          "modifiedAt",
          "cdf",
          "updatedAt"
        ]
      },
      "MapRawProgramAssignment": {
        "type": "object",
        "properties": {
          "nweaAccountId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Tenant-local NWEA account partition."
          },
          "termName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Raw NWEA TermName from the CDF export row."
          },
          "studentId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA StudentID from the CDF export."
          },
          "studentStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA Student_StateID from the CDF export."
          },
          "program": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "Program name from the CDF export."
          },
          "nweaStandardProgram": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "NWEA standard program classification from the CDF export."
          },
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "FK to the mapImport that ingested this row.",
            "x-references": "mapImport.mapImportId"
          },
          "sourceRowNumber": {
            "type": "integer",
            "minimum": 1,
            "description": "Position of this row in the source CSV file."
          },
          "sourceRowHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "SHA-256 hash of the source CSV row for deduplication and audit."
          },
          "ingestedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was first ingested."
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was last modified."
          },
          "deletionImportId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Import that soft-deleted this row, if applicable."
          },
          "deletionReason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Reason for soft deletion, if applicable."
          },
          "cdf": {
            "type": "object",
            "description": "Raw CDF fields from the source CSV row preserved as a jsonb blob."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "nweaAccountId",
          "termName",
          "studentId",
          "studentStateId",
          "program",
          "nweaStandardProgram",
          "mapImportId",
          "sourceRowNumber",
          "sourceRowHash",
          "ingestedAt",
          "modifiedAt",
          "cdf",
          "updatedAt"
        ]
      },
      "MapRawStudentBySchool": {
        "type": "object",
        "properties": {
          "nweaAccountId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Tenant-local NWEA account partition."
          },
          "termName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "Raw NWEA TermName from the CDF export row."
          },
          "schoolStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "State-assigned school identifier from the CDF export."
          },
          "schoolName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "School name from the CDF export."
          },
          "studentId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA StudentID from the CDF export."
          },
          "studentStateId": {
            "type": "string",
            "minLength": 1,
            "maxLength": 120,
            "description": "NWEA Student_StateID from the CDF export."
          },
          "mapImportId": {
            "type": "string",
            "format": "uuid",
            "description": "FK to the mapImport that ingested this row.",
            "x-references": "mapImport.mapImportId"
          },
          "sourceRowNumber": {
            "type": "integer",
            "minimum": 1,
            "description": "Position of this row in the source CSV file."
          },
          "sourceRowHash": {
            "type": "string",
            "pattern": "^sha256:[0-9a-f]{64}$",
            "description": "SHA-256 hash of the source CSV row for deduplication and audit."
          },
          "ingestedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was first ingested."
          },
          "modifiedAt": {
            "type": "string",
            "format": "date-time",
            "description": "Timestamp when this row was last modified."
          },
          "deletionImportId": {
            "type": [
              "string",
              "null"
            ],
            "format": "uuid",
            "description": "Import that soft-deleted this row, if applicable."
          },
          "deletionReason": {
            "type": [
              "string",
              "null"
            ],
            "description": "Reason for soft deletion, if applicable."
          },
          "cdf": {
            "type": "object",
            "description": "Raw CDF fields from the source CSV row preserved as a jsonb blob."
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time",
            "readOnly": true,
            "description": "Server-managed last-update timestamp (RFC 3339). Read-only — never accepted on create or update."
          }
        },
        "required": [
          "nweaAccountId",
          "termName",
          "schoolStateId",
          "schoolName",
          "studentId",
          "studentStateId",
          "mapImportId",
          "sourceRowNumber",
          "sourceRowHash",
          "ingestedAt",
          "modifiedAt",
          "cdf",
          "updatedAt"
        ]
      },
      "RitToGradeReference": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid",
            "description": "Stable identifier derived deterministically from the natural key (normsSet, subjectId, ritScore, tableVersion). Client-supplied for this non-tenant-scoped reference table."
          },
          "normsSet": {
            "type": "string",
            "enum": [
              "2020",
              "2025"
            ],
            "description": "NWEA norms edition that governs the percentile mapping used to derive grade positions."
          },
          "subjectId": {
            "type": "string",
            "enum": [
              "math",
              "reading",
              "language",
              "science"
            ],
            "description": "MAP-measured subject. This is the 4-value subset of canonical subjects for which NWEA publishes RIT-to-grade norms."
          },
          "ritScore": {
            "type": "integer",
            "minimum": 100,
            "maximum": 350,
            "description": "The integer RIT point for which grade positions are stored. Each row represents one discrete RIT value in the reference table."
          },
          "r50Grade": {
            "type": "number",
            "description": "NWEA-published grade position at the 50th percentile for this RIT score, subject, and norms edition."
          },
          "r90Grade": {
            "type": "number",
            "description": "Alpha extrapolation grade position at the 90th percentile for this RIT score, subject, and norms edition."
          },
          "r50Provenance": {
            "type": "string",
            "enum": [
              "nwea_published",
              "alpha_extrapolated"
            ],
            "description": "Provenance of the r50Grade value indicating whether it was directly published by NWEA or extrapolated by Alpha."
          },
          "r90Provenance": {
            "type": "string",
            "enum": [
              "nwea_published",
              "alpha_extrapolated"
            ],
            "description": "Provenance of the r90Grade value indicating whether it was directly published by NWEA or extrapolated by Alpha."
          },
          "tableVersion": {
            "type": "string",
            "minLength": 1,
            "description": "Versioned table identifier that scopes the reference data to a specific import generation, e.g. 'nweamap.rit_to_grade.powerpath.v2026-06-15'."
          },
          "sourceRef": {
            "type": "string",
            "description": "Source reference URI indicating the origin of this reference data, e.g. 'powerpath:/powerpath/rit-to-grade'."
          }
        },
        "required": [
          "id",
          "normsSet",
          "subjectId",
          "ritScore",
          "r50Grade",
          "r90Grade",
          "r50Provenance",
          "r90Provenance",
          "tableVersion",
          "sourceRef"
        ]
      },
      "Problem": {
        "type": "object",
        "description": "RFC 7807 problem details.",
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "A URI identifying the problem type."
          },
          "title": {
            "type": "string",
            "description": "A short, human-readable summary of the problem."
          },
          "status": {
            "type": "integer",
            "description": "The HTTP status code."
          },
          "detail": {
            "type": "string",
            "description": "A human-readable explanation specific to this occurrence."
          },
          "instance": {
            "type": "string",
            "format": "uri",
            "description": "A URI identifying this occurrence."
          }
        },
        "required": [
          "title",
          "status"
        ]
      }
    },
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "servers": [
    {
      "url": "https://nweamap.platform4.alphaschool.dev"
    }
  ]
}
