platform3 / nweamap / 1edtech / customer_website

Customer API specification

Import NWEA MAP Growth CDFs and read stable MAP results without re-implementing dedupe.

This is the 1EdTech-facing TimeBack NWEAMap surface. It treats NWEA's Comprehensive Data File export as the upstream contract, mirrors the five CDF files losslessly, and adds only the platform-owned behavior that NWEA does not specify: tenant scope, import evidence, idempotency, soft deletion, and an explicit sittingScope selector.

1. CDF bundleFive NWEA files plus an import manifest for one tenant, NWEA account, and term.
2. Raw mirrorEvery NWEA header and value is preserved by source file, row number, hash, and import.
3. Current resultReal-time observations and CDF backfill update one projection, not parallel helper tables.
4. API readssittingScope selects test_of_record or all; clients do not dedupe.
Base URL
https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/implementation/api
Demo token
POST /dev/mint?tenantId=demo
Primary job
Build MAP Growth import, sync, and CDF-backed reporting workflows from NWEA pass-through plus documented gap-fill behavior.
Boundary
No report oracle, report contracts, golden cells, Growth X report assembly, Alpha report-specific RIT50/RIT90/Effective Grade assembly, norms calculators, term parser, or Alpha report graph logic. R6 keeps PowerPath RIT-to-grade reference lookup here. See NITD-018.
5raw NWEA CDF files mirrored 1:1
143AssessmentResults columns preserved
322rendered dictionary fields with provenance
Pass-through rule: NWEA field names, meanings, datatypes, lengths, and repeating blocks remain NWEA-owned. This page links to the data dictionary instead of copying the entire NWEA field-description workbook into the customer docs.

Quickstart

One copy-paste path from demo token to MAP result read

The same hierarchical canonical API root serves the public demo tenant and real tenants. Set NWEAMAP_BASE_URL or BASE_URL to the implementation URL below. The implementation deliverable must serve this path when it lands; consumers should never use a deploy-hash URL.

export NWEAMAP_BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/implementation/api"
export BASE_URL="$NWEAMAP_BASE_URL"

TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(printf '%s' "$TOKEN_JSON" | jq -r '.token')"

for SOURCE_FILE in StudentsBySchool.csv AssessmentResults.csv ClassAssignments.csv ProgramAssignments.csv AccommodationAssignment.csv; do
  curl -fsS "$BASE_URL/dev/cdf/$SOURCE_FILE" -o "$SOURCE_FILE"
done

RUN_ID="$(date +%Y%m%d%H%M%S)"
IMPORT_JSON="$(curl -fsS -X POST "$BASE_URL/nweamap/v1/imports" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: cdf-demo-$RUN_ID" \
  -F 'manifest={"nweaAccountId":"nwea-account-demo","termName":"Spring 2025-2026"};type=application/json' \
  -F "StudentsBySchool.csv=@./StudentsBySchool.csv;type=text/csv" \
  -F "AssessmentResults.csv=@./AssessmentResults.csv;type=text/csv" \
  -F "ClassAssignments.csv=@./ClassAssignments.csv;type=text/csv" \
  -F "ProgramAssignments.csv=@./ProgramAssignments.csv;type=text/csv" \
  -F "AccommodationAssignment.csv=@./AccommodationAssignment.csv;type=text/csv")"

IMPORT_ID="$(printf '%s' "$IMPORT_JSON" | jq -r '.import.import_id')"

curl -fsS "$BASE_URL/nweamap/v1/imports/$IMPORT_ID" \
  -H "Authorization: Bearer $TOKEN" | jq '.import.status, .import.row_counts'

curl -fsS "$BASE_URL/nweamap/v1/assessment-results?nweaAccountId=nwea-account-demo&termName=Spring%202025-2026&sittingScope=test_of_record&subject=Math&limit=10" \
  -H "Authorization: Bearer $TOKEN" | jq '.data[] | {student_id, subject, test_rit_score, is_test_of_record, test_of_record_reason}'

curl -fsS "$BASE_URL/nweamap/v1/r90?subject=math&rit=239" \
  -H "Authorization: Bearer $TOKEN" | jq '{r90_grade, effective_grade, rit90_grade_band_percent, source_ref}'

What the quickstart proves

  • BASE_URL is defined before every request.
  • /dev/mint?tenantId=demo gives cold readers a demo token and pre-seeds demo rows for read-only exploration.
  • /dev/cdf/{sourceFile} downloads the five generated demo CDF files before the multipart import.
  • The import is bulk-only and uses all five local CDF files downloaded from the same implementation.
  • The same import can be retried safely with idempotency controls.
  • sittingScope=test_of_record returns one deterministic result per student, subject, and term.

Authentication

Bearer JWTs with tenant routing and NWEAMap scopes

All routes except POST /dev/mint?tenantId=demo require Authorization: Bearer <jwt>. Tokens are HS256 signed with PLATFORM_JWT_SIGNING_SECRET, carry a platform tenantId, and authorize the route through nweamap:import, nweamap:read, or nweamap:admin. The NWEA account is not a platform tenant; it is a required tenant-local data partition.

Demo tenant

Mint with POST /dev/mint?tenantId=demo. Any non-demo selector is rejected on the public mint route. Minting also pre-seeds demo rows and returns the /dev/cdf sample-bundle link.

Real tenants

Real-tenant tokens are operator-minted out of band. Reviewers receive NWEAMAP_REVIEWER_JWT through .env.local.

Scope checks

Imports require nweamap:import; reads require nweamap:read; diagnostics may require nweamap:admin.

Shared platform substrate: PITD-005 auth and tenant scope and PITD-006 HTTP envelope and errors.

Errors

Typed Problems that repair imports without leaking PII

NWEAMap errors use the shared platform RFC 7807 envelope with stable NWEAMap codes, request identifiers, field errors, and row errors. Public Problems never echo raw student names, student identifiers, JWTs, or full CDF row payloads.

StatusWhen it appearsClient action
400Malformed query, missing CDF file, header mismatch, invalid row value, or invalid demo tenant selector.Fix the request or CDF file and retry with the same Idempotency-Key only if the body is unchanged.
401Missing, expired, or invalid Bearer JWT.Mint a new demo token or use an operator-minted tenant token.
403JWT tenant or scope cannot access the route, account, or import.Use a token with the correct tenantId and NWEAMap scope.
404Import or row id is not found inside the caller tenant and NWEA account scope.Check tenant, account, import id, and row id; do not infer cross-tenant existence.
409Idempotency-Key was reused with different bundle content.Retry with the original bundle for replay, or choose a fresh key for new content.
422Bundle parsed but one or more row values violated the NWEA/pass-through or platform gap-fill contract.Read rowErrors and fieldErrors, repair the file, and submit a new import.
Problem codeMeaningTrace
nweamap:invalid_bundleSubmitted bundle is not a valid CDF bundle.
nweamap:missing_fileRequired CDF file is absent.
nweamap:header_mismatchFile header differs from the NWEA workbook/CSV contract.
nweamap:row_validation_failedOne or more row values violate the documented field contract.
nweamap:idempotency_conflictIdempotency-Key was reused for different bundle content.
nweamap:unsupported_query_parameterRequest used a filter or sort key outside this dictionary.
nweamap:not_foundRequested import or row was not found in the caller's tenant/account scope.
{
  "type": "https://platform.timeback.com/problems/nweamap/header-mismatch",
  "title": "CDF header does not match the NWEA export contract",
  "status": 400,
  "code": "nweamap:header_mismatch",
  "detail": "AssessmentResults.csv has an unexpected column at position 24.",
  "requestId": "req_018f4b4e9c7a",
  "traceId": "trace_018f4b4e9c7a",
  "fieldErrors": [
    {
      "fileName": "AssessmentResults.csv",
      "field": "TestRITScore",
      "message": "Expected header at position 24."
    }
  ],
  "rowErrors": []
}

Workflows

The workflows implementation and integrators must be able to run

1. Import a CDF export

Submit exactly one five-file CDF bundle for one NWEA account and one term. The platform computes a canonical bundle hash and records file evidence.

2. Verify the import

Read /imports/{importId} until status is applied, failed, or no_op. Row counts and file states are the repair surface.

3. Read the test of record

Call /assessment-results?sittingScope=test_of_record. The server applies highest valid RIT, then latest start time, then larger TestID.

4. Audit retakes and invalidations

Call /assessment-results?sittingScope=all&includeDeleted=true to inspect raw sittings, retakes, invalidated rows, and soft-deleted history.

5. Poll for changes

Use modifiedSince, limit, and cursor on list endpoints. Webhooks are intentionally deferred.

6. Preserve NWEA vocabulary

NWEA source fields such as TermName, StudentID, GrowthMeasureYN, and NormsReferenceData stay source-named and source-meaninged.

7. Stop before Alpha report logic

Do not ask this 1EdTech API for exact MAP Quadrants cells, golden-cell verification, Growth X report assembly, Alpha report-specific RIT50/RIT90/Effective Grade assembly, or norms-flipped report graphs. Use this API for the R6 PowerPath RIT-to-grade reference lookup; Alpha assembles report context around it.

API reference

Endpoints

Paths below are relative to $BASE_URL. All field names in responses either match the data dictionary's platform sidecar names or preserve NWEA CDF headers exactly.

POST/dev/mint?tenantId=demo

Mint a demo token

Returns a short-lived HS256 Bearer JWT for the public demo tenant on the same deployment used by real tenants.

Auth
Unauthenticated. Restricted to tenantId=demo.
Scope
none
Request
NameInTypeRequiredDescription and trace
tenantIdqueryenum demoRequiredOnly demo is accepted. Any real tenant id is rejected; real-tenant tokens are operator-minted out of band.
Response
FieldTypeRequiredDescriptionTrace
tokenJWT stringRequiredBearer token signed with PLATFORM_JWT_SIGNING_SECRET and scoped to the demo tenant.
token_typeconst BearerRequiredAuthorization header token type.
tenant_idstringRequiredTenant id claim embedded in the token. Demo calls must use this token against the same BASE_URL.
scopesarray<string>RequiredIncludes demo-safe NWEAMap scopes such as nweamap:read and nweamap:import.
expires_attimestampRequiredExpiry time for the short-lived demo token.
linksobjectRequiredIncludes demoCdfBundle=/dev/cdf so cold integrators can download the sample CDF files before multipart import.
demo_cdf_bundlenweamap.demo_cdf_bundleRequiredManifest and five source-file URLs for the generated demo CDF bundle. Minting also pre-seeds demo rows for read-only exploration.

cURL

BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/implementation/api"
curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo"

Example response

{
  "token_type": "Bearer",
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.demo",
  "tenant_id": "demo",
  "scopes": [
    "nweamap:read",
    "nweamap:import"
  ],
  "expires_at": "2026-06-03T13:00:00Z",
  "links": {
    "demoCdfBundle": "/dev/cdf",
    "customerWebsite": "https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/customer_website#quickstart"
  },
  "demo_cdf_bundle": {
    "object": "nweamap.demo_cdf_bundle",
    "manifest": {
      "nweaAccountId": "nwea-account-demo",
      "termName": "Spring 2025-2026"
    },
    "files": [
      {
        "source_file": "StudentsBySchool.csv",
        "url": "/dev/cdf/StudentsBySchool.csv"
      },
      {
        "source_file": "AssessmentResults.csv",
        "url": "/dev/cdf/AssessmentResults.csv"
      },
      {
        "source_file": "ClassAssignments.csv",
        "url": "/dev/cdf/ClassAssignments.csv"
      },
      {
        "source_file": "ProgramAssignments.csv",
        "url": "/dev/cdf/ProgramAssignments.csv"
      },
      {
        "source_file": "AccommodationAssignment.csv",
        "url": "/dev/cdf/AccommodationAssignment.csv"
      }
    ]
  }
}
GET/dev/cdf

List demo CDF sample files

Returns the demo NWEA account, term, and download URLs for the five generated CDF files used by the cold quickstart.

Auth
Unauthenticated. Demo helper only.
Scope
none
Request
NameInTypeRequiredDescription and trace
Response
FieldTypeRequiredDescriptionTrace
objectconst nweamap.demo_cdf_bundleRequiredDescriptor object for the generated demo CDF bundle.
manifestobjectRequiredDemo nweaAccountId and termName to use in POST /nweamap/v1/imports.
filesarray<object>RequiredExactly one source_file and URL for each required CDF file.

cURL

BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/implementation/api"
curl -fsS "$BASE_URL/dev/cdf"

Example response

{
  "object": "nweamap.demo_cdf_bundle",
  "manifest": {
    "nweaAccountId": "nwea-account-demo",
    "termName": "Spring 2025-2026"
  },
  "files": [
    {
      "source_file": "StudentsBySchool.csv",
      "url": "/dev/cdf/StudentsBySchool.csv"
    },
    {
      "source_file": "AssessmentResults.csv",
      "url": "/dev/cdf/AssessmentResults.csv"
    },
    {
      "source_file": "ClassAssignments.csv",
      "url": "/dev/cdf/ClassAssignments.csv"
    },
    {
      "source_file": "ProgramAssignments.csv",
      "url": "/dev/cdf/ProgramAssignments.csv"
    },
    {
      "source_file": "AccommodationAssignment.csv",
      "url": "/dev/cdf/AccommodationAssignment.csv"
    }
  ]
}
GET/dev/cdf/{sourceFile}

Download one demo CDF file

Downloads one generated text/csv sample file so the multipart import cURL works for a cold reader with no local CDF bundle.

Auth
Unauthenticated. Demo helper only.
Scope
none
Request
NameInTypeRequiredDescription and trace
sourceFilepathenum StudentsBySchool.csv | AssessmentResults.csv | ClassAssignments.csv | ProgramAssignments.csv | AccommodationAssignment.csvRequiredOne of the five required NWEA CDF source file names. Other file names return a typed not-found Problem.
Response
FieldTypeRequiredDescriptionTrace
bodytext/csvRequiredGenerated demo CSV content for the requested source file. Demo content follows the NWEA header contract and is not the vendored real-student CDF.
content-typeheader text/csv; charset=utf-8RequiredCSV media type for curl -o downloads.
content-dispositionheader attachmentRequiredAttachment filename matches sourceFile.

cURL

BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/implementation/api"
curl -fsS "$BASE_URL/dev/cdf/StudentsBySchool.csv" -o StudentsBySchool.csv

Example response

TermName,DistrictName,District_StateID,SchoolName,School_StateID,StudentLastName,StudentFirstName,StudentMI,StudentID,Student_StateID,StudentDateOfBirth,StudentEthnicGroup,NWEAStandard_EthnicGroup,StudentGender,Grade,NWEAStandard_Grade
Spring 2025-2026,Demo District,DD-1,Demo School,DS-1,Student,Example,,stu-12345,STU-12345,2013-09-01,Not Specified,Not Specified,F,6,6
POST/nweamap/v1/imports

Submit one NWEA CDF bundle

Imports one authoritative five-file MAP Growth CDF bundle for one tenant, one NWEA account, and one term.

Auth
Bearer JWT with nweamap:import
Scope
nweamap:import
Request
NameInTypeRequiredDescription and trace
AuthorizationheaderBearer JWTRequiredToken tenantId is the platform tenant boundary. It must match any tenant id supplied in the request.
Idempotency-KeyheaderstringRecommendedCaller retry key. Same content and key replays the prior result; same key with different content returns 409.
manifestmultipart fieldapplication/jsonRequiredContains nweaAccountId and termName. The term must match row TermName values when rows are present.
StudentsBySchool.csvmultipart filetext/csvRequiredLossless pass-through source for student-by-school rows.
AssessmentResults.csvmultipart filetext/csvRequiredLossless pass-through source for MAP result rows. The implementation expands and preserves all 143 CDF columns.
ClassAssignments.csvmultipart filetext/csvRequiredLossless pass-through source for class assignments.
ProgramAssignments.csvmultipart filetext/csvRequiredMay contain only the NWEA header and zero data rows; that is still a valid file.
AccommodationAssignment.csvmultipart filetext/csvRequiredLossless pass-through source for accommodations linked to TestID.
Response
FieldTypeRequiredDescriptionTrace
importnweamap.importRequiredImport object containing import_id, status, bundle_hash, row_counts, tenant/account/term scope, and timestamps. Status is applied for new bundle content and no_op when the same bundle is already present, as happens after demo mint pre-seeding.
filesarray<nweamap.import_file>RequiredHeader, hash, count, and validation state for each CDF file.

cURL

BASE_URL="https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/implementation/api"
TOKEN_JSON="$(curl -fsS -X POST "$BASE_URL/dev/mint?tenantId=demo")"
TOKEN="$(printf '%s' "$TOKEN_JSON" | jq -r '.token')"
RUN_ID="$(date +%Y%m%d%H%M%S)"

for SOURCE_FILE in StudentsBySchool.csv AssessmentResults.csv ClassAssignments.csv ProgramAssignments.csv AccommodationAssignment.csv; do
  curl -fsS "$BASE_URL/dev/cdf/$SOURCE_FILE" -o "$SOURCE_FILE"
done

curl -fsS -X POST "$BASE_URL/nweamap/v1/imports" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Idempotency-Key: cdf-demo-$RUN_ID" \
  -F 'manifest={"nweaAccountId":"nwea-account-demo","termName":"Spring 2025-2026"};type=application/json' \
  -F "StudentsBySchool.csv=@./StudentsBySchool.csv;type=text/csv" \
  -F "AssessmentResults.csv=@./AssessmentResults.csv;type=text/csv" \
  -F "ClassAssignments.csv=@./ClassAssignments.csv;type=text/csv" \
  -F "ProgramAssignments.csv=@./ProgramAssignments.csv;type=text/csv" \
  -F "AccommodationAssignment.csv=@./AccommodationAssignment.csv;type=text/csv"

Example response

{
  "import": {
    "import_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000001",
    "tenant_id": "demo",
    "nwea_account_id": "nwea-account-demo",
    "term_name": "Spring 2025-2026",
    "status": "no_op",
    "bundle_hash": "sha256:2d3f6b4e8c1a0f9b7e6d5c4b3a291807060504030201000ffeeddbbccaa9988",
    "row_counts": {
      "StudentsBySchool.csv": 1124,
      "AssessmentResults.csv": 3491,
      "ClassAssignments.csv": 1128,
      "ProgramAssignments.csv": 0,
      "AccommodationAssignment.csv": 1412
    }
  },
  "files": [
    {
      "file_name": "AssessmentResults.csv",
      "status": "valid",
      "row_count": 3491,
      "header_hash": "sha256:..."
    }
  ]
}
GET/nweamap/v1/imports/{importId}

Read import status and file evidence

Fetches the import record, row counts, file hashes, and redacted validation summary for one bundle.

Auth
Bearer JWT with nweamap:read or nweamap:admin
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
AuthorizationheaderBearer JWTRequiredCaller must be in the same tenant as the import.
importIdpathuuidRequiredImport identifier returned by POST /nweamap/v1/imports.
Response
FieldTypeRequiredDescriptionTrace
importobjectRequiredThe import table row.
filesarray<object>RequiredOne file-evidence object per CDF file.
problem_summaryobject|nullNullableRedacted import-level repair summary; no raw student names, identifiers, or full row payloads.

cURL

curl -fsS "$BASE_URL/nweamap/v1/imports/$IMPORT_ID" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "import": {
    "import_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000001",
    "status": "applied",
    "applied_at": "2026-06-03T11:18:43Z"
  },
  "files": [
    {
      "file_name": "ProgramAssignments.csv",
      "row_count": 0,
      "status": "empty_valid"
    }
  ],
  "problem_summary": null
}
GET/nweamap/v1/imports

List imports for sync

Lists import records by NWEA account, term, status, and modifiedSince so consumers can poll for finished backfills.

Auth
Bearer JWT with nweamap:read
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
nweaAccountIdquerystringRequiredTenant-local NWEA account partition for reads.
termNamequerystringRecommendedNWEA term string. Treat it as a source value; do not parse term text for business logic.
modifiedSincequeryISO-8601 timestampOptionalReturns rows changed after this UTC timestamp for polling sync.
limitqueryintegerOptionalMaximum page size before the service returns an opaque cursor.
cursorquerystringOptionalOpaque cursor returned by the prior page. Clients must not parse it.
statusqueryenumOptionalFilter by received, validating, applied, failed, or no_op.
Response
FieldTypeRequiredDescriptionTrace
objectconst listRequiredList envelope marker.
dataarray<nweamap.import>RequiredImport rows in stable modified_at then import_id order.
next_cursorstring|nullRequiredOpaque cursor for the next page.

cURL

curl -fsS "$BASE_URL/nweamap/v1/imports?nweaAccountId=nwea-account-demo&termName=Spring%202025-2026&modifiedSince=2026-06-01T00:00:00Z&limit=25" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "object": "list",
  "data": [
    {
      "import_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000001",
      "status": "applied",
      "modified_at": "2026-06-03T11:18:43Z"
    }
  ],
  "next_cursor": null
}
GET/nweamap/v1/assessment-results

List MAP assessment results

Returns either the selected test of record or raw sittings, controlled by the explicit sittingScope parameter.

Auth
Bearer JWT with nweamap:read
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
nweaAccountIdquerystringRequiredTenant-local NWEA account partition for reads.
termNamequerystringRecommendedNWEA term string. Treat it as a source value; do not parse term text for business logic.
modifiedSincequeryISO-8601 timestampOptionalReturns rows changed after this UTC timestamp for polling sync.
limitqueryintegerOptionalMaximum page size before the service returns an opaque cursor.
cursorquerystringOptionalOpaque cursor returned by the prior page. Clients must not parse it.
sittingScopequeryenum test_of_record | allRequiredUse test_of_record for one row per student/subject/term; use all for retakes and audit history.
includeDeletedquerybooleanOptionalOnly meaningful with sittingScope=all. Deleted rows are never included in test_of_record responses.
studentIdquerystringOptionalNWEA StudentID filter inside the tenant/account/term scope.
studentStateIdquerystringOptionalNWEA Student_StateID alternate identifier filter.
subjectquerystringOptionalOpen NWEA Subject value, for example Math or Reading.
coursequerystringOptionalOpen NWEA Course/Test scale value.
testIdquerystringOptionalNWEA TestID filter and final test-of-record tiebreaker.
normsReferenceDataquerystringOptionalPass-through NWEA NormsReferenceData filter. This base surface preserves the value; it does not compute Alpha norms outputs.
Response
FieldTypeRequiredDescriptionTrace
objectconst listRequiredList envelope marker.
dataarray<nweamap.assessment_result_projection | nweamap.raw_assessment_results>RequiredWith sittingScope=test_of_record, array items are projection rows including is_test_of_record and test_of_record_reason. With sittingScope=all, array items are raw AssessmentResults rows with sidecars plus all 143 CDF columns.
next_cursorstring|nullRequiredOpaque cursor for the next page.

cURL

curl -fsS "$BASE_URL/nweamap/v1/assessment-results?nweaAccountId=nwea-account-demo&termName=Spring%202025-2026&subject=Math&sittingScope=test_of_record&limit=10" \
	  -H "Authorization: Bearer $TOKEN"

Example response

{
  "object": "list",
  "data": [
    {
      "projection_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000010",
      "student_id": "stu-12345",
      "term_name": "Spring 2025-2026",
      "subject": "Math",
      "test_id": "1110000001",
      "test_rit_score": 238,
      "growth_measure_yn": "FALSE",
      "is_valid_rit_for_record": true,
      "is_test_of_record": true,
      "test_of_record_reason": "highest_rit",
      "norms_reference_data": "2025",
      "modified_at": "2026-06-03T11:18:43Z"
    }
  ],
  "next_cursor": null
}
GET/nweamap/v1/r90/table

List the grade2RIT R90 reference table

Returns the NWEAMAP-owned portable PowerPath RIT-to-grade reference rows so clients do not carry private R90 tables.

Auth
Bearer JWT with nweamap:read
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
AuthorizationheaderBearer JWTRequiredCaller needs nweamap:read, nweamap:import, or nweamap:admin.
subjectqueryenum Math | Reading | Language | ScienceOptionalFilters rows to one R90 source curve. Alias subjects such as FastMath map through the lookup endpoint.
tableVersionquerystringOptionalPins the current R90 source version for reproducible clients.
limitqueryintegerOptionalMaximum reference rows before next_cursor.
cursorquerystringOptionalOpaque cursor returned by the prior page.
Response
FieldTypeRequiredDescriptionTrace
objectconst listRequiredList envelope marker.
tableconst nweamap.r90_tableRequiredReference object name.
table_versionstringRequiredCurrent NWEAMAP R90 source version.
dataarray<nweamap.r90_table>RequiredReference rows from the module-owned grade2RIT source.
next_cursorstring|nullRequiredOpaque cursor for the next page.
linksobjectRequiredIncludes the canonical table route.

cURL

curl -fsS "$BASE_URL/nweamap/v1/r90/table?subject=math&limit=3" \
	  -H "Authorization: Bearer $TOKEN"

Example response

{
  "object": "list",
  "table": "nweamap.r90_table",
  "table_version": "nweamap.rit_to_grade.powerpath.v2026-06-15",
  "data": [
    {
      "id": "r90_math_239",
      "table_version": "nweamap.rit_to_grade.powerpath.v2026-06-15",
      "table_subject_id": "math",
      "subject_id": "math",
      "source_subject_name": "Growth: Math K-12",
      "rit_score": 239,
      "r90_grade": 4.8,
      "effective_grade": 5,
      "r90_grade_level": 4,
      "rit90_grade_band_percent": 80,
      "r90_percent_complete": 80,
      "observation_count": 1,
      "source_ref": "powerpath:/powerpath/rit-to-grade"
    }
  ],
  "next_cursor": null,
  "links": {
    "self": "/nweamap/v1/r90/table"
  }
}
GET/nweamap/v1/r90

Look up R90 grade position for one RIT

Converts one subject/RIT pair to the module-owned R90 grade, effective grade, and grade-band percent fields.

Auth
Bearer JWT with nweamap:read
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
AuthorizationheaderBearer JWTRequiredCaller needs nweamap:read, nweamap:import, or nweamap:admin.
subjectquerystringRequiredMAP subject name. FastMath maps to the Math table; Vocabulary/Writing map to Language.
ritquerynumberRequiredInput RIT score to place on the R90 curve.
tableVersionquerystringOptionalPins the current R90 source version for reproducible clients.
Response
FieldTypeRequiredDescriptionTrace
objectconst nweamap.r90_lookupRequiredLookup response marker.
table_versionstringRequiredR90 table version used for the lookup.
requested_subject_idstringRequiredNormalized subject requested by the caller.
table_subject_idstringRequiredR90 subject curve used after alias mapping.
subject_idstringRequiredCompatibility alias for requested_subject_id.
rit_scorenumberRequiredInput RIT value supplied by the caller.
table_rit_scoreinteger|nullNullableSource table RIT point selected for the lookup.
r90_gradenumber|nullNullableR90 grade position from the source curve.
effective_gradeinteger|nullNullableInteger school-grade bucket derived from r90_grade.
r90_grade_levelinteger|nullNullableWhole-number floor of r90_grade.
rit90_grade_band_percentnumber|nullNullableMAP-inferred position through r90_grade_level. This is not actual course or grade-level progress.
r90_percent_completenumber|nullNullableDeprecated compatibility name for rit90_grade_band_percent; not actual course or grade-level progress.
source_point_kindenum exact | source_missingRequiredHow the input RIT matched the source table.
interpolation_rit_rangeobject|nullNullableReserved interpolation metadata; currently null.
calculator_versionstringRequiredCompatibility alias for table_version.
source_refstring|nullNullableCanonical source reference for the selected grade2RIT row.
linksobjectRequiredIncludes the selected R90 table route.

cURL

curl -fsS "$BASE_URL/nweamap/v1/r90?subject=math&rit=239" \
	  -H "Authorization: Bearer $TOKEN"

Example response

{
  "object": "nweamap.r90_lookup",
  "table_version": "nweamap.rit_to_grade.powerpath.v2026-06-15",
  "requested_subject_id": "math",
  "table_subject_id": "math",
  "subject_id": "math",
  "rit_score": 239,
  "table_rit_score": 239,
  "r90_grade": 4.8,
  "effective_grade": 5,
  "r90_grade_level": 4,
  "rit90_grade_band_percent": 80,
  "r90_percent_complete": 80,
  "source_point_kind": "exact",
  "interpolation_rit_range": null,
  "calculator_version": "nweamap.rit_to_grade.powerpath.v2026-06-15",
  "source_ref": "powerpath:/powerpath/rit-to-grade",
  "links": {
    "table": "/nweamap/v1/r90/table?subject=math"
  }
}
GET/nweamap/v1/assessment-results/{rowId}

Read one raw assessment-result row

Returns one raw AssessmentResults row with platform sidecar metadata and all NWEA CDF fields preserved by name.

Auth
Bearer JWT with nweamap:read
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
AuthorizationheaderBearer JWTRequiredCaller tenant must own the row.
rowIdpathuuidRequiredPlatform row_id assigned to the mirrored AssessmentResults row.
nweaAccountIdquerystringRequiredTenant-local NWEA account partition for row lookup.
Response
FieldTypeRequiredDescriptionTrace
rownweamap.raw_assessment_resultsRequiredSidecar metadata plus every NWEA AssessmentResults.csv field by original CDF header name, including TestRITScore and GrowthMeasureYN.

cURL

curl -fsS "$BASE_URL/nweamap/v1/assessment-results/$ROW_ID?nweaAccountId=nwea-account-demo" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "row": {
    "row_id": "018f4b4e-9c7a-7d3d-8b2f-2f673a000020",
    "source_file": "AssessmentResults.csv",
    "StudentID": "stu-12345",
    "Subject": "Math",
    "GrowthMeasureYN": "FALSE",
    "TestID": "1110000001",
    "TestRITScore": "238",
    "NormsReferenceData": "2025",
    "deleted_at": null
  }
}
GET/nweamap/v1/students

List students by school

Reads mirrored StudentsBySchool rows for roster reconciliation and result joins.

Auth
Bearer JWT with nweamap:read
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
nweaAccountIdquerystringRequiredTenant-local NWEA account partition for reads.
termNamequerystringRecommendedNWEA term string. Treat it as a source value; do not parse term text for business logic.
modifiedSincequeryISO-8601 timestampOptionalReturns rows changed after this UTC timestamp for polling sync.
limitqueryintegerOptionalMaximum page size before the service returns an opaque cursor.
cursorquerystringOptionalOpaque cursor returned by the prior page. Clients must not parse it.
studentIdquerystringOptionalNWEA StudentID filter.
studentStateIdquerystringOptionalNWEA Student_StateID filter.
schoolNamequerystringOptionalPass-through NWEA SchoolName filter. It is not tenant routing.
Response
FieldTypeRequiredDescriptionTrace
objectconst listRequiredList envelope marker.
dataarray<nweamap.raw_students_by_school>RequiredSidecar metadata plus StudentsBySchool CDF fields.
next_cursorstring|nullRequiredOpaque cursor for the next page.

cURL

curl -fsS "$BASE_URL/nweamap/v1/students?nweaAccountId=nwea-account-demo&termName=Spring%202025-2026&limit=25" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "object": "list",
  "data": [
    {
      "row_id": "018f4...",
      "StudentID": "stu-12345",
      "StudentFirstName": "Example",
      "StudentLastName": "Student",
      "Grade": "6"
    }
  ],
  "next_cursor": null
}
GET/nweamap/v1/class-assignments

List class assignments

Reads mirrored ClassAssignments rows. Teacher identifiers are NWEA/district-supplied source values; this surface does not invent a teacher directory.

Auth
Bearer JWT with nweamap:read
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
nweaAccountIdquerystringRequiredTenant-local NWEA account partition for reads.
termNamequerystringRecommendedNWEA term string. Treat it as a source value; do not parse term text for business logic.
modifiedSincequeryISO-8601 timestampOptionalReturns rows changed after this UTC timestamp for polling sync.
limitqueryintegerOptionalMaximum page size before the service returns an opaque cursor.
cursorquerystringOptionalOpaque cursor returned by the prior page. Clients must not parse it.
studentIdquerystringOptionalNWEA StudentID filter.
schoolNamequerystringOptionalPass-through SchoolName filter.
Response
FieldTypeRequiredDescriptionTrace
objectconst listRequiredList envelope marker.
dataarray<nweamap.raw_class_assignments>RequiredSidecar metadata plus ClassAssignments CDF fields.
next_cursorstring|nullRequiredOpaque cursor for the next page.

cURL

curl -fsS "$BASE_URL/nweamap/v1/class-assignments?nweaAccountId=nwea-account-demo&termName=Spring%202025-2026&studentId=stu-12345" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "object": "list",
  "data": [
    {
      "row_id": "018f4...",
      "StudentID": "stu-12345",
      "ClassName": "Math 6",
      "TeacherID": "teacher-100"
    }
  ],
  "next_cursor": null
}
GET/nweamap/v1/program-assignments

List program assignments

Reads mirrored ProgramAssignments rows. A valid import can contain a header-only ProgramAssignments.csv file and return an empty list.

Auth
Bearer JWT with nweamap:read
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
nweaAccountIdquerystringRequiredTenant-local NWEA account partition for reads.
termNamequerystringRecommendedNWEA term string. Treat it as a source value; do not parse term text for business logic.
modifiedSincequeryISO-8601 timestampOptionalReturns rows changed after this UTC timestamp for polling sync.
limitqueryintegerOptionalMaximum page size before the service returns an opaque cursor.
cursorquerystringOptionalOpaque cursor returned by the prior page. Clients must not parse it.
studentIdquerystringOptionalNWEA StudentID filter.
Response
FieldTypeRequiredDescriptionTrace
objectconst listRequiredList envelope marker.
dataarray<nweamap.raw_program_assignments>RequiredSidecar metadata plus ProgramAssignments CDF fields. Empty arrays are valid.
next_cursorstring|nullRequiredOpaque cursor for the next page.

cURL

curl -fsS "$BASE_URL/nweamap/v1/program-assignments?nweaAccountId=nwea-account-demo&termName=Spring%202025-2026" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "object": "list",
  "data": [],
  "next_cursor": null
}
GET/nweamap/v1/accommodations

List accommodations

Reads mirrored AccommodationAssignment rows linked to AssessmentResults by TestID.

Auth
Bearer JWT with nweamap:read
Scope
nweamap:read
Request
NameInTypeRequiredDescription and trace
nweaAccountIdquerystringRequiredTenant-local NWEA account partition for reads.
termNamequerystringRecommendedNWEA term string. Treat it as a source value; do not parse term text for business logic.
modifiedSincequeryISO-8601 timestampOptionalReturns rows changed after this UTC timestamp for polling sync.
limitqueryintegerOptionalMaximum page size before the service returns an opaque cursor.
cursorquerystringOptionalOpaque cursor returned by the prior page. Clients must not parse it.
studentIdquerystringOptionalNWEA StudentID filter.
testIdquerystringOptionalNWEA TestID filter, linking accommodations to assessment result rows.
includeDeletedquerybooleanOptionalInclude soft-deleted accommodation rows for audit reads.
Response
FieldTypeRequiredDescriptionTrace
objectconst listRequiredList envelope marker.
dataarray<nweamap.raw_accommodation_assignments>RequiredSidecar metadata plus AccommodationAssignment CDF fields.
next_cursorstring|nullRequiredOpaque cursor for the next page.

cURL

curl -fsS "$BASE_URL/nweamap/v1/accommodations?nweaAccountId=nwea-account-demo&termName=Spring%202025-2026&testId=1110000001" \
  -H "Authorization: Bearer $TOKEN"

Example response

{
  "object": "list",
  "data": [
    {
      "row_id": "018f4...",
      "StudentID": "stu-12345",
      "TestID": "1110000001",
      "AccommodationCategory": "Presentation",
      "Accommodation": "Text-to-speech"
    }
  ],
  "next_cursor": null
}

Parameters

Shared query parameters and closed values

FieldTypeRequiredDescriptionTrace
sittingScopequery enumRequired on assessment-result reads.Selects whether the response returns the TimeBack test of record or all raw sittings. Allowed: test_of_record = Only the highest valid, non-deleted result per tenant/account/student/subject/term.; all = All raw sittings in scope, including retakes and soft-deleted rows when includeDeleted=true..
includeDeletedquery booleanOptional; default false.Includes soft-deleted raw rows for audit reads when sittingScope=all. Allowed: false = Default; soft-deleted rows are excluded.; true = Include soft-deleted rows for audit reads when sittingScope=all..
subjectquery stringRequired on /nweamap/v1/rit-to-grade and legacy /nweamap/v1/r90; optional on /nweamap/v1/rit-to-grade/table and assessment-result reads.MAP subject filter. RIT-to-grade accepts Math, Reading, Language, Science, and module-owned aliases such as FastMath mapping to the Math table.
ritquery numberRequired on /nweamap/v1/rit-to-grade and legacy /nweamap/v1/r90.Input RIT score for the module-owned PowerPath RIT-to-grade/R90 lookup.
tableVersionquery stringOptional.Pins the served RIT-to-grade reference version. If supplied, it must equal the current NWEAMAP table version.
modifiedSincequery timestampOptional.Returns rows or import records changed after the timestamp.
limitquery integerOptional; service default.Maximum number of rows returned before an opaque cursor is issued.
cursorquery stringOptional.Opaque pagination token returned by the previous list response.
scopeJWT claim enumRequired by route family.NWEAMap authorization scope inside the platform HS256 Bearer token. Allowed: nweamap:import = May submit CDF imports.; nweamap:read = May read NWEAMap rows and projections.; nweamap:admin = May inspect import diagnostics and administrative state..
problem_codeRFC 7807 type codeRequired in NWEAMap Problem responses.Stable error code used by agents to repair import and query failures. Allowed: nweamap:invalid_bundle = Submitted bundle is not a valid CDF bundle.; nweamap:missing_file = Required CDF file is absent.; nweamap:header_mismatch = File header differs from the NWEA workbook/CSV contract.; nweamap:row_validation_failed = One or more row values violate the documented field contract.; nweamap:idempotency_conflict = Idempotency-Key was reused for different bundle content.; nweamap:unsupported_query_parameter = Request used a filter or sort key outside this dictionary.; nweamap:not_found = Requested import or row was not found in the caller's tenant/account scope..

Data model provenance

NWEA pass-through tables plus platform import and projection objects

The customer website is not a replacement for the data dictionary. It links every endpoint and behavior back to the dictionary object that implementation must satisfy.

CDF fileDictionary objectFieldsLocal rowsPurpose
StudentsBySchool.csvnweamap.raw_students_by_school16 NWEA + sidecars1124Student and school membership pass-through.
AssessmentResults.csvnweamap.raw_assessment_results143 NWEA + sidecars3491MAP result, growth-window, goal, percentile, norm, and proficiency pass-through.
ClassAssignments.csvnweamap.raw_class_assignments11 NWEA + sidecars1128Class and teacher assignment pass-through.
ProgramAssignments.csvnweamap.raw_program_assignments5 NWEA + sidecars0Program assignment pass-through; zero-row header files are valid.
AccommodationAssignment.csvnweamap.raw_accommodation_assignments6 NWEA + sidecars1412Accommodation rows linked to assessment TestID.
ObjectKindFieldsEndpointArchitecture trace
nweamap.importplatform table12POST /nweamap/v1/imports and GET /nweamap/v1/imports/{importId}
nweamap.import_fileplatform table10GET /nweamap/v1/imports/{importId}
nweamap.raw_students_by_schoolNWEA pass-through raw table29GET /nweamap/v1/students
nweamap.raw_assessment_resultsNWEA pass-through raw table156GET /nweamap/v1/assessment-results?sittingScope=all
nweamap.raw_class_assignmentsNWEA pass-through raw table24GET /nweamap/v1/class-assignments
nweamap.raw_program_assignmentsNWEA pass-through raw table18GET /nweamap/v1/program-assignments
nweamap.raw_accommodation_assignmentsNWEA pass-through raw table19GET /nweamap/v1/accommodations
nweamap.assessment_result_projectionplatform projection22GET /nweamap/v1/assessment-results?sittingScope=test_of_record
nweamap.r90_tableplatform reference data14GET /nweamap/v1/rit-to-grade/table
nweamap.r90_lookupplatform reference response18GET /nweamap/v1/rit-to-grade

Surface boundary

No 1EdTech report oracle: exact MAP report cells route to Alpha

The NWEAMap 1EdTech surface is the source-fidelity layer for CDF import, pass-through read-back, import evidence, test-of-record selection, soft-delete audit, polling sync, and the R6 PowerPath RIT-to-grade reference owner. It deliberately does not publish exact MAP Quadrants report contracts, golden-cell verification, Growth X report assembly, Alpha report-specific RIT50/RIT90/Effective Grade assembly, or norms-flipped report APIs.

Boundary rule: DEFER report-oracle, report-contract, golden-cell, and report-verification primitives on the 1EdTech surface; exact MAP Quadrants report cells, norms=2020|2025 verification, Growth X, Alpha report-specific RIT50/RIT90/Effective Grade assembly, and Alpha report graphs belong to the Alpha surface. R6 carves out the module-owned PowerPath RIT-to-grade reference table/lookup as NWEAMAP-owned portable MAP reference data, not a report oracle. Any skill-pack eval asking 1edtech/skill_pack to regenerate Alpha reports must move to alpha/skill_pack

Use this surface for

CDF bundle import, file/header evidence, raw NWEA field pass-through, sittingScope=test_of_record, sittingScope=all&includeDeleted=true, idempotent re-import, tenant-scoped polling, and /nweamap/v1/r90* PowerPath RIT-to-grade reference lookup.

Route to Alpha later for

Requests for MAP Quadrants exact report regeneration, Growth X, Alpha report-specific RIT50/RIT90/Effective Grade assembly, norms-flipped golden cells, or report graphs route to Alpha architecture; observed RIT-to-grade/R90 reference lookup routes to NWEAMAP.

Boundary labelWhat a client must not infer from 1EdTechProvenance
exact report-contract boundaryNo 1EdTech table, field, or endpoint defines exact MAP Quadrants report families, report cells, or canonical report filters.
golden-cell boundaryNo 1EdTech persistence object stores expected report-cell values or a report-verification oracle.
Alpha outcome-metric boundaryNo Growth X field is defined on the 1EdTech surface; that Alpha outcome metric must be pinned on the Alpha surface before use.
Alpha RIT-derived boundaryNo Alpha report-specific RIT50/RIT90/Effective Grade, Alpha minimum RIT, or Alpha predicted RIT field is defined here; the R6 PowerPath RIT-to-grade/R90 reference table/lookup is NWEAMAP-owned portable MAP reference data, not report assembly.
norms-calculation boundaryNo local norms table or term-string parser is part of the 1EdTech data dictionary; NWEA NormsReferenceData is preserved only as a pass-through value.

Architecture coverage

Commitments this customer contract inherits

These are the approved architecture commitments that control this page. If implementation discovers a contradiction, the loop must roll back to the earliest flawed upstream deliverable instead of inventing new behavior.

CommitmentPublic behavior this page depends onArchitecture
nweamap_source_contractNWEA MAP Growth CDF bundle plus MAP_Export_Field_Descriptions.xlsx is the upstream specification; platform docs pass through NWEA field definitions by reference and document only platform-owned sidecar metadata or behaviorNITD 000 source contract
nweamap_raw_export_mirrorraw persistence mirrors the five NWEA CDF files 1:1 with NWEA field names and semantics, scoped by tenant, NWEA account, term, import batch, source file, source row number, source row hash, ingest timestamp, and deletion stateNITD 001 mirror export
nweamap_single_result_viewreal-time MAP result observations and daily CDF backfill update one module-owned current result projection; no separate NWEA helper table and no separate batch table shipNITD 002 single result view
nweamap_test_of_record_highest_rittest of record is the highest valid TestRITScore per tenant, NWEA account, student, subject, and term; valid MAP RIT is 100 through 350, ties choose latest TestStartDate/TestStartTime then larger TestIDNITD 003 test of record highest rit
nweamap_soft_delete_retentionwhen a previously ingested row disappears from the next authoritative export for the same tenant, NWEA account, term, file, and natural identity, mark it soft-deleted with deletion metadata and never hard-delete through the public surfaceNITD 004 soft delete
nweamap_sitting_scope_parameterassessment result reads expose sittingScope with values test_of_record and all; clients choose the documented scope instead of learning internal tables or re-implementing dedupeNITD 005 sitting scope parameter
nweamap_write_granularitySHIP public bulk-only CDF bundle import through POST /nweamap/v1/imports; DEFER public per-row POST, PUT, PATCH, and DELETE until three integrator decisions in 90 days prove bundle import plus read-back blocks the served jobNITD 006 axis write granularity
nweamap_read_shapeSHIP list endpoints for CDF collections, detail reads for imports and assessment result rows, and narrow current-result projections controlled by sittingScope; DEFER unrestricted nested sub-collections and Alpha report graphs until Alpha approves a report-graph ITD or three integrator decisions in 90 days prove list/detail/projection reads block the served jobNITD 007 axis read shape
nweamap_query_modelSHIP documented filters, stable sort keys, limit-based opaque cursor paging, and modifiedSince for imports, pass-through CDF collection lists, and assessment result projection readsNITD 008 axis query model
nweamap_concurrency_modelDEFER If-Match and per-resource ETags because the public NWEAMap surface has no mutable row overwrite route; re-open with any approved public PUT, PATCH, or DELETE routeNITD 009 axis concurrency model
nweamap_idempotency_modelSHIP canonical bundle content hash plus optional Idempotency-Key stored in platform.idempotency_key; same bundle repeats return prior/no-op status and key reuse with different content returns 409NITD 010 axis idempotency model
nweamap_auth_shapeSHIP platform HS256 Bearer JWTs with tenantId, role or roles, and scopes nweamap:import, nweamap:read, and nweamap:admin; DEFER school, class, and person scoped claims until repeated decisions prove tenant-level access blocks the served jobNITD 011 axis auth shape
nweamap_eventing_modelSHIP polling through modifiedSince and cursor-paged lists; DEFER webhooks until three integrator decisions in 90 days show polling blocks MAP sync/report jobs or a platform-wide webhook substrate shipsNITD 012 axis eventing model
nweamap_error_envelopeSHIP platform typed RFC 7807 Problems with stable NWEAMap codes, requestId, traceId, fieldErrors, and rowErrors for import failuresNITD 013 axis error envelope
nweamap_tenant_routingSHIP platform tenant-in-JWT routing with request tenantId route-token match; nweaAccountId is a required tenant-local partition for imports and a query filter for reads, not a platform tenantNITD 014 axis tenant routing
nweamap_conformance_evidenceSHIP local executable evidence: workbook/header parity, CDF import round trip, row counts, idempotent re-import, highest-RIT retake fixture, soft-delete replacement fixture, typed Problem fixtures, live smoke tests, surface QC, integration app, and skill-pack leak check; DEFER official NWEA certification claimNITD 015 axis conformance evidence
nweamap_privacy_retentionSHIP tenant-scoped rows, audit linkage, redaction from logs and Problems except minimal repair evidence, and soft deletion; DEFER age-based retention windows and public erasure APIs until platform privacy policy names the required workflowNITD 016 axis privacy retention
nweamap_list_endpointsSHIP list endpoints for imports, students, assessment results, class assignments, program assignments, and accommodations, all tenant- and NWEA-account scoped with cursor paging and documented filtersNITD 017 axis list endpoints
nweamap_report_oracle_boundaryDEFER report-oracle, report-contract, golden-cell, and report-verification primitives on the 1EdTech surface; exact MAP Quadrants report cells, norms=2020|2025 verification, Growth X, Alpha report-specific RIT50/RIT90/Effective Grade assembly, and Alpha report graphs belong to the Alpha surface. R6 carves out the module-owned PowerPath RIT-to-grade reference table/lookup as NWEAMAP-owned portable MAP reference data, not a report oracle. Any skill-pack eval asking 1edtech/skill_pack to regenerate Alpha reports must move to alpha/skill_packNITD 018 report oracle boundary

Implementation spec

What the implementation deliverable must ship

Single canonical deployment

Serve the protected API at https://platform3-andymontgomery-9773s-projects.vercel.app/nweamap/1edtech/implementation/api for demo and real tenants. Expose POST /dev/mint?tenantId=demo and GET /dev/cdf/{sourceFile} on that same deployment for cold demo clients.

Persistent tenant store

Use the shared platform Postgres/Supabase store. Do not use in-memory state for reads after writes, idempotency, imports, or demo workflows.

Import evidence

Validate headers before writing rows; persist import, import_file, row hashes, and row counts; reject partial malformed bundles with typed Problems.

Dedupe and retention

Implement highest-RIT test-of-record, tie-breakers, invalid RIT exclusion, soft deletion, sittingScope, and includeDeleted exactly as documented.

Security and privacy

Enforce tenantId before parsing row data; redact PII from logs and Problems; never expose raw sample CDF values in public diagnostics.

Executable conformance

Tests must cover workbook/header parity, CDF round-trip, idempotent re-import, highest-RIT retake fixture, soft-delete replacement fixture, Problems, demo smoke, and reviewer-tenant smoke.

Source trail

Sources used to build this page

  • Approved NWEAMap 1EdTech architecture
  • Approved NWEAMap 1EdTech data dictionary
  • loop/nweamap/artifacts/1edtech/architecture/commitments.json
  • loop/nweamap/artifacts/1edtech/data_dictionary/site/nweamap-data-dictionary.json
  • loop/nweamap/vendor/nwea/MAP_Export_Field_Descriptions.xlsx
  • loop/nweamap/vendor/nwea/StudentsBySchool.csv
  • loop/nweamap/vendor/nwea/AssessmentResults.csv
  • loop/nweamap/vendor/nwea/ClassAssignments.csv
  • loop/nweamap/vendor/nwea/ProgramAssignments.csv
  • loop/nweamap/vendor/nwea/AccommodationAssignment.csv
  • Benchmark fetched before build: Stripe API Reference
Alpha leakage check: This 1EdTech customer site contains no norms table, no Growth X calculation, no Alpha report-specific RIT50/RIT90 or Effective Grade calculator, no term-string parser, no report-contract API, no golden-cell oracle, and no report-generation logic. Per NITD-018 and R6, PowerPath RIT-to-grade reference lookup is NWEAMAP-owned and is not report assembly.