Platform3 · people_and_orgs · alpha · customer_website

people_and_orgs alpha customer API

Customer API guide served verbatim from the tracked owning contract JSON. Every endpoint, field, and value on this page is reflected mechanically from that source.

82 endpointsgenerated 2026-06-19T15:21:39Z

Contract overview

module
people_and_orgs
surface
alpha
deliverable
customer_website
generatedAt
2026-06-19T15:21:39Z
benchmarkUrl
https://docs.stripe.com/api
implementationBaseUrl
https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/implementation/api
architectureUrl
https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture
dataDictionaryUrl
https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary
oneRosterDictionaryUrl
https://platform3-andymontgomery-9773s-projects.vercel.app/oneroster/1edtech/data_dictionary
edFiDictionaryUrl
https://platform3-andymontgomery-9773s-projects.vercel.app/ed_fi/1edtech/data_dictionary
endpointCount
82
tableCount
17
fieldCount
154
problemTypeBase
https://platform3-andymontgomery-9773s-projects.vercel.app/problems/people-orgs/
sourceArtifacts
{
  "architecture": "loop/people_and_orgs/artifacts/alpha/architecture/site/people-and-orgs-alpha-architecture.json",
  "dataDictionary": "loop/people_and_orgs/artifacts/alpha/data_dictionary/site/people-and-orgs-alpha-data-dictionary.json",
  "aliasMap": "loop/people_and_orgs/artifacts/alpha/architecture/site/alpha-alias-map.json"
}
tables
[
  {
    "name": "alpha.person",
    "title": "Person",
    "apiCollection": "/people",
    "purpose": "One human in the roster: student, parent, guardian, guide, staff member, or administrator. A person's roles are dated memberships, not columns hidden inside the person row.",
    "changeType": "rename + extend",
    "upstream": "oneroster.users",
    "storage": "Public view alpha.person joins alpha.person_base over oneroster.users to alpha.person_ext. Only admission_date, exit_date, age_grade, and reality live in alpha.person_ext; sourced OneRoster fields are never copied.",
    "storageContract": {
      "alphaObject": "person",
      "publicSurface": "alpha.person",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.users",
      "baseView": "alpha.person_base",
      "extensionTables": [
        "alpha.person_ext"
      ],
      "coreWriteRoute": "Route sourced-field writes to the OneRoster 1EdTech users surface.",
      "extensionWriteRoute": "Write only admission_date, exit_date, age_grade, and reality to alpha.person_ext after the base person exists.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    "fieldCount": 20
  },
  {
    "name": "alpha.place",
    "title": "Place",
    "apiCollection": "/places",
    "purpose": "A district, school, level, department, or other roster place. For NWEA, district means exactly one Brand x Modality account.",
    "changeType": "rename + restrict + extend",
    "upstream": "oneroster.orgs",
    "storage": "Public view alpha.place joins alpha.place_base over oneroster.orgs to alpha.place_ext and governed alpha.object_tag projections. Only nwea_district_id, reality, and report-slice tags are Alpha storage.",
    "storageContract": {
      "alphaObject": "place",
      "publicSurface": "alpha.place",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.orgs",
      "baseView": "alpha.place_base",
      "extensionTables": [
        "alpha.place_ext",
        "alpha.object_tag"
      ],
      "coreWriteRoute": "Route sourced-field writes to the OneRoster 1EdTech orgs surface.",
      "extensionWriteRoute": "Write nwea_district_id and reality to alpha.place_ext and report-slice tags to alpha.object_tag only.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    "fieldCount": 14
  },
  {
    "name": "alpha.person_ext",
    "title": "Person Extension Storage",
    "apiCollection": "storage-only; written through /people extension fields",
    "purpose": "The storage row that lets Alpha add person lifecycle, age-grade, and reality context to a person without copying OneRoster user columns.",
    "changeType": "extend",
    "upstream": "None; logical FK to alpha.person_base",
    "storage": "Alpha-owned extension table for person facts that OneRoster does not carry. It decorates alpha.person_base by tenant_id/person_id and is read through alpha.person.",
    "storageContract": null,
    "fieldCount": 5
  },
  {
    "name": "alpha.place_ext",
    "title": "Place Extension Storage",
    "apiCollection": "storage-only; written through /places extension fields",
    "purpose": "The storage row that lets Alpha attach the NWEA account id and reality classification to a place without copying OneRoster org columns.",
    "changeType": "extend",
    "upstream": "None; logical FK to alpha.place_base",
    "storage": "Alpha-owned extension table for place facts that OneRoster does not carry. It decorates alpha.place_base by tenant_id/place_id and is read through alpha.place.",
    "storageContract": null,
    "fieldCount": 4
  },
  {
    "name": "alpha.alpha_level_history",
    "title": "Alpha Level History",
    "apiCollection": "/alpha_level_history",
    "purpose": "The over-time answer for alphaLevel(student, date). It keeps Alpha level history instead of replacing old context with one mutable current value.",
    "changeType": "extend",
    "upstream": "None; logical FK to alpha.person_base and source classification",
    "storage": "Alpha-owned effective-dated history table for a student's Alpha level. It references alpha.person_base and does not copy OneRoster user fields.",
    "storageContract": {
      "alphaObject": "alpha_level_history",
      "publicSurface": "alpha.alpha_level_history",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.alpha_level_history"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write effective-dated alpha.alpha_level_history rows with a person_id foreign key to the base person, after the base person exists. No OneRoster or Ed-Fi column is copied.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    },
    "fieldCount": 7
  },
  {
    "name": "alpha.age_grade_history",
    "title": "Age Grade History",
    "apiCollection": "/age_grade_history",
    "purpose": "The over-time answer for ageGrade(student, date). It keeps age-grade history instead of replacing old context with one mutable current value.",
    "changeType": "extend",
    "upstream": "None; logical FK to alpha.person_base and source grade classification",
    "storage": "Alpha-owned effective-dated history table for a student's age-grade context. It references alpha.person_base and does not copy OneRoster user fields.",
    "storageContract": {
      "alphaObject": "age_grade_history",
      "publicSurface": "alpha.age_grade_history",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.age_grade_history"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write effective-dated alpha.age_grade_history rows with a person_id foreign key to the base person, after the base person exists. No OneRoster or Ed-Fi column is copied.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    },
    "fieldCount": 7
  },
  {
    "name": "alpha.place_membership",
    "title": "Place Membership",
    "apiCollection": "/place_memberships",
    "purpose": "A dated relationship saying what one person is in one place, such as parent, guardian, guide, student, administrator, or staff.",
    "changeType": "rename + restrict",
    "upstream": "oneroster.roles",
    "storage": "Public view alpha.place_membership selects from alpha.place_membership_base over oneroster.roles. is_time_locatable is a view expression; this object has no Alpha table.",
    "storageContract": {
      "alphaObject": "place_membership",
      "publicSurface": "alpha.place_membership",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.roles",
      "baseView": "alpha.place_membership_base",
      "extensionTables": [],
      "coreWriteRoute": "Route all writes to the OneRoster 1EdTech roles surface.",
      "extensionWriteRoute": "None. is_time_locatable is a view expression, not stored Alpha state.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    "fieldCount": 10
  },
  {
    "name": "alpha.class_membership",
    "title": "Class Membership",
    "apiCollection": "/class_memberships",
    "purpose": "A dated relationship saying that one person belongs to one learning group at one school. It is the source for student<->guide association and studentsForGuide(guide, date); the detailed class/course object is not re-owned by this module.",
    "changeType": "rename + restrict",
    "upstream": "oneroster.enrollments",
    "storage": "Public view alpha.class_membership selects from alpha.class_membership_base over oneroster.enrollments. is_time_locatable is a view expression; this object has no Alpha table.",
    "storageContract": {
      "alphaObject": "class_membership",
      "publicSurface": "alpha.class_membership",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.enrollments",
      "baseView": "alpha.class_membership_base",
      "extensionTables": [],
      "coreWriteRoute": "Route all writes to the OneRoster 1EdTech enrollments surface.",
      "extensionWriteRoute": "None. is_time_locatable is a view expression, not stored Alpha state.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    "fieldCount": 10
  },
  {
    "name": "alpha.school_period",
    "title": "School Period",
    "apiCollection": "/school_periods",
    "purpose": "A school year, term, semester, or grading period used to answer roster questions as of a date.",
    "changeType": "rename + restrict",
    "upstream": "oneroster.academic_sessions",
    "storage": "Public view alpha.school_period selects from alpha.school_period_base over oneroster.academic_sessions. No Alpha table stores academic-session fields.",
    "storageContract": {
      "alphaObject": "school_period",
      "publicSurface": "alpha.school_period",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.academic_sessions",
      "baseView": "alpha.school_period_base",
      "extensionTables": [],
      "coreWriteRoute": "Route all writes to the OneRoster 1EdTech academic_sessions surface.",
      "extensionWriteRoute": "None.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    "fieldCount": 10
  },
  {
    "name": "alpha.person_sensitive_profile",
    "title": "Person Sensitive Profile",
    "apiCollection": "/person_sensitive_profiles",
    "purpose": "Sensitive demographic facts kept out of ordinary roster lists and returned only through authorized self, guardian, or administrative views.",
    "changeType": "restrict",
    "upstream": "oneroster.demographics",
    "storage": "Restricted public view alpha.person_sensitive_profile selects from alpha.person_sensitive_profile_base over oneroster.demographics. Authorization and redaction are API/view restrictions, not copied storage.",
    "storageContract": {
      "alphaObject": "person_sensitive_profile",
      "publicSurface": "alpha.person_sensitive_profile",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.demographics",
      "baseView": "alpha.person_sensitive_profile_base",
      "extensionTables": [],
      "coreWriteRoute": "Route sourced-field writes to the OneRoster 1EdTech demographics surface.",
      "extensionWriteRoute": "None. Authorization and redaction are API/view restrictions, not copied storage.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    "fieldCount": 7
  },
  {
    "name": "alpha.guardian_view",
    "title": "Guardian",
    "apiCollection": "/guardians",
    "purpose": "A parent, guardian, emergency contact, or family contact for a student.",
    "changeType": "rename + restrict",
    "upstream": "edfi.canonical_record(resource_name=Contact)",
    "storage": "Public view alpha.guardian_view selects canonical, non-deleted Ed-Fi Contact records from edfi.canonical_record. It has no Alpha-owned table and stores no copied Ed-Fi columns.",
    "storageContract": {
      "alphaObject": "guardian",
      "publicSurface": "alpha.guardian_view",
      "upstreamModule": "ed_fi/1edtech",
      "baseSource": "edfi.canonical_record(resource_name=Contact)",
      "baseView": "alpha.guardian_base_view",
      "extensionTables": [],
      "coreWriteRoute": "Route all sourced-field writes to the Ed-Fi 1EdTech Contact collection; Alpha exposes only canonical, non-deleted Contact records.",
      "extensionWriteRoute": "None. Guardian facts that originate in Ed-Fi stay in edfi.canonical_record and descriptor_code-backed views.",
      "requiredShape": "CREATE VIEW over edfi.canonical_record; filter resource_name/collection_route, tenant_id, is_deleted=false, canonical state, descriptor_code resolution, and OneRoster sourcedId joins. No Alpha table may store sourced Ed-Fi columns."
    },
    "fieldCount": 9
  },
  {
    "name": "alpha.guardian_relationship_view",
    "title": "Guardian Relationship",
    "apiCollection": "/guardian_relationships",
    "purpose": "The relationship between one student and one guardian/contact.",
    "changeType": "rename + restrict",
    "upstream": "edfi.canonical_record(resource_name=StudentContactAssociation)",
    "storage": "Public view alpha.guardian_relationship_view selects canonical, non-deleted Ed-Fi StudentContactAssociation records and resolves descriptors through edfi.descriptor_code. It has no Alpha-owned table.",
    "storageContract": {
      "alphaObject": "guardian_relationship",
      "publicSurface": "alpha.guardian_relationship_view",
      "upstreamModule": "ed_fi/1edtech",
      "baseSource": "edfi.canonical_record(resource_name=StudentContactAssociation)",
      "baseView": "alpha.guardian_relationship_base_view",
      "extensionTables": [],
      "coreWriteRoute": "Route all sourced-field writes to the Ed-Fi 1EdTech StudentContactAssociation collection; Alpha joins to OneRoster users only by platform3 sourcedId references.",
      "extensionWriteRoute": "None. Relationship descriptors and flags remain Ed-Fi canonical data.",
      "requiredShape": "CREATE VIEW over edfi.canonical_record; filter resource_name/collection_route, tenant_id, is_deleted=false, canonical state, descriptor_code resolution, and OneRoster sourcedId joins. No Alpha table may store sourced Ed-Fi columns."
    },
    "fieldCount": 11
  },
  {
    "name": "alpha.staff_assignment_view",
    "title": "Staff Assignment",
    "apiCollection": "/staff_assignments",
    "purpose": "A staff member's assignment to a school, district, department, or other education organization beyond the role rows OneRoster already carries.",
    "changeType": "rename + restrict",
    "upstream": "edfi.canonical_record(resource_name=StaffEducationOrganizationAssignmentAssociation)",
    "storage": "Public view alpha.staff_assignment_view selects canonical, non-deleted Ed-Fi StaffEducationOrganizationAssignmentAssociation records and resolves StaffClassification through edfi.descriptor_code. It has no Alpha-owned table.",
    "storageContract": {
      "alphaObject": "staff_assignment",
      "publicSurface": "alpha.staff_assignment_view",
      "upstreamModule": "ed_fi/1edtech",
      "baseSource": "edfi.canonical_record(resource_name=StaffEducationOrganizationAssignmentAssociation)",
      "baseView": "alpha.staff_assignment_base_view",
      "extensionTables": [],
      "coreWriteRoute": "Route all sourced-field writes to the Ed-Fi 1EdTech StaffEducationOrganizationAssignmentAssociation collection; OneRoster users and orgs remain the roster identity boundary.",
      "extensionWriteRoute": "None. Staff assignment facts from Ed-Fi stay in edfi.canonical_record and descriptor_code-backed views.",
      "requiredShape": "CREATE VIEW over edfi.canonical_record; filter resource_name/collection_route, tenant_id, is_deleted=false, canonical state, descriptor_code resolution, and OneRoster sourcedId joins. No Alpha table may store sourced Ed-Fi columns."
    },
    "fieldCount": 11
  },
  {
    "name": "alpha.program_participation_view",
    "title": "Program Participation",
    "apiCollection": "/program_participations",
    "purpose": "A student's participation in an administrative program such as Special Education, Title I, English Learner, Section 504, food service, or another Ed-Fi program association.",
    "changeType": "rename + restrict",
    "upstream": "edfi.canonical_record(resource_name in GeneralStudentProgramAssociation, StudentProgramAssociation, and specializations)",
    "storage": "Public view alpha.program_participation_view selects canonical, non-deleted Ed-Fi program association records and resolves ProgramType and ProgramParticipationStatus through edfi.descriptor_code. It has no Alpha-owned table.",
    "storageContract": {
      "alphaObject": "program_participation",
      "publicSurface": "alpha.program_participation_view",
      "upstreamModule": "ed_fi/1edtech",
      "baseSource": "edfi.canonical_record(resource_name in GeneralStudentProgramAssociation, StudentProgramAssociation, and specializations)",
      "baseView": "alpha.program_participation_base_view",
      "extensionTables": [],
      "coreWriteRoute": "Route all sourced-field writes to the Ed-Fi 1EdTech Program and StudentProgramAssociation-family collections; Alpha joins student and place ids through OneRoster sourcedIds.",
      "extensionWriteRoute": "None. Program participation facts from Ed-Fi stay in edfi.canonical_record and descriptor_code-backed views.",
      "requiredShape": "CREATE VIEW over edfi.canonical_record; filter resource_name/collection_route, tenant_id, is_deleted=false, canonical state, descriptor_code resolution, and OneRoster sourcedId joins. No Alpha table may store sourced Ed-Fi columns."
    },
    "fieldCount": 12
  },
  {
    "name": "alpha.app_credential",
    "title": "App Credential",
    "apiCollection": "/app_credentials",
    "purpose": "A first-class operational secret reference for a student's login to a third-party learning app. The secret value is never stored in a roster field, tag, log, or API response.",
    "changeType": "extend",
    "upstream": "None",
    "storage": "Alpha extension for operational secret references; no 1EdTech source table.",
    "storageContract": {
      "alphaObject": "app_credential",
      "publicSurface": "alpha.app_credential",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.app_credential"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write alpha.app_credential rows with a student_sourced_id foreign key to oneroster.users.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    },
    "fieldCount": 6
  },
  {
    "name": "alpha.tag_definition",
    "title": "Tag Definition",
    "apiCollection": "/tag_definitions",
    "purpose": "Governed tag registry for low-cardinality roster reporting dimensions that do not belong as enforced relationship columns.",
    "changeType": "extend",
    "upstream": "None",
    "storage": "Alpha extension for governed low-cardinality reporting dimensions.",
    "storageContract": {
      "alphaObject": "tag_definition",
      "publicSurface": "alpha.tag_definition",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.tag_definition"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write alpha.tag_definition rows only; no 1EdTech columns are copied.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    },
    "fieldCount": 6
  },
  {
    "name": "alpha.object_tag",
    "title": "Object Tag",
    "apiCollection": "/object_tags",
    "purpose": "A governed tag assignment for report slicing only. It is never used for relationships, joins to live rows, or secrets.",
    "changeType": "extend",
    "upstream": "None",
    "storage": "Alpha extension for governed tag assignments.",
    "storageContract": {
      "alphaObject": "object_tag",
      "publicSurface": "alpha.object_tag",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.object_tag"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write alpha.object_tag rows only; object_id is a relationship reference to a live public object, not a copied 1EdTech field.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    },
    "fieldCount": 5
  }
]
workflows
[
  {
    "title": "List currently-enrolled students at a school filtered by level",
    "text": "For the Brownsville Lower Elementary job: filter schools by typed level, narrow by campus name because place.name is display-only, then ask the selected place for active student memberships using only asOfDate and roleKind on the relationship route.",
    "calls": [
      "GET /places?filter=placeKind==school AND level==LL",
      "GET /places/{brownsvillePlaceId}/people?asOfDate=2026-06-13&roleKind=student"
    ],
    "traces": [
      "paitd-003-place-nwea-boundary",
      "paitd-004-point-in-time-memberships",
      "paitd-006-tag-registry"
    ]
  },
  {
    "title": "Find a student's school context",
    "text": "Read the person, then ask for memberships at an asOfDate. Do not assume the latest membership row is current.",
    "calls": [
      "GET /people/{personId}",
      "GET /people/{personId}/memberships?asOfDate=YYYY-MM-DD"
    ],
    "traces": [
      "paitd-002-person-vocabulary",
      "paitd-004-point-in-time-memberships"
    ]
  },
  {
    "title": "Build a teacher roster",
    "text": "Start from a place or learning group. On /places/{placeId}/people, pass asOfDate and optional roleKind only; use /class_memberships when the job needs a pageable filtered collection scan.",
    "calls": [
      "GET /places/{placeId}/people?asOfDate=YYYY-MM-DD&roleKind=student",
      "GET /class_memberships?filter=learningGroupId==group_demo AND roleKind==student&asOfDate=YYYY-MM-DD"
    ],
    "traces": [
      "paitd-004-point-in-time-memberships",
      "paitd-103-query-model"
    ]
  },
  {
    "title": "Reconcile NWEA account boundaries",
    "text": "Read district places where place_kind=district. The district row owns nwea_district_id, brand, and modality. Schools point to it through parent_place_id.",
    "calls": [
      "GET /places?filter=placeKind==district",
      "GET /places/{districtPlaceId}/schools"
    ],
    "traces": [
      "paitd-003-place-nwea-boundary",
      "paitd-006-tag-registry"
    ]
  },
  {
    "title": "Check app credential status",
    "text": "Read credential existence and last rotation. The API never returns the secret value and never stores it on person or tags.",
    "calls": [
      "GET /app_credentials?filter=studentSourcedId==person_ada_lovelace",
      "PATCH /app_credentials/{studentSourcedId}/{appId}"
    ],
    "traces": [
      "paitd-008-app-credentials",
      "paitd-111-privacy-retention"
    ]
  },
  {
    "title": "Read sensitive profile data lawfully",
    "text": "Use the sensitive profile endpoint only with self, guardian, or administrative scope. Ordinary people lists never include demographics.",
    "calls": [
      "GET /person_sensitive_profiles/{personId}"
    ],
    "traces": [
      "paitd-009-sensitive-profile-privacy",
      "paitd-111-privacy-retention"
    ]
  },
  {
    "title": "Find a student's guardians",
    "text": "Ask the relationship route instead of joining Ed-Fi Contact records or shipping relation descriptor maps in the client.",
    "calls": [
      "GET /people/{personId}/guardians",
      "GET /guardian_relationships?filter=studentPersonId=={personId}"
    ],
    "traces": [
      "paitd-012-edfi-second-upstream",
      "paitd-013-guardian-views"
    ]
  },
  {
    "title": "Find active staff assignments",
    "text": "Use the place staff-assignment route with asOfDate; staff classifications are already descriptor-resolved by the surface.",
    "calls": [
      "GET /places/{placeId}/staff_assignments?asOfDate=YYYY-MM-DD",
      "GET /staff_assignments?filter=placeId=={placeId} AND staffClassification==Teacher&asOfDate=YYYY-MM-DD"
    ],
    "traces": [
      "paitd-012-edfi-second-upstream",
      "paitd-014-staff-assignment-views"
    ]
  },
  {
    "title": "Find a student's active programs",
    "text": "Program participation is belonging, not a Results score or Policy calculation. The surface filters date ranges and resolves program descriptors.",
    "calls": [
      "GET /people/{personId}/program_participations?asOfDate=YYYY-MM-DD",
      "GET /program_participations?filter=studentPersonId=={personId} AND programType==Special%20Education&asOfDate=YYYY-MM-DD"
    ],
    "traces": [
      "paitd-012-edfi-second-upstream",
      "paitd-015-program-participation-views"
    ]
  },
  {
    "title": "Poll for roster changes",
    "text": "Use modifiedSince, limit, and cursor on collection list endpoints such as /people, /places, /place_memberships, and /class_memberships. Relationship reads publish their own smaller query contracts.",
    "calls": [
      "GET /people?modifiedSince=2026-09-01T00:00:00Z&limit=100",
      "GET /places?cursor=<opaque>"
    ],
    "traces": [
      "paitd-103-query-model",
      "paitd-107-eventing-model"
    ]
  }
]
boundaryRules
[
  {
    "title": "This is the roster, not the gradebook",
    "text": "People & Orgs answers who someone is and where they belong as of a date. Results owns MAP, mastery, working grade, advancement, report-card outcomes, and gradebook rollups.",
    "traces": [
      "paitd-001-module-boundary"
    ]
  },
  {
    "title": "Point-in-time is mandatory",
    "text": "Membership rows with begin_date null are excluded from every asOfDate computation. end_date null means still active after begin_date. Consumers use is_time_locatable instead of guessing from nulls.",
    "traces": [
      "paitd-004-point-in-time-memberships"
    ]
  },
  {
    "title": "Relationships are columns",
    "text": "person_id, place_id, parent_place_id, learning_group_id, family_or_agent_person_ids, and membership ids are real relationships. Tags are only governed report slices.",
    "traces": [
      "paitd-006-tag-registry"
    ]
  },
  {
    "title": "Secrets never leave the vault",
    "text": "The Alpha surface cuts OneRoster password fields. app_credential.secret_ref points at a vault and ordinary APIs expose only existence and last rotation.",
    "traces": [
      "paitd-008-app-credentials"
    ]
  },
  {
    "title": "Alpha roster objects are views",
    "text": "person, place, memberships, school periods, sensitive profiles, guardian views, staff assignments, and program participation are public views over OneRoster or Ed-Fi base records. Only person_ext, place_ext, app_credential, tag_definition, object_tag, alpha_level_history, and age_grade_history are Alpha-owned extension tables.",
    "traces": [
      "paitd-011-storage-model"
    ]
  },
  {
    "title": "Ed-Fi facts are view-only here",
    "text": "Guardian, staff-assignment, and program-participation rows come from Ed-Fi canonical records. Alpha resolves descriptors and joins roster ids, but it does not copy or own those administrative records.",
    "traces": [
      "paitd-012-edfi-second-upstream",
      "paitd-013-guardian-views",
      "paitd-014-staff-assignment-views",
      "paitd-015-program-participation-views"
    ]
  }
]
calendarEffortHandoff
{
  "id": "school-calendar-effort",
  "title": "People & Orgs serves the school-day calendar reads",
  "dateColumn": "The GOALS Date column is bidirectional: done by <date> turns into hours per school day, and X hrs/day turns into a completion date. That date-to-effort-per-day arithmetic uses People & Orgs school-calendar reads over alpha.school_calendar, a view over Ed-Fi CalendarDate. school_period still gives academic-session boundaries; it is not a substitute for enumerated school-day facts.",
  "peopleAndOrgsOwns": [
    "student stable id",
    "school and place membership",
    "locked school level",
    "tenure inputs",
    "dated memberships",
    "school_period start/end boundaries",
    "school-day list",
    "is-school-day",
    "days-between",
    "days-remaining",
    "next-school-year-start"
  ],
  "forbiddenClientWorkarounds": [
    "weekday counting from school_period boundaries",
    "holiday or break inference",
    "summer-gap skip heuristics",
    "local holiday lists",
    "recreated rpt2_calendar logic"
  ],
  "productionExample": {
    "schoolDays": 204,
    "startDate": "2025-08-13",
    "endDate": "2026-07-24",
    "remainingDaysExample": 31,
    "meaning": "An enumerated policy/read-model answer, not a formula a roster client derives from weekdays."
  },
  "xpUnit": {
    "statement": "1 XP ≈ 1 expected minute for expected work; equivalently, 1 expected XP ≈ 1 expected minute. Expected XP is student-independent, set by speed-running or approved calibration, and denominates expected minutes rather than active seconds or awarded-XP history.",
    "plannedHoursFormula": "expected_xp / 60 before school-day pacing policy is applied",
    "doNotInferFrom": "production defaults such as default_xp_goal == default_minutes_goal",
    "canonicalDefinitionSites": [
      "GET /api/policy_config/alpha.policy.expected_xp_minute_convention",
      "https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/customer_website#xp",
      "https://platform3-andymontgomery-9773s-projects.vercel.app/content/alpha/data_dictionary#content-item-expected-xp",
      "https://platform3-andymontgomery-9773s-projects.vercel.app/results/alpha/data_dictionary#table-alpha-xp-ledger"
    ]
  },
  "servingEndpoints": [
    "GET /api/places/{placeId}/school_calendar/{date}",
    "GET /api/places/{placeId}/school_calendar?startDate=YYYY-MM-DD&endDate=YYYY-MM-DD",
    "GET /api/places/{placeId}/school_days_between?startDate=YYYY-MM-DD&endDate=YYYY-MM-DD",
    "GET /api/places/{placeId}/school_days_remaining?asOfDate=YYYY-MM-DD",
    "GET /api/places/{placeId}/next_school_year_start?asOfDate=YYYY-MM-DD"
  ],
  "owningSurfaceWhenNeeded": "People & Orgs serves these school-calendar reads. The storage truth is Ed-Fi CalendarDate; alpha.school_calendar is a view, not an Alpha base table. If the view lacks a complete date range, the API fails closed instead of filling gaps with weekday math.",
  "traces": [
    "paitd-004-point-in-time-memberships",
    "paitd-005-school-periods",
    "paitd-007-tenure-and-grade-context"
  ]
}
storageModel
{
  "rule": "Alpha is views over the OneRoster and Ed-Fi 1EdTech bases for rename/cut/restrict changes; only extend changes add Alpha-owned tables containing new Alpha fields plus foreign keys to base rows.",
  "itd": {
    "id": "paitd-011-storage-model",
    "title": "Alpha Storage Is Views Over OneRoster Plus Extension Tables",
    "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-011-storage-model"
  },
  "forbiddenAlphaTables": [
    "alpha.person",
    "alpha.place",
    "alpha.place_membership",
    "alpha.class_membership",
    "alpha.school_period",
    "alpha.person_sensitive_profile",
    "alpha.guardian_view",
    "alpha.guardian_relationship_view",
    "alpha.staff_assignment_view",
    "alpha.program_participation_view"
  ],
  "forbiddenTables": [
    "alpha.person",
    "alpha.place",
    "alpha.place_membership",
    "alpha.class_membership",
    "alpha.school_period",
    "alpha.person_sensitive_profile",
    "alpha.guardian_view",
    "alpha.guardian_relationship_view",
    "alpha.staff_assignment_view",
    "alpha.program_participation_view"
  ],
  "allowedExtensionTables": [
    "alpha.person_ext",
    "alpha.place_ext",
    "alpha.app_credential",
    "alpha.tag_definition",
    "alpha.object_tag",
    "alpha.alpha_level_history",
    "alpha.age_grade_history"
  ],
  "storageContract": [
    {
      "alphaObject": "person",
      "publicSurface": "alpha.person",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.users",
      "baseView": "alpha.person_base",
      "extensionTables": [
        "alpha.person_ext"
      ],
      "coreWriteRoute": "Route sourced-field writes to the OneRoster 1EdTech users surface.",
      "extensionWriteRoute": "Write admission_date, exit_date, age_grade, and reality to alpha.person_ext after the base person exists.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns. Wave 2 adds reality as an Alpha extension field, not a copied OneRoster column."
    },
    {
      "alphaObject": "place",
      "publicSurface": "alpha.place",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.orgs",
      "baseView": "alpha.place_base",
      "extensionTables": [
        "alpha.place_ext",
        "alpha.object_tag"
      ],
      "coreWriteRoute": "Route sourced-field writes to the OneRoster 1EdTech orgs surface.",
      "extensionWriteRoute": "Write nwea_district_id and reality to alpha.place_ext, and report-slice tags to alpha.object_tag, after the base place exists.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns. Wave 2 adds reality as an Alpha extension field, not a copied OneRoster column."
    },
    {
      "alphaObject": "place_membership",
      "publicSurface": "alpha.place_membership",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.roles",
      "baseView": "alpha.place_membership_base",
      "extensionTables": [],
      "coreWriteRoute": "Route all writes to the OneRoster 1EdTech roles surface.",
      "extensionWriteRoute": "None. is_time_locatable is a view expression, not stored Alpha state.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    {
      "alphaObject": "class_membership",
      "publicSurface": "alpha.class_membership",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.enrollments",
      "baseView": "alpha.class_membership_base",
      "extensionTables": [],
      "coreWriteRoute": "Route all writes to the OneRoster 1EdTech enrollments surface.",
      "extensionWriteRoute": "None. is_time_locatable is a view expression, not stored Alpha state.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    {
      "alphaObject": "school_period",
      "publicSurface": "alpha.school_period",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.academic_sessions",
      "baseView": "alpha.school_period_base",
      "extensionTables": [],
      "coreWriteRoute": "Route all writes to the OneRoster 1EdTech academic_sessions surface.",
      "extensionWriteRoute": "None.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    {
      "alphaObject": "person_sensitive_profile",
      "publicSurface": "alpha.person_sensitive_profile",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": "oneroster.demographics",
      "baseView": "alpha.person_sensitive_profile_base",
      "extensionTables": [],
      "coreWriteRoute": "Route sourced-field writes to the OneRoster 1EdTech demographics surface.",
      "extensionWriteRoute": "None. Authorization and redaction are API/view restrictions, not copied storage.",
      "requiredShape": "CREATE VIEW over the OneRoster 1EdTech base; no Alpha table may store sourced OneRoster columns."
    },
    {
      "alphaObject": "guardian",
      "publicSurface": "alpha.guardian_view",
      "upstreamModule": "ed_fi/1edtech",
      "baseSource": "edfi.canonical_record(resource_name=Contact)",
      "baseView": "alpha.guardian_base_view",
      "extensionTables": [],
      "coreWriteRoute": "Route all sourced-field writes to the Ed-Fi 1EdTech Contact collection; Alpha exposes only canonical, non-deleted Contact records.",
      "extensionWriteRoute": "None. Guardian facts that originate in Ed-Fi stay in edfi.canonical_record and descriptor_code-backed views.",
      "requiredShape": "CREATE VIEW over edfi.canonical_record; filter resource_name/collection_route, tenant_id, is_deleted=false, canonical state, descriptor_code resolution, and OneRoster sourcedId joins. No Alpha table may store sourced Ed-Fi columns."
    },
    {
      "alphaObject": "guardian_relationship",
      "publicSurface": "alpha.guardian_relationship_view",
      "upstreamModule": "ed_fi/1edtech",
      "baseSource": "edfi.canonical_record(resource_name=StudentContactAssociation)",
      "baseView": "alpha.guardian_relationship_base_view",
      "extensionTables": [],
      "coreWriteRoute": "Route all sourced-field writes to the Ed-Fi 1EdTech StudentContactAssociation collection; Alpha joins to OneRoster users only by platform3 sourcedId references.",
      "extensionWriteRoute": "None. Relationship descriptors and flags remain Ed-Fi canonical data.",
      "requiredShape": "CREATE VIEW over edfi.canonical_record; filter resource_name/collection_route, tenant_id, is_deleted=false, canonical state, descriptor_code resolution, and OneRoster sourcedId joins. No Alpha table may store sourced Ed-Fi columns."
    },
    {
      "alphaObject": "staff_assignment",
      "publicSurface": "alpha.staff_assignment_view",
      "upstreamModule": "ed_fi/1edtech",
      "baseSource": "edfi.canonical_record(resource_name=StaffEducationOrganizationAssignmentAssociation)",
      "baseView": "alpha.staff_assignment_base_view",
      "extensionTables": [],
      "coreWriteRoute": "Route all sourced-field writes to the Ed-Fi 1EdTech StaffEducationOrganizationAssignmentAssociation collection; OneRoster users and orgs remain the roster identity boundary.",
      "extensionWriteRoute": "None. Staff assignment facts from Ed-Fi stay in edfi.canonical_record and descriptor_code-backed views.",
      "requiredShape": "CREATE VIEW over edfi.canonical_record; filter resource_name/collection_route, tenant_id, is_deleted=false, canonical state, descriptor_code resolution, and OneRoster sourcedId joins. No Alpha table may store sourced Ed-Fi columns."
    },
    {
      "alphaObject": "program_participation",
      "publicSurface": "alpha.program_participation_view",
      "upstreamModule": "ed_fi/1edtech",
      "baseSource": "edfi.canonical_record(resource_name in GeneralStudentProgramAssociation, StudentProgramAssociation, and specializations)",
      "baseView": "alpha.program_participation_base_view",
      "extensionTables": [],
      "coreWriteRoute": "Route all sourced-field writes to the Ed-Fi 1EdTech Program and StudentProgramAssociation-family collections; Alpha joins student and place ids through OneRoster sourcedIds.",
      "extensionWriteRoute": "None. Program participation facts from Ed-Fi stay in edfi.canonical_record and descriptor_code-backed views.",
      "requiredShape": "CREATE VIEW over edfi.canonical_record; filter resource_name/collection_route, tenant_id, is_deleted=false, canonical state, descriptor_code resolution, and OneRoster sourcedId joins. No Alpha table may store sourced Ed-Fi columns."
    },
    {
      "alphaObject": "app_credential",
      "publicSurface": "alpha.app_credential",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.app_credential"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write alpha.app_credential rows with a student_sourced_id foreign key to oneroster.users.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    },
    {
      "alphaObject": "tag_definition",
      "publicSurface": "alpha.tag_definition",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.tag_definition"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write alpha.tag_definition rows only; no 1EdTech columns are copied.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    },
    {
      "alphaObject": "object_tag",
      "publicSurface": "alpha.object_tag",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.object_tag"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write alpha.object_tag rows only; object_id is a relationship reference to a live public object, not a copied 1EdTech field.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    },
    {
      "alphaObject": "alpha_level_history",
      "publicSurface": "alpha.alpha_level_history",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.alpha_level_history"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write effective-dated alpha.alpha_level_history rows with a person_id foreign key to the base person, after the base person exists. No OneRoster or Ed-Fi column is copied.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    },
    {
      "alphaObject": "age_grade_history",
      "publicSurface": "alpha.age_grade_history",
      "upstreamModule": "oneroster/1edtech",
      "baseSource": null,
      "baseView": null,
      "extensionTables": [
        "alpha.age_grade_history"
      ],
      "coreWriteRoute": "None.",
      "extensionWriteRoute": "Write effective-dated alpha.age_grade_history rows with a person_id foreign key to the base person, after the base person exists. No OneRoster or Ed-Fi column is copied.",
      "requiredShape": "CREATE TABLE is allowed because this is a pure Alpha extension."
    }
  ]
}
problemTitles
{
  "people_orgs:unsupported_query_parameter": "Remove the unsupported query parameter",
  "people_orgs:validation_failed": "Check the request",
  "people_orgs:tenant_forbidden": "This token cannot do that",
  "people_orgs:sensitive_scope_required": "Request a narrower trusted token",
  "people_orgs:not_found": "We could not find that record",
  "people_orgs:idempotency_conflict": "This retry key conflicts with the original request",
  "people_orgs:precondition_required": "Send the current version"
}
problemCategories
[
  {
    "code": "people_orgs:unsupported_query_parameter",
    "status": 400,
    "callerFix": "Remove or replace the query parameter with a documented filter, sort, cursor, limit, modifiedSince, or asOfDate parameter.",
    "itds": [
      {
        "id": "paitd-108-error-envelope",
        "title": "API Axis: Error Envelope",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-108-error-envelope"
      }
    ]
  },
  {
    "code": "people_orgs:validation_failed",
    "status": 400,
    "callerFix": "Fix field type, range, requiredness, enum, or relationship errors named in fieldErrors.",
    "itds": [
      {
        "id": "paitd-108-error-envelope",
        "title": "API Axis: Error Envelope",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-108-error-envelope"
      }
    ]
  },
  {
    "code": "people_orgs:tenant_forbidden",
    "status": 403,
    "callerFix": "Use a token scoped to the tenant and relationship being read.",
    "itds": [
      {
        "id": "paitd-108-error-envelope",
        "title": "API Axis: Error Envelope",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-108-error-envelope"
      }
    ]
  },
  {
    "code": "people_orgs:sensitive_scope_required",
    "status": 403,
    "callerFix": "Request a token with sensitive-profile or credential-status scope and the required relationship claim.",
    "itds": [
      {
        "id": "paitd-108-error-envelope",
        "title": "API Axis: Error Envelope",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-108-error-envelope"
      }
    ]
  },
  {
    "code": "people_orgs:not_found",
    "status": 404,
    "callerFix": "Check tenant scope and id. The response does not reveal cross-tenant existence.",
    "itds": [
      {
        "id": "paitd-108-error-envelope",
        "title": "API Axis: Error Envelope",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-108-error-envelope"
      }
    ]
  },
  {
    "code": "people_orgs:idempotency_conflict",
    "status": 409,
    "callerFix": "Replay the exact original request with the same key or use a new key for a different write.",
    "itds": [
      {
        "id": "paitd-108-error-envelope",
        "title": "API Axis: Error Envelope",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-108-error-envelope"
      }
    ]
  },
  {
    "code": "people_orgs:precondition_required",
    "status": 428,
    "callerFix": "Refetch the resource, keep its ETag, and send If-Match.",
    "itds": [
      {
        "id": "paitd-108-error-envelope",
        "title": "API Axis: Error Envelope",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-108-error-envelope"
      }
    ]
  }
]
policyConfig
[
  {
    "key": "alpha.policy.reality_source_mapping",
    "type": "write-boundary source mapping",
    "owner": "People & Orgs surface config",
    "meaning": "Maps authoritative SIS and TimeBack source classifications to the closed reality enum without parsing names or campus labels.",
    "requiredBy": "person.reality, place.reality, default real-only report reads, migration backfill, and deployed smoke tests that exclude test data.",
    "invalidWhen": "A report ships an exclude-list, regexes campus/person names, or treats missing reality as real.",
    "example": {
      "authoritative_real": "real",
      "qa_or_agent_test": "test",
      "generated_fixture": "synthetic"
    },
    "itds": [
      {
        "id": "paitd-103-query-model",
        "title": "API Axis: Query Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
      },
      {
        "id": "paitd-111-privacy-retention",
        "title": "API Axis: Privacy / Retention",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-111-privacy-retention"
      }
    ]
  },
  {
    "key": "alpha.policy.tenure_buckets",
    "type": "ordered bucket config",
    "owner": "People & Orgs surface config",
    "meaning": "Defines tenure bands computed from person.admission_date and asOfDate.",
    "requiredBy": "Tenure reports and cohort filters.",
    "invalidWhen": "A dashboard or skill pack hardcodes bucket edges instead of calling the surface.",
    "example": [
      {
        "label": "0-0.5 year",
        "min_days": 0,
        "max_days": 182
      },
      {
        "label": "0.5-1 year",
        "min_days": 183,
        "max_days": 365
      },
      {
        "label": "1-2 years",
        "min_days": 366,
        "max_days": 730
      },
      {
        "label": "2-3 years",
        "min_days": 731,
        "max_days": 1095
      },
      {
        "label": "3+ years",
        "min_days": 1096,
        "max_days": null
      }
    ],
    "itds": [
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      }
    ]
  },
  {
    "key": "alpha.policy.grade_alias_folds",
    "type": "alias-fold config",
    "owner": "People & Orgs surface config",
    "meaning": "Maps source grade aliases to the closed grade_level enum at write time.",
    "requiredBy": "person.grade_levels and person.age_grade.",
    "invalidWhen": "A consumer parses grade strings from users.grades, class names, or test names at read time.",
    "example": {
      "0": 0,
      "7": 7,
      "13": "reject_or_reconcile",
      "PK": -1,
      "-1": -1,
      "K": 0,
      "4TH_GRADE": 4,
      "Grade_4": 4
    },
    "itds": [
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      }
    ]
  },
  {
    "key": "alpha.policy.alpha_level_alias_folds",
    "type": "alias-fold config",
    "owner": "People & Orgs surface config",
    "meaning": "Maps live source alpha-level labels to the closed alpha_level enum at write time.",
    "requiredBy": "alpha_level reporting and point-in-time cohort slices.",
    "invalidWhen": "A consumer parses level labels from users_visibility.user_alpha_level or place names at read time.",
    "example": {
      "PKBY": "WL",
      "WL": "WL",
      "Linc": "LL",
      "LL": "LL",
      "L3": "MS",
      "Middle School": "MS",
      "L4.1": "HS",
      "L4.2": "HS",
      "L4.3": "HS",
      "High School": "HS"
    },
    "itds": [
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      },
      {
        "id": "paitd-006-tag-registry",
        "title": "Governed Tags Are Report Slices Only",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-006-tag-registry"
      }
    ]
  },
  {
    "key": "alpha.policy.level_alias_folds",
    "type": "alias-fold config",
    "owner": "People & Orgs setup import",
    "meaning": "Maps live source school-level labels to the locked place.level enum at write time.",
    "requiredBy": "place.level and school-level report slices.",
    "invalidWhen": "A consumer parses school level from source tables, place names, campus labels, or local dashboard lists at read time.",
    "example": {
      "PKBY": "WL",
      "WL": "WL",
      "Linc": "LL",
      "LL": "LL",
      "L3": "MS",
      "Middle School": "MS",
      "L4.1": "HS",
      "L4.2": "HS",
      "L4.3": "HS",
      "High School": "HS"
    },
    "itds": [
      {
        "id": "paitd-003-place-nwea-boundary",
        "title": "Place Is The Plain Alias For OneRoster Org And District Is The NWEA Account",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-003-place-nwea-boundary"
      },
      {
        "id": "paitd-006-tag-registry",
        "title": "Governed Tags Are Report Slices Only",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-006-tag-registry"
      }
    ]
  },
  {
    "key": "alpha.policy.brand_alias_folds",
    "type": "alias-fold config",
    "owner": "People & Orgs setup import",
    "meaning": "Maps live org labels and campus-taxonomy aliases to the closed brand enum at write time.",
    "requiredBy": "place.brand and NWEA Brand x Modality account grouping.",
    "invalidWhen": "A report groups by parsed school names or maintains its own campus taxonomy.",
    "example": {
      "Alpha School": "alpha",
      "Alpha Anywhere": "alpha",
      "GT School": "gt",
      "GT Anywhere": "gt",
      "TSA Online": "texas_sports_academy",
      "Texas Sports Academy": "texas_sports_academy"
    },
    "itds": [
      {
        "id": "paitd-003-place-nwea-boundary",
        "title": "Place Is The Plain Alias For OneRoster Org And District Is The NWEA Account",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-003-place-nwea-boundary"
      },
      {
        "id": "paitd-006-tag-registry",
        "title": "Governed Tags Are Report Slices Only",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-006-tag-registry"
      }
    ]
  },
  {
    "key": "alpha.policy.segment_alias_folds",
    "type": "alias-fold config",
    "owner": "People & Orgs setup import",
    "meaning": "Maps live org labels and campus-taxonomy aliases to the closed segment enum at write time.",
    "requiredBy": "place.segment and reporting slices.",
    "invalidWhen": "A dashboard parses segment from place.name, campusId, or a stale local list.",
    "example": {
      "Private": "private",
      "Virtual": "virtual",
      "SW Sales": "sw_sales",
      "Charter": "charter",
      "multi-segment district": "mixed"
    },
    "itds": [
      {
        "id": "paitd-003-place-nwea-boundary",
        "title": "Place Is The Plain Alias For OneRoster Org And District Is The NWEA Account",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-003-place-nwea-boundary"
      },
      {
        "id": "paitd-006-tag-registry",
        "title": "Governed Tags Are Report Slices Only",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-006-tag-registry"
      }
    ]
  },
  {
    "key": "alpha.policy.school_year_boundaries",
    "type": "date-boundary config",
    "owner": "Surface config shared with school_period reads",
    "meaning": "Defines the school-year boundary used by policy computations that need a year start/end.",
    "requiredBy": "asOfDate reports that align roster context to school-year windows.",
    "invalidWhen": "A report hardcodes start/end dates or parses them from school_period.title.",
    "example": {
      "start_month": 8,
      "start_day": 1,
      "end_month": 7,
      "end_day": 31
    },
    "itds": [
      {
        "id": "paitd-005-school-periods",
        "title": "School Period Is The Plain Alias For Academic Session",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-005-school-periods"
      },
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      }
    ]
  },
  {
    "key": "alpha.policy.school_day",
    "type": "enumerable school-day calendar",
    "owner": "People & Orgs calendar reads over Ed-Fi CalendarDate",
    "meaning": "Defines school-day answers from alpha.school_calendar, a view over Ed-Fi CalendarDate records keyed by school. Consumers call the surface for is-school-day, school-days-in-range, school-days-between, school-days-remaining, and next-school-year-start instead of counting weekdays or carrying holiday tables.",
    "requiredBy": "GOALS date-to-effort arithmetic, within-grade pacing, minutes-per-school-day denominators, and school-day reports.",
    "invalidWhen": "A client counts weekdays, skips summer gaps locally, stores local holidays, or parses school_period start/end dates as a school-day list.",
    "example": {
      "source_view": "alpha.school_calendar",
      "source_truth": "ed_fi.CalendarDate",
      "reason_values": [
        "instructional",
        "weekend",
        "teacher_workshop",
        "holiday_break",
        "nwea_map_testing",
        "other"
      ],
      "range_inclusive": true,
      "regression": {
        "school_id": "place_north_valley_school",
        "start_date": "2025-08-13",
        "end_date": "2026-07-24",
        "school_days_between": 204
      }
    },
    "itds": [
      {
        "id": "paitd-005-school-periods",
        "title": "School Period Is The Plain Alias For Academic Session",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-005-school-periods"
      },
      {
        "id": "paitd-103-query-model",
        "title": "API Axis: Query Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
      }
    ]
  },
  {
    "key": "alpha.policy.expected_xp_minute_convention",
    "type": "effort unit convention",
    "owner": "Cross-module policy surfaced here for roster-calendar consumers",
    "meaning": "1 expected XP is approximately 1 expected minute. Convert expected_xp to planned hours with expected_xp / 60 before applying school-day pacing.",
    "requiredBy": "GOALS effort-per-school-day calculations and any report that turns expected XP into time.",
    "invalidWhen": "A consumer learns the XP-minute relationship from production defaults such as default_xp_goal == default_minutes_goal or applies awarded XP history as expected effort.",
    "example": {
      "expected_xp": 360,
      "expected_minutes": 360,
      "planned_hours_before_calendar_pacing": 6
    },
    "itds": [
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      }
    ]
  }
]
roleViews
[
  {
    "name": "students",
    "definition": "Filter alpha.person to people with an active place_membership or class_membership where role_kind=student at asOfDate.",
    "notStorage": "Not a new table; person plus memberships remain the storage contract.",
    "invalidWhen": "A student row stores mastery, working grade, MAP result, or advancement. Those facts live in Results."
  },
  {
    "name": "parents_and_guardians",
    "definition": "Use alpha.guardian_view plus alpha.guardian_relationship_view for Ed-Fi guardian/contact facts, and alpha.person family_or_agent_person_ids only for thin OneRoster agent links.",
    "notStorage": "Guardian/contact facts are Ed-Fi-backed views, not Alpha tables; OneRoster family links remain real ids, never tags.",
    "invalidWhen": "A parent/guardian relationship is stored as a free-form tag or copied into an Alpha own-table."
  },
  {
    "name": "guides",
    "definition": "Filter alpha.person to people with role_kind=guide or class_membership.role_kind=guide at asOfDate. The inverse studentsForGuide(guide, date) joins active guide and student class_membership rows on learning_group_id and school_id.",
    "notStorage": "Not a new table; guide assignment is a dated membership and the inverse is a first-class query over those memberships.",
    "invalidWhen": "A guide is inferred by parsing a class title or email domain, or studentsForGuide is rebuilt as an undocumented client-side two-hop."
  },
  {
    "name": "staff_and_administrators",
    "definition": "Filter alpha.person to people with active staff/admin memberships for simple roster roles; use alpha.staff_assignment_view for Ed-Fi assignment-specific facts such as staff classification, title, assignment order, and full-time equivalency.",
    "notStorage": "Not a new table; staff/admin roles are dated memberships and assignment detail is an Ed-Fi-backed view.",
    "invalidWhen": "An admin list bypasses asOfDate, ignores relationship-scoped auth, or parses titles instead of using staff_classification."
  },
  {
    "name": "program_participants",
    "definition": "Use alpha.program_participation_view to answer which administrative programs a student belongs to at a place as of a date.",
    "notStorage": "Not a tag and not a Results object; it is an Ed-Fi-backed relationship view.",
    "invalidWhen": "Program participation is stored as a tag, mixed with outcomes/eligibility formulas, or queried without the begin/end date rule."
  }
]
namedQueries
[
  {
    "name": "personLifecycleDates(person)",
    "endpoint": "/people and /people/{personId}",
    "resultShape": "{ person_id, admission_date, exit_date }",
    "rawDbRule": "alpha.person.admission_date and alpha.person.exit_date come only from alpha.person_ext. admission_date is the person-level lifecycle open date; exit_date is the exclusive person-level lifecycle close date; null exit_date means still active/open after admission_date. Membership begin_date/end_date and school_period start_date/end_date are separate interval facts.",
    "invalidWhen": "A consumer or doer treats membership end_date as person exit_date, uses school_period start_date as admission_date, or advertises a generic start_date for person lifecycle.",
    "itds": [
      {
        "id": "paitd-002-person-vocabulary",
        "title": "Person Vocabulary",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture/#paitd-002-person-vocabulary"
      },
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture/#paitd-007-tenure-and-grade-context"
      },
      {
        "id": "paitd-011-storage-model",
        "title": "Storage Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture/#paitd-011-storage-model"
      }
    ]
  },
  {
    "name": "alphaLevel(student, date)",
    "endpoint": "/people/{personId}/alpha_level?asOfDate=YYYY-MM-DD",
    "resultShape": "{ person_id, alpha_level, begin_date, end_date, is_time_locatable }",
    "rawDbRule": "Read alpha.alpha_level_history for the person with is_time_locatable=true, begin_date <= :as_of_date, and (end_date is null or :as_of_date < end_date), then join alpha.person and require p.reality='real' for ordinary reports.",
    "invalidWhen": "Answered from one mutable current alpha_level field, parsed from place/class names, or returned without the begin/end null rule.",
    "itds": [
      {
        "id": "paitd-018-over-time-history",
        "title": "Alpha Level And Age Grade Keep Effective-Dated History, Read By AsOfDate",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-018-over-time-history"
      },
      {
        "id": "paitd-017-reality-flag",
        "title": "Reality Is A Typed Closed Flag On Person And Place, Set At Write Time",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-017-reality-flag"
      },
      {
        "id": "paitd-004-point-in-time-memberships",
        "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
      },
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      },
      {
        "id": "paitd-103-query-model",
        "title": "API Axis: Query Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
      }
    ]
  },
  {
    "name": "ageGrade(student, date)",
    "endpoint": "/people/{personId}/age_grade?asOfDate=YYYY-MM-DD",
    "resultShape": "{ person_id, age_grade, begin_date, end_date, is_time_locatable }",
    "rawDbRule": "Read alpha.age_grade_history for the person with is_time_locatable=true, begin_date <= :as_of_date, and (end_date is null or :as_of_date < end_date), then join alpha.person and require p.reality='real' for ordinary reports.",
    "invalidWhen": "Answered only from alpha.person.age_grade when the caller asked for a historical date, parsed from class/test labels, or mixed with Results working grade.",
    "itds": [
      {
        "id": "paitd-018-over-time-history",
        "title": "Alpha Level And Age Grade Keep Effective-Dated History, Read By AsOfDate",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-018-over-time-history"
      },
      {
        "id": "paitd-017-reality-flag",
        "title": "Reality Is A Typed Closed Flag On Person And Place, Set At Write Time",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-017-reality-flag"
      },
      {
        "id": "paitd-004-point-in-time-memberships",
        "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
      },
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      },
      {
        "id": "paitd-103-query-model",
        "title": "API Axis: Query Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
      }
    ]
  },
  {
    "name": "activePersonalizedCourseBindings(student, date)",
    "endpoint": "/people/{personId}/active_course_bindings?asOfDate=YYYY-MM-DD&reality=real",
    "resultShape": "{ person_id, asOfDate, reality, data[{ course_id, source_course_ref, subject_id, course_grade_mode, course_grade_levels[], student_id, next_lesson_path, evidence_memberships[] }], count, links }",
    "rawDbRule": "Start from active alpha.class_membership rows for the exact real student and date using begin_date <= :as_of_date and (:as_of_date < end_date or end_date is null). Join the exact OneRoster class course_sourced_id to alpha.curriculum_courses.source_refs. Return only non-retired published personalized static course roots whose stored alpha.student_id exactly equals the requested person. subject_id is the eight-value authoring registry id owned by loop/context/authoring-subject-registry.json; explicit machine subject codes outrank display labels and unsupported machine codes fail closed. A source_course_ref resolving to multiple active roots is a typed conflict across all active learning groups. The separate enrolled_grade and enrollment-anchor reads remain exact-six reporting contracts.",
    "invalidWhen": "A client composes subject-specific reads, parses course or class labels, infers student ownership from a name, omits asOfDate, admits shared/draft/dynamic/wrong-owner roots, treats malformed or timed-out dependency data as absence, or expands the exact-six reporting registry.",
    "itds": [
      {
        "id": "paitd-004-point-in-time-memberships",
        "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
      },
      {
        "id": "paitd-103-query-model",
        "title": "API Axis: Query Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
      },
      {
        "id": "paitd-106-auth-shape",
        "title": "API Axis: Auth Shape",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-106-auth-shape"
      }
    ]
  },
  {
    "name": "enrolledGradeInSubject(student, subject, date)",
    "endpoint": "/people/{personId}/enrolled_grade?subject=math&asOfDate=YYYY-MM-DD",
    "resultShape": "{ person_id, subject, asOfDate, grade_level, grade_levels, enrolled_grade_mode, curriculum_course_bindings[], evidence_memberships[] }",
    "rawDbRule": "Public People & Orgs subject query values are the canonical lowercase Alpha subject ids: math, reading, language, science, vocabulary, writing. Display/source aliases such as Math or Mathematics are folded only at import/write boundaries and are validation errors on public reads. Use the surface-owned query/read function so the subject and grade context come from imported typed OneRoster class/course context for the active learning_group_id, and the date window comes from active alpha.class_membership rows with is_time_locatable=true, begin_date <= :as_of_date, and (end_date is null or :as_of_date < end_date). OneRoster subjects is multi-valued: every canonical subject declared by the exact class/course row materializes independently without duplicating the class or membership. curriculum_course_bindings[].course_id is resolved only by exact source_course_ref/source_refs over alpha.curriculum_courses; that same exact course binds each of its declared canonical source subjects even when Curriculum records one primary subject_id. The returned id is for Curriculum GET /alpha/curriculum/v1/courses/{courseId}/next-lesson. Untyped or unsupported source subjects such as FastMath remain absence; non-404 upstream/storage errors are not absence. Join alpha.person and alpha.place and require real student/school rows for ordinary reports.",
    "invalidWhen": "Computed by parsing course titles, answered from age_grade or Results working grade, using display/source aliases such as subject=Math on public reads, ignoring begin_date null rows, missing asOfDate, or selecting a test/synthetic person/place by default.",
    "itds": [
      {
        "id": "paitd-004-point-in-time-memberships",
        "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
      },
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      },
      {
        "id": "paitd-103-query-model",
        "title": "API Axis: Query Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
      }
    ]
  },
  {
    "name": "firstEnrolledCourseGrade(student, subject)",
    "endpoint": "/people/{personId}/enrollment_anchors/first_enrolled_course_grade?subject=math",
    "resultShape": "{ person_id, subject, grade_level, first_enrolled_course_grade_level, grade_levels, course_grade_mode, first_enrolled_course_begin_date, evidence_membership_id }",
    "rawDbRule": "Public People & Orgs subject query values are the canonical lowercase Alpha subject ids: math, reading, language, science, vocabulary, writing. Display/source aliases such as Math or Mathematics are folded only at import/write boundaries and are validation errors on public reads. Use the surface-owned query/read function so the subject, course_grade_mode, and course_grade_levels come from Curriculum's typed learning-group/course context and the enrollment date comes from alpha.class_membership. The raw path must not parse subject or grade from class names.",
    "invalidWhen": "Computed by parsing course titles, using the single-grade-only anchor as the general first-course answer, treating multi-grade courses as single-grade, using display/source aliases such as subject=Math on public reads, ignoring begin_date null rows, or selecting a test/synthetic person/place by default.",
    "itds": [
      {
        "id": "paitd-004-point-in-time-memberships",
        "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
      },
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      },
      {
        "id": "paitd-103-query-model",
        "title": "API Axis: Query Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
      }
    ]
  },
  {
    "name": "firstSingleGradeEnrollmentDate(student, subject)",
    "endpoint": "/people/{personId}/enrollment_anchors/first_single_grade?subject=math",
    "resultShape": "{ person_id, subject, grade_level, first_single_grade_enrollment_date, evidence_membership_id }",
    "rawDbRule": "Public People & Orgs subject query values are the canonical lowercase Alpha subject ids: math, reading, language, science, vocabulary, writing. Display/source aliases such as Math or Mathematics are folded only at import/write boundaries and are validation errors on public reads. Use the surface-owned query/read function so the subject and single-grade classification come from Curriculum's typed learning-group/course context and the enrollment dates come from alpha.class_membership. The raw path must not parse subject or grade from class names.",
    "invalidWhen": "Computed by parsing course titles, treating multi-grade courses as single-grade, using display/source aliases such as subject=Math on public reads, ignoring begin_date null rows, or selecting a test/synthetic person/place by default.",
    "itds": [
      {
        "id": "paitd-004-point-in-time-memberships",
        "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
      },
      {
        "id": "paitd-007-tenure-and-grade-context",
        "title": "Tenure And Grade Context Are Typed Inputs, Not Dashboard Math",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-007-tenure-and-grade-context"
      },
      {
        "id": "paitd-103-query-model",
        "title": "API Axis: Query Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
      }
    ]
  },
  {
    "name": "studentsForGuide(guide, date)",
    "endpoint": "/guides/{guidePersonId}/students?asOfDate=YYYY-MM-DD",
    "resultShape": "{ guide_person_id, student_person_id, learning_group_id, school_id, begin_date, end_date }[]",
    "rawDbRule": "Join active guide class_membership rows to active student class_membership rows on tenant_id, school_id, and learning_group_id for the same asOfDate; join alpha.person for both sides and alpha.place for the school; require all joined person/place reality values to be real unless explicitly including test/synthetic rows.",
    "invalidWhen": "Implemented as an undocumented two-hop in the client, inferred from staff titles, missing asOfDate, or returning test/synthetic students in ordinary reports.",
    "itds": [
      {
        "id": "paitd-004-point-in-time-memberships",
        "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
      },
      {
        "id": "paitd-102-read-shape",
        "title": "API Axis: Read Shape",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-102-read-shape"
      },
      {
        "id": "paitd-103-query-model",
        "title": "API Axis: Query Model",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
      },
      {
        "id": "paitd-106-auth-shape",
        "title": "API Axis: Auth Shape",
        "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-106-auth-shape"
      }
    ]
  }
]
cutsAndRestrictions
[
  {
    "source": "oneroster.users.password",
    "alphaDisposition": "cut",
    "reason": "Secrets are never roster fields or tags. Alpha uses alpha.app_credential.secret_ref instead.",
    "itd": {
      "id": "paitd-008-app-credentials",
      "title": "App Credentials Use Vault References, Never Roster Password Fields",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-008-app-credentials"
    },
    "invalidIf": "Any Alpha person response, tag, log, example, or Problem contains a password or plaintext secret."
  },
  {
    "source": "oneroster.user_profiles.password",
    "alphaDisposition": "cut",
    "reason": "User profile credentials are operational secrets, not roster facts.",
    "itd": {
      "id": "paitd-008-app-credentials",
      "title": "App Credentials Use Vault References, Never Roster Password Fields",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-008-app-credentials"
    },
    "invalidIf": "The value appears outside the managed vault or is exposed through an Alpha API."
  },
  {
    "source": "oneroster.user_profiles.*",
    "alphaDisposition": "restrict",
    "reason": "Profile context can exist in OneRoster provenance, but ordinary Alpha roster reads expose only non-secret profile references and app credential status.",
    "itd": {
      "id": "paitd-009-sensitive-profile-privacy",
      "title": "Sensitive Profiles Are Restricted, Not Default Roster Fields",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-009-sensitive-profile-privacy"
    },
    "invalidIf": "Vendor username, credential type, or profile description leaks into ordinary person or membership list responses."
  },
  {
    "source": "oneroster.demographics.*",
    "alphaDisposition": "restrict",
    "reason": "Sensitive demographic fields move behind alpha.person_sensitive_profile with explicit scopes and audit.",
    "itd": {
      "id": "paitd-009-sensitive-profile-privacy",
      "title": "Sensitive Profiles Are Restricted, Not Default Roster Fields",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-009-sensitive-profile-privacy"
    },
    "invalidIf": "Birth date, sex, race/ethnicity, birth location, or residence status appears in ordinary people lists."
  },
  {
    "source": "oneroster.users.user_ids / identifier / user_master_identifier",
    "alphaDisposition": "cut from ordinary person",
    "reason": "Alpha identity is the plain TimeBack person_id plus authorized contact fields. Extra external identifiers stay in the 1EdTech surface unless a future Alpha ITD ships them.",
    "itd": {
      "id": "paitd-002-person-vocabulary",
      "title": "Person Is The Plain Alias For OneRoster User",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-002-person-vocabulary"
    },
    "invalidIf": "A consumer has to choose between competing person identifiers for ordinary Alpha joins."
  },
  {
    "source": "oneroster.users.preferred_middle_name / pronouns",
    "alphaDisposition": "not public in this attempt",
    "reason": "The approved alias map does not publish these as public Alpha fields. They remain available in the 1EdTech surface until a future People & Orgs architecture ITD adds a privacy-scoped Alpha alias.",
    "itd": {
      "id": "paitd-010-alias-map-contract",
      "title": "Alias Map Is A Generated Architecture Artifact",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-010-alias-map-contract"
    },
    "invalidIf": "A downstream artifact exposes an unmapped public Alpha field."
  },
  {
    "source": "oneroster.users.import_batch_id",
    "alphaDisposition": "cut from Alpha public view",
    "reason": "Import batch provenance stays on the 1EdTech OneRoster ingest rows. Alpha exposes person source_updated_at and platform collection sync controls; consumers must not join roster answers by import batch.",
    "itd": {
      "id": "paitd-010-alias-map-contract",
      "title": "Alias Map Is A Generated Architecture Artifact",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-010-alias-map-contract"
    },
    "invalidIf": "A raw Alpha person query requires import_batch_id or treats one import batch as the roster truth for an as-of-date answer."
  },
  {
    "source": "oneroster.orgs.import_batch_id",
    "alphaDisposition": "cut from Alpha public view",
    "reason": "Import batch provenance stays on the 1EdTech OneRoster ingest rows. Alpha exposes place source_updated_at and platform collection sync controls; consumers must not group schools or districts by ingest batch.",
    "itd": {
      "id": "paitd-010-alias-map-contract",
      "title": "Alias Map Is A Generated Architecture Artifact",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-010-alias-map-contract"
    },
    "invalidIf": "A raw Alpha place query requires import_batch_id or uses it as a tenant, district, brand, modality, or school-period boundary."
  },
  {
    "source": "oneroster.roles.import_batch_id",
    "alphaDisposition": "cut from Alpha public view",
    "reason": "Import batch provenance stays on the 1EdTech role ingest rows. Alpha place_membership answers use person_id, place_id, role_kind, begin_date, end_date, and is_time_locatable instead.",
    "itd": {
      "id": "paitd-004-point-in-time-memberships",
      "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
    },
    "invalidIf": "A raw Alpha place-membership query filters by import_batch_id instead of the documented point-in-time membership rule."
  },
  {
    "source": "oneroster.enrollments.import_batch_id",
    "alphaDisposition": "cut from Alpha public view",
    "reason": "Import batch provenance stays on the 1EdTech enrollment ingest rows. Alpha class_membership answers use person_id, school_id, learning_group_id, role_kind, begin_date, end_date, and is_time_locatable instead.",
    "itd": {
      "id": "paitd-004-point-in-time-memberships",
      "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
    },
    "invalidIf": "A raw Alpha class-membership query filters by import_batch_id instead of tenant, school, learning_group, role, and as-of-date."
  },
  {
    "source": "oneroster.academic_sessions.import_batch_id",
    "alphaDisposition": "cut from Alpha public view",
    "reason": "Import batch provenance stays on the 1EdTech academic-session ingest rows. Alpha school_period exposes typed period fields and source_updated_at for sync.",
    "itd": {
      "id": "paitd-005-school-periods",
      "title": "School Period Is The Plain Alias For Academic Session",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-005-school-periods"
    },
    "invalidIf": "A raw Alpha school-period query uses import_batch_id to infer school-year or term membership."
  },
  {
    "source": "oneroster.demographics.import_batch_id",
    "alphaDisposition": "cut from Alpha public view",
    "reason": "Import batch provenance stays on the 1EdTech demographics ingest rows. Alpha sensitive-profile access is scope-gated and must not expose ingest-batch identifiers.",
    "itd": {
      "id": "paitd-009-sensitive-profile-privacy",
      "title": "Sensitive Profiles Are Restricted, Not Default Roster Fields",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-009-sensitive-profile-privacy"
    },
    "invalidIf": "An Alpha sensitive-profile read or migration exposes import_batch_id outside an authorized 1EdTech audit path."
  },
  {
    "source": "oneroster.user_profiles.import_batch_id",
    "alphaDisposition": "cut from Alpha public view",
    "reason": "Import batch provenance stays on the 1EdTech user-profile ingest rows. Alpha cuts profile secrets and exposes only app_credential secret references.",
    "itd": {
      "id": "paitd-008-app-credentials",
      "title": "App Credentials Use Vault References, Never Roster Password Fields",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-008-app-credentials"
    },
    "invalidIf": "An Alpha app credential or profile query requires OneRoster user_profile import_batch_id."
  },
  {
    "source": "oneroster.roles.status",
    "alphaDisposition": "cut",
    "reason": "The approved alias map does not publish role-row lifecycle status on alpha.place_membership. Alpha answers active membership from begin_date, end_date, and is_time_locatable; OneRoster delta lifecycle remains on the 1EdTech roles surface for audit.",
    "itd": {
      "id": "paitd-004-point-in-time-memberships",
      "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
    },
    "invalidIf": "A raw Alpha roster query treats role status as the active-as-of rule or a downstream artifact exposes an unmapped place_membership source_status field."
  },
  {
    "source": "oneroster.roles.date_last_modified",
    "alphaDisposition": "cut",
    "reason": "The approved alias map does not publish a roles modified timestamp on alpha.place_membership. Consumers use documented membership date windows for as-of answers and platform/API collection clocks for sync.",
    "itd": {
      "id": "paitd-103-query-model",
      "title": "API Axis: Query Model",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
    },
    "invalidIf": "A downstream artifact requires alpha.place_membership.source_updated_at without a new architecture alias-map decision."
  },
  {
    "source": "oneroster.enrollments.status",
    "alphaDisposition": "cut",
    "reason": "The approved alias map does not publish enrollment-row lifecycle status on alpha.class_membership. Alpha answers active class membership from begin_date, end_date, and is_time_locatable; OneRoster delta lifecycle remains on the 1EdTech enrollments surface for audit.",
    "itd": {
      "id": "paitd-004-point-in-time-memberships",
      "title": "Memberships Are Effective-Dated And Answered By AsOfDate",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-004-point-in-time-memberships"
    },
    "invalidIf": "A raw Alpha class roster query treats enrollment status as the active-as-of rule or a downstream artifact exposes an unmapped class_membership source_status field."
  },
  {
    "source": "oneroster.enrollments.date_last_modified",
    "alphaDisposition": "cut",
    "reason": "The approved alias map does not publish an enrollments modified timestamp on alpha.class_membership. Consumers use documented membership date windows for as-of answers and platform/API collection clocks for sync.",
    "itd": {
      "id": "paitd-103-query-model",
      "title": "API Axis: Query Model",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-103-query-model"
    },
    "invalidIf": "A downstream artifact requires alpha.class_membership.source_updated_at without a new architecture alias-map decision."
  },
  {
    "source": "OneRoster classes, courses, resources, lineItems, results, categories, scoreScales",
    "alphaDisposition": "cut by module boundary",
    "reason": "People & Orgs owns who, where, and as-of-date belonging. Content, Results, Curriculum, and Events own the adjacent facts.",
    "itd": {
      "id": "paitd-001-module-boundary",
      "title": "People & Orgs Owns Who, Where, And As-Of-Date Belonging",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-001-module-boundary"
    },
    "invalidIf": "This module stores mastery, test scores, activity events, content effectiveness, curriculum graph, or gradebook rollups."
  },
  {
    "source": "Ed-Fi attendance, discipline, transcripts, health, finance, credentials, evaluation, and full HR/employment records",
    "alphaDisposition": "cut by module boundary",
    "reason": "Only Ed-Fi records that say who someone is or where they belong are exposed here: guardian, guardian_relationship, staff_assignment, and program_participation. Other Ed-Fi domains remain on Ed-Fi, Results, Policy, or other owning surfaces.",
    "itd": {
      "id": "paitd-012-edfi-second-upstream",
      "title": "Ed-Fi Administrative Records Are A Second View-Only Upstream",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-012-edfi-second-upstream"
    },
    "invalidIf": "A People & Orgs row stores attendance, discipline, transcript, staff evaluation, finance, service effectiveness, eligibility, or outcome facts."
  },
  {
    "source": "edfi.draft_record and edfi.canonical_record.is_deleted=true",
    "alphaDisposition": "restrict from ordinary Alpha reads",
    "reason": "Drafts are UI-recovery state and deleted canonical records are audit/retention history. Ordinary Alpha views expose only canonical, non-deleted Ed-Fi facts.",
    "itd": {
      "id": "paitd-012-edfi-second-upstream",
      "title": "Ed-Fi Administrative Records Are A Second View-Only Upstream",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-012-edfi-second-upstream"
    },
    "invalidIf": "A normal guardian, staff_assignment, or program_participation query returns draft records or is_deleted=true rows without an authorized audit/admin path."
  },
  {
    "source": "Ed-Fi descriptor tables for Relation, StaffClassification, ProgramType, and ProgramParticipationStatus",
    "alphaDisposition": "restrict to resolved descriptor values",
    "reason": "The surface resolves descriptors through edfi.descriptor_code so consumers never ship descriptor maps, parse titles, or use free-form tags.",
    "itd": {
      "id": "paitd-012-edfi-second-upstream",
      "title": "Ed-Fi Administrative Records Are A Second View-Only Upstream",
      "href": "https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/architecture#paitd-012-edfi-second-upstream"
    },
    "invalidIf": "A skill pack or raw-query recipe carries its own descriptor table or parses descriptor names in client code."
  }
]

Endpoints

POST /dev/mint?tenantId=demo

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

id
endpoint-mint-demo-token
operation
mintDemoToken
auth
None
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
tenantIdQuerystringYesMust be demo. The handler rejects real tenants.["paitd-109-tenant-routing"]

responseRows

namelocationtyperequireddescriptiontrace
tokenResponseJWT stringYesShort-lived HS256 token scoped to the demo tenant.["paitd-106-auth-shape","paitd-109-tenant-routing"]
tokenTypeResponsestringYesBearer.["paitd-106-auth-shape"]
expiresInResponseinteger secondsYesLifetime in seconds.["paitd-106-auth-shape"]
tenantIdResponsestringYesThe tenant scope, always demo for this endpoint.["paitd-109-tenant-routing"]
tenant_idResponsestringYesSame tenant scope, snake_case for agents that preserve platform claims.["paitd-109-tenant-routing"]
expiresAtResponseISO 8601 datetimeYesExpiration time for the token.["paitd-106-auth-shape"]
roles[]Responsestring[]YesDemo roles carried by the token.["paitd-106-auth-shape"]
scopes[]Responsestring[]YesDemo scopes carried by the token.["paitd-106-auth-shape"]
links.customerWebsiteResponseURLYesLink back to this quickstart.["paitd-102-read-shape"]
traces
[
  "paitd-106-auth-shape",
  "paitd-109-tenant-routing"
]

GET /people

Lists person rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-person
operation
listPerson
auth
people_orgs:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
realityQueryreal | test | syntheticNoExplicitly selects which reality classification to include. Omit for ordinary customer reports, which default to real rows only. Invalid values return people_orgs:validation_failed.["paitd-017-reality-flag","paitd-103-query-model","paitd-108-error-envelope"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: personId, email, isEnabled, roleKind via membership, placeId via membership, schoolId via class_membership, ageGrade, gradeLevel, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: last_name, first_name, person_id, source_updated_at. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponsePerson[]YesOne human in the roster: student, parent, guardian, guide, staff member, or administrator. A person's roles are dated memberships, not columns hidden inside the person row.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-person
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-017-reality-flag","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-tenant-id
person_idResponsestringYesStable TimeBack person id for one roster human. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.person). Example: "person_ada_lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-updated-at
realityResponsereal | test | syntheticYesTyped reality classification for this person. Ordinary reports default to reality=real so test and synthetic people never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-reality
is_enabledResponsebooleanYesWhether the source system says this person's account is enabled. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-is-enabled
usernameResponsestringYesRoster username for the person. Range: 1 to 255 visible characters. It is not a password. Example: "ada.lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-username
first_nameResponsestringYesLegal or source first name. Range: 1 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-first-name
last_nameResponsestringYesLegal or source family name. Range: 1 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-last-name
middle_nameResponsestringNoLegal or source middle name. Range: 0 to 200 visible characters. Example: "Byron". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-middle-name
preferred_first_nameResponsestringNoPreferred first name. Range: 0 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-first-name
preferred_last_nameResponsestringNoPreferred family name. Range: 0 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-last-name
emailResponseemail stringNoContact email visible only to scopes allowed for this relationship. Range: 0 to 320 characters, parseable as email when supplied. Example: "ada@example.edu". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-email
smsResponsestringNoSMS contact address supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sms
phoneResponsestringNoPhone contact supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-phone
family_or_agent_person_idsResponsearray of person idsNoExplicit OneRoster agent relationships such as parent or guardian links. Range: Each id is 1 to 255 printable characters and must reference a person in the same tenant when supplied. Example: ["person_grace_hopper"]. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-family-or-agent-person-ids
grade_levelsResponsearray of grade_level integersNoSource grade values folded to the Alpha grade_level closed enum at write time. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Live aliases PK->-1, K->0, 4TH_GRADE/Grade_4->4 fold at write time. Example: [7]. Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-grade-levels
primary_place_idResponseplace idNoSource primary organization for the person, expressed as an Alpha place id. Range: 1 to 255 printable characters when supplied. Example: "place_north_valley_school". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-primary-place-id
admission_dateResponsedateConditionalDate the student joined the school or program for tenure calculations. Range: ISO 8601 date YYYY-MM-DD. Example: "2025-08-18". Source: Alpha extend.["paitd-017-reality-flag","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-admission-date
exit_dateResponsedateConditionalExclusive person-level lifecycle close date. Null means no known exit and the person lifecycle remains open after admission_date. This is not derived from membership end_date or school-period start_date.["paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-exit-date
age_gradeResponsegrade_level integerConditionalCanonical age-grade context folded at write time from source grade aliases. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-017-reality-flag","paitd-018-over-time-history","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-age-grade
traces
[
  "paitd-017-reality-flag",
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /people/{personId}

Reads one person resource and returns an ETag when the resource is mutable.

id
endpoint-get-person
operation
getPerson
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
personIdPathstringYes["paitd-102-read-shape"]Person id from person.person_id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-017-reality-flag","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-tenant-id
person_idResponsestringYesStable TimeBack person id for one roster human. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.person). Example: "person_ada_lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-updated-at
realityResponsereal | test | syntheticYesTyped reality classification for this person. Ordinary reports default to reality=real so test and synthetic people never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-reality
is_enabledResponsebooleanYesWhether the source system says this person's account is enabled. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-is-enabled
usernameResponsestringYesRoster username for the person. Range: 1 to 255 visible characters. It is not a password. Example: "ada.lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-username
first_nameResponsestringYesLegal or source first name. Range: 1 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-first-name
last_nameResponsestringYesLegal or source family name. Range: 1 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-last-name
middle_nameResponsestringNoLegal or source middle name. Range: 0 to 200 visible characters. Example: "Byron". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-middle-name
preferred_first_nameResponsestringNoPreferred first name. Range: 0 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-first-name
preferred_last_nameResponsestringNoPreferred family name. Range: 0 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-last-name
emailResponseemail stringNoContact email visible only to scopes allowed for this relationship. Range: 0 to 320 characters, parseable as email when supplied. Example: "ada@example.edu". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-email
smsResponsestringNoSMS contact address supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sms
phoneResponsestringNoPhone contact supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-phone
family_or_agent_person_idsResponsearray of person idsNoExplicit OneRoster agent relationships such as parent or guardian links. Range: Each id is 1 to 255 printable characters and must reference a person in the same tenant when supplied. Example: ["person_grace_hopper"]. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-family-or-agent-person-ids
grade_levelsResponsearray of grade_level integersNoSource grade values folded to the Alpha grade_level closed enum at write time. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Live aliases PK->-1, K->0, 4TH_GRADE/Grade_4->4 fold at write time. Example: [7]. Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-grade-levels
primary_place_idResponseplace idNoSource primary organization for the person, expressed as an Alpha place id. Range: 1 to 255 printable characters when supplied. Example: "place_north_valley_school". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-primary-place-id
admission_dateResponsedateConditionalDate the student joined the school or program for tenure calculations. Range: ISO 8601 date YYYY-MM-DD. Example: "2025-08-18". Source: Alpha extend.["paitd-017-reality-flag","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-admission-date
exit_dateResponsedateConditionalExclusive person-level lifecycle close date. Null means no known exit and the person lifecycle remains open after admission_date. This is not derived from membership end_date or school-period start_date.["paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-exit-date
age_gradeResponsegrade_level integerConditionalCanonical age-grade context folded at write time from source grade aliases. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-017-reality-flag","paitd-018-over-time-history","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-age-grade
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-017-reality-flag",
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /people

Creates one person resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-person
operation
createPerson
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
person_idBodystringYesStable TimeBack person id for one roster human. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.person). Example: "person_ada_lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-010-alias-map-contract"]
source_statusBodystring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-111-privacy-retention"]
realityBodyreal | test | syntheticYesTyped reality classification for this person. Ordinary reports default to reality=real so test and synthetic people never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]
is_enabledBodybooleanYesWhether the source system says this person's account is enabled. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
usernameBodystringYesRoster username for the person. Range: 1 to 255 visible characters. It is not a password. Example: "ada.lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]
first_nameBodystringYesLegal or source first name. Range: 1 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
last_nameBodystringYesLegal or source family name. Range: 1 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
middle_nameBodystringNoLegal or source middle name. Range: 0 to 200 visible characters. Example: "Byron". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
preferred_first_nameBodystringNoPreferred first name. Range: 0 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
preferred_last_nameBodystringNoPreferred family name. Range: 0 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
emailBodyemail stringNoContact email visible only to scopes allowed for this relationship. Range: 0 to 320 characters, parseable as email when supplied. Example: "ada@example.edu". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]
smsBodystringNoSMS contact address supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]
phoneBodystringNoPhone contact supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]
family_or_agent_person_idsBodyarray of person idsNoExplicit OneRoster agent relationships such as parent or guardian links. Range: Each id is 1 to 255 printable characters and must reference a person in the same tenant when supplied. Example: ["person_grace_hopper"]. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]
grade_levelsBodyarray of grade_level integersNoSource grade values folded to the Alpha grade_level closed enum at write time. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Live aliases PK->-1, K->0, 4TH_GRADE/Grade_4->4 fold at write time. Example: [7]. Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context"]
primary_place_idBodyplace idNoSource primary organization for the person, expressed as an Alpha place id. Range: 1 to 255 printable characters when supplied. Example: "place_north_valley_school". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]
admission_dateBodydateConditionalDate the student joined the school or program for tenure calculations. Range: ISO 8601 date YYYY-MM-DD. Example: "2025-08-18". Source: Alpha extend.["paitd-017-reality-flag","paitd-007-tenure-and-grade-context"]
age_gradeBodygrade_level integerConditionalCanonical age-grade context folded at write time from source grade aliases. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-017-reality-flag","paitd-018-over-time-history","paitd-007-tenure-and-grade-context"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-017-reality-flag","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-tenant-id
person_idResponsestringYesStable TimeBack person id for one roster human. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.person). Example: "person_ada_lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-updated-at
realityResponsereal | test | syntheticYesTyped reality classification for this person. Ordinary reports default to reality=real so test and synthetic people never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-reality
is_enabledResponsebooleanYesWhether the source system says this person's account is enabled. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-is-enabled
usernameResponsestringYesRoster username for the person. Range: 1 to 255 visible characters. It is not a password. Example: "ada.lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-username
first_nameResponsestringYesLegal or source first name. Range: 1 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-first-name
last_nameResponsestringYesLegal or source family name. Range: 1 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-last-name
middle_nameResponsestringNoLegal or source middle name. Range: 0 to 200 visible characters. Example: "Byron". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-middle-name
preferred_first_nameResponsestringNoPreferred first name. Range: 0 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-first-name
preferred_last_nameResponsestringNoPreferred family name. Range: 0 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-last-name
emailResponseemail stringNoContact email visible only to scopes allowed for this relationship. Range: 0 to 320 characters, parseable as email when supplied. Example: "ada@example.edu". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-email
smsResponsestringNoSMS contact address supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sms
phoneResponsestringNoPhone contact supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-phone
family_or_agent_person_idsResponsearray of person idsNoExplicit OneRoster agent relationships such as parent or guardian links. Range: Each id is 1 to 255 printable characters and must reference a person in the same tenant when supplied. Example: ["person_grace_hopper"]. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-family-or-agent-person-ids
grade_levelsResponsearray of grade_level integersNoSource grade values folded to the Alpha grade_level closed enum at write time. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Live aliases PK->-1, K->0, 4TH_GRADE/Grade_4->4 fold at write time. Example: [7]. Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-grade-levels
primary_place_idResponseplace idNoSource primary organization for the person, expressed as an Alpha place id. Range: 1 to 255 printable characters when supplied. Example: "place_north_valley_school". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-primary-place-id
admission_dateResponsedateConditionalDate the student joined the school or program for tenure calculations. Range: ISO 8601 date YYYY-MM-DD. Example: "2025-08-18". Source: Alpha extend.["paitd-017-reality-flag","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-admission-date
exit_dateResponsedateConditionalExclusive person-level lifecycle close date. Null means no known exit and the person lifecycle remains open after admission_date. This is not derived from membership end_date or school-period start_date.["paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-exit-date
age_gradeResponsegrade_level integerConditionalCanonical age-grade context folded at write time from source grade aliases. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-017-reality-flag","paitd-018-over-time-history","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-age-grade
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-017-reality-flag",
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /people/{personId}

Updates one person resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-person
operation
updatePerson
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
personIdPathstringYes["paitd-102-read-shape"]Person id from person.person_id.
source_statusBodystring enumNoOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-111-privacy-retention"]
source_updated_atBodyISO 8601 datetimeNoSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-103-query-model"]
realityBodyreal | test | syntheticNoTyped reality classification for this person. Ordinary reports default to reality=real so test and synthetic people never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]
is_enabledBodybooleanNoWhether the source system says this person's account is enabled. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
usernameBodystringNoRoster username for the person. Range: 1 to 255 visible characters. It is not a password. Example: "ada.lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]
first_nameBodystringNoLegal or source first name. Range: 1 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
last_nameBodystringNoLegal or source family name. Range: 1 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
middle_nameBodystringNoLegal or source middle name. Range: 0 to 200 visible characters. Example: "Byron". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
preferred_first_nameBodystringNoPreferred first name. Range: 0 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
preferred_last_nameBodystringNoPreferred family name. Range: 0 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]
emailBodyemail stringNoContact email visible only to scopes allowed for this relationship. Range: 0 to 320 characters, parseable as email when supplied. Example: "ada@example.edu". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]
smsBodystringNoSMS contact address supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]
phoneBodystringNoPhone contact supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]
family_or_agent_person_idsBodyarray of person idsNoExplicit OneRoster agent relationships such as parent or guardian links. Range: Each id is 1 to 255 printable characters and must reference a person in the same tenant when supplied. Example: ["person_grace_hopper"]. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]
grade_levelsBodyarray of grade_level integersNoSource grade values folded to the Alpha grade_level closed enum at write time. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Live aliases PK->-1, K->0, 4TH_GRADE/Grade_4->4 fold at write time. Example: [7]. Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context"]
primary_place_idBodyplace idNoSource primary organization for the person, expressed as an Alpha place id. Range: 1 to 255 printable characters when supplied. Example: "place_north_valley_school". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]
admission_dateBodydateNoDate the student joined the school or program for tenure calculations. Range: ISO 8601 date YYYY-MM-DD. Example: "2025-08-18". Source: Alpha extend.["paitd-017-reality-flag","paitd-007-tenure-and-grade-context"]
age_gradeBodygrade_level integerNoCanonical age-grade context folded at write time from source grade aliases. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-017-reality-flag","paitd-018-over-time-history","paitd-007-tenure-and-grade-context"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-017-reality-flag","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-tenant-id
person_idResponsestringYesStable TimeBack person id for one roster human. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.person). Example: "person_ada_lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-updated-at
realityResponsereal | test | syntheticYesTyped reality classification for this person. Ordinary reports default to reality=real so test and synthetic people never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-reality
is_enabledResponsebooleanYesWhether the source system says this person's account is enabled. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-is-enabled
usernameResponsestringYesRoster username for the person. Range: 1 to 255 visible characters. It is not a password. Example: "ada.lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-username
first_nameResponsestringYesLegal or source first name. Range: 1 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-first-name
last_nameResponsestringYesLegal or source family name. Range: 1 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-last-name
middle_nameResponsestringNoLegal or source middle name. Range: 0 to 200 visible characters. Example: "Byron". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-middle-name
preferred_first_nameResponsestringNoPreferred first name. Range: 0 to 200 visible characters. Example: "Ada". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-first-name
preferred_last_nameResponsestringNoPreferred family name. Range: 0 to 200 visible characters. Example: "Lovelace". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-last-name
emailResponseemail stringNoContact email visible only to scopes allowed for this relationship. Range: 0 to 320 characters, parseable as email when supplied. Example: "ada@example.edu". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-email
smsResponsestringNoSMS contact address supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sms
phoneResponsestringNoPhone contact supplied by the source. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-phone
family_or_agent_person_idsResponsearray of person idsNoExplicit OneRoster agent relationships such as parent or guardian links. Range: Each id is 1 to 255 printable characters and must reference a person in the same tenant when supplied. Example: ["person_grace_hopper"]. Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-family-or-agent-person-ids
grade_levelsResponsearray of grade_level integersNoSource grade values folded to the Alpha grade_level closed enum at write time. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Live aliases PK->-1, K->0, 4TH_GRADE/Grade_4->4 fold at write time. Example: [7]. Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-grade-levels
primary_place_idResponseplace idNoSource primary organization for the person, expressed as an Alpha place id. Range: 1 to 255 printable characters when supplied. Example: "place_north_valley_school". Source: Alpha rename.["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-primary-place-id
admission_dateResponsedateConditionalDate the student joined the school or program for tenure calculations. Range: ISO 8601 date YYYY-MM-DD. Example: "2025-08-18". Source: Alpha extend.["paitd-017-reality-flag","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-admission-date
exit_dateResponsedateConditionalExclusive person-level lifecycle close date. Null means no known exit and the person lifecycle remains open after admission_date. This is not derived from membership end_date or school-period start_date.["paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-exit-date
age_gradeResponsegrade_level integerConditionalCanonical age-grade context folded at write time from source grade aliases. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-017-reality-flag","paitd-018-over-time-history","paitd-007-tenure-and-grade-context"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-age-grade
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-017-reality-flag",
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /people/{personId}

Logically deletes or retires one person resource without erasing historical roster evidence.

id
endpoint-delete-person
operation
deletePerson
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
personIdPathstringYes["paitd-102-read-shape"]Person id from person.person_id.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-017-reality-flag",
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /places

Lists place rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-place
operation
listPlace
auth
people_orgs:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
realityQueryreal | test | syntheticNoExplicitly selects which reality classification to include. Omit for ordinary customer reports, which default to real rows only. Invalid values return people_orgs:validation_failed.["paitd-017-reality-flag","paitd-103-query-model","paitd-108-error-envelope"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: placeKind, parentPlaceId, brand, modality, segment, level, nweaDistrictId, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: name, place_kind, source_updated_at, place_id. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponsePlace[]YesA district, school, level, department, or other roster place. For NWEA, district means exactly one Brand x Modality account.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-place
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-017-reality-flag","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-tenant-id
place_idResponsestringYesStable place id for a school, district, level, department, or NWEA account. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place). Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-updated-at
realityResponsereal | test | syntheticYesTyped reality classification for this place. Ordinary reports default to reality=real so test and synthetic schools or districts never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-reality
nameResponsestringYesHuman-readable place name. Range: 1 to 255 visible characters. Example: "TimeBack Academy - Physical". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-name
place_kindResponsestring enumYesCanonical place type. District and school are structural; tags refine them but never override them. Allowed values: department, school, district, local, state, national. Range: One of the allowed place_kind values. Example: "district". Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-kind
public_identifierResponsestringNoHuman-readable public identifier such as NCES id. Range: 0 to 255 visible characters. Example: "NCES-123456". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-public-identifier
parent_place_idResponseplace idConditionalParent place in the stock OneRoster tree. Range: 1 to 255 printable characters when supplied. Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-parent-place-id
nwea_district_idResponsestringConditionalThe NWEA district/account id for exactly one Brand x Modality account. Range: NWEA account/district id supplied by the NWEA account setup. Example: "nwea-district-physical-001". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-nwea-district-id
brandResponsestring enumConditionalLocked reporting tag for the brand half of the Brand x Modality NWEA account boundary. Allowed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Range: Closed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Example: "alpha". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-brand
modalityResponsephysical | virtualConditionalLocked reporting tag for the modality half of the Brand x Modality NWEA account boundary. Allowed values: physical, virtual. Range: physical or virtual only. Example: "physical". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-modality
segmentResponsestring enumConditionalClosed reporting segment for school and district grouping. Allowed values: charter, private, sw_sales, virtual, mixed. Range: Closed values: charter, private, sw_sales, virtual, mixed. Example: "private". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-segment
levelResponseWL | LL | L1 | L2 | MS | HSConditionalLocked school-level reporting tag for school and program cohort slices. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed locked school-level values: WL, LL, L1, L2, MS, HS. The list is seeded in alpha.tag_definition where tag_key=level and anchor=school. Example: "MS". Source: Alpha extend.["paitd-017-reality-flag","paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-level
traces
[
  "paitd-017-reality-flag",
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /places/{placeId}

Reads one place resource and returns an ETag when the resource is mutable.

id
endpoint-get-place
operation
getPlace
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
placeIdPathstringYes["paitd-102-read-shape"]Place id from place.place_id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-017-reality-flag","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-tenant-id
place_idResponsestringYesStable place id for a school, district, level, department, or NWEA account. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place). Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-updated-at
realityResponsereal | test | syntheticYesTyped reality classification for this place. Ordinary reports default to reality=real so test and synthetic schools or districts never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-reality
nameResponsestringYesHuman-readable place name. Range: 1 to 255 visible characters. Example: "TimeBack Academy - Physical". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-name
place_kindResponsestring enumYesCanonical place type. District and school are structural; tags refine them but never override them. Allowed values: department, school, district, local, state, national. Range: One of the allowed place_kind values. Example: "district". Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-kind
public_identifierResponsestringNoHuman-readable public identifier such as NCES id. Range: 0 to 255 visible characters. Example: "NCES-123456". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-public-identifier
parent_place_idResponseplace idConditionalParent place in the stock OneRoster tree. Range: 1 to 255 printable characters when supplied. Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-parent-place-id
nwea_district_idResponsestringConditionalThe NWEA district/account id for exactly one Brand x Modality account. Range: NWEA account/district id supplied by the NWEA account setup. Example: "nwea-district-physical-001". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-nwea-district-id
brandResponsestring enumConditionalLocked reporting tag for the brand half of the Brand x Modality NWEA account boundary. Allowed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Range: Closed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Example: "alpha". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-brand
modalityResponsephysical | virtualConditionalLocked reporting tag for the modality half of the Brand x Modality NWEA account boundary. Allowed values: physical, virtual. Range: physical or virtual only. Example: "physical". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-modality
segmentResponsestring enumConditionalClosed reporting segment for school and district grouping. Allowed values: charter, private, sw_sales, virtual, mixed. Range: Closed values: charter, private, sw_sales, virtual, mixed. Example: "private". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-segment
levelResponseWL | LL | L1 | L2 | MS | HSConditionalLocked school-level reporting tag for school and program cohort slices. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed locked school-level values: WL, LL, L1, L2, MS, HS. The list is seeded in alpha.tag_definition where tag_key=level and anchor=school. Example: "MS". Source: Alpha extend.["paitd-017-reality-flag","paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-level
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-017-reality-flag",
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /places

Creates one place resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-place
operation
createPlace
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
place_idBodystringYesStable place id for a school, district, level, department, or NWEA account. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place). Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-010-alias-map-contract"]
source_statusBodystring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-111-privacy-retention"]
realityBodyreal | test | syntheticYesTyped reality classification for this place. Ordinary reports default to reality=real so test and synthetic schools or districts never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]
nameBodystringYesHuman-readable place name. Range: 1 to 255 visible characters. Example: "TimeBack Academy - Physical". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
place_kindBodystring enumYesCanonical place type. District and school are structural; tags refine them but never override them. Allowed values: department, school, district, local, state, national. Range: One of the allowed place_kind values. Example: "district". Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]
public_identifierBodystringNoHuman-readable public identifier such as NCES id. Range: 0 to 255 visible characters. Example: "NCES-123456". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]
parent_place_idBodyplace idConditionalParent place in the stock OneRoster tree. Range: 1 to 255 printable characters when supplied. Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
nwea_district_idBodystringConditionalThe NWEA district/account id for exactly one Brand x Modality account. Range: NWEA account/district id supplied by the NWEA account setup. Example: "nwea-district-physical-001". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]
brandBodystring enumConditionalLocked reporting tag for the brand half of the Brand x Modality NWEA account boundary. Allowed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Range: Closed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Example: "alpha". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
modalityBodyphysical | virtualConditionalLocked reporting tag for the modality half of the Brand x Modality NWEA account boundary. Allowed values: physical, virtual. Range: physical or virtual only. Example: "physical". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
segmentBodystring enumConditionalClosed reporting segment for school and district grouping. Allowed values: charter, private, sw_sales, virtual, mixed. Range: Closed values: charter, private, sw_sales, virtual, mixed. Example: "private". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
levelBodyWL | LL | L1 | L2 | MS | HSConditionalLocked school-level reporting tag for school and program cohort slices. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed locked school-level values: WL, LL, L1, L2, MS, HS. The list is seeded in alpha.tag_definition where tag_key=level and anchor=school. Example: "MS". Source: Alpha extend.["paitd-017-reality-flag","paitd-006-tag-registry","paitd-003-place-nwea-boundary"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-017-reality-flag","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-tenant-id
place_idResponsestringYesStable place id for a school, district, level, department, or NWEA account. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place). Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-updated-at
realityResponsereal | test | syntheticYesTyped reality classification for this place. Ordinary reports default to reality=real so test and synthetic schools or districts never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-reality
nameResponsestringYesHuman-readable place name. Range: 1 to 255 visible characters. Example: "TimeBack Academy - Physical". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-name
place_kindResponsestring enumYesCanonical place type. District and school are structural; tags refine them but never override them. Allowed values: department, school, district, local, state, national. Range: One of the allowed place_kind values. Example: "district". Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-kind
public_identifierResponsestringNoHuman-readable public identifier such as NCES id. Range: 0 to 255 visible characters. Example: "NCES-123456". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-public-identifier
parent_place_idResponseplace idConditionalParent place in the stock OneRoster tree. Range: 1 to 255 printable characters when supplied. Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-parent-place-id
nwea_district_idResponsestringConditionalThe NWEA district/account id for exactly one Brand x Modality account. Range: NWEA account/district id supplied by the NWEA account setup. Example: "nwea-district-physical-001". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-nwea-district-id
brandResponsestring enumConditionalLocked reporting tag for the brand half of the Brand x Modality NWEA account boundary. Allowed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Range: Closed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Example: "alpha". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-brand
modalityResponsephysical | virtualConditionalLocked reporting tag for the modality half of the Brand x Modality NWEA account boundary. Allowed values: physical, virtual. Range: physical or virtual only. Example: "physical". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-modality
segmentResponsestring enumConditionalClosed reporting segment for school and district grouping. Allowed values: charter, private, sw_sales, virtual, mixed. Range: Closed values: charter, private, sw_sales, virtual, mixed. Example: "private". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-segment
levelResponseWL | LL | L1 | L2 | MS | HSConditionalLocked school-level reporting tag for school and program cohort slices. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed locked school-level values: WL, LL, L1, L2, MS, HS. The list is seeded in alpha.tag_definition where tag_key=level and anchor=school. Example: "MS". Source: Alpha extend.["paitd-017-reality-flag","paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-level
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-017-reality-flag",
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /places/{placeId}

Updates one place resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-place
operation
updatePlace
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
placeIdPathstringYes["paitd-102-read-shape"]Place id from place.place_id.
source_statusBodystring enumNoOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-111-privacy-retention"]
source_updated_atBodyISO 8601 datetimeNoSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-103-query-model"]
realityBodyreal | test | syntheticNoTyped reality classification for this place. Ordinary reports default to reality=real so test and synthetic schools or districts never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]
nameBodystringNoHuman-readable place name. Range: 1 to 255 visible characters. Example: "TimeBack Academy - Physical". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
place_kindBodystring enumNoCanonical place type. District and school are structural; tags refine them but never override them. Allowed values: department, school, district, local, state, national. Range: One of the allowed place_kind values. Example: "district". Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]
public_identifierBodystringNoHuman-readable public identifier such as NCES id. Range: 0 to 255 visible characters. Example: "NCES-123456". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]
parent_place_idBodyplace idNoParent place in the stock OneRoster tree. Range: 1 to 255 printable characters when supplied. Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
nwea_district_idBodystringNoThe NWEA district/account id for exactly one Brand x Modality account. Range: NWEA account/district id supplied by the NWEA account setup. Example: "nwea-district-physical-001". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]
brandBodystring enumNoLocked reporting tag for the brand half of the Brand x Modality NWEA account boundary. Allowed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Range: Closed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Example: "alpha". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
modalityBodyphysical | virtualNoLocked reporting tag for the modality half of the Brand x Modality NWEA account boundary. Allowed values: physical, virtual. Range: physical or virtual only. Example: "physical". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
segmentBodystring enumNoClosed reporting segment for school and district grouping. Allowed values: charter, private, sw_sales, virtual, mixed. Range: Closed values: charter, private, sw_sales, virtual, mixed. Example: "private". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]
levelBodyWL | LL | L1 | L2 | MS | HSNoLocked school-level reporting tag for school and program cohort slices. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed locked school-level values: WL, LL, L1, L2, MS, HS. The list is seeded in alpha.tag_definition where tag_key=level and anchor=school. Example: "MS". Source: Alpha extend.["paitd-017-reality-flag","paitd-006-tag-registry","paitd-003-place-nwea-boundary"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-017-reality-flag","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-tenant-id
place_idResponsestringYesStable place id for a school, district, level, department, or NWEA account. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place). Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-updated-at
realityResponsereal | test | syntheticYesTyped reality classification for this place. Ordinary reports default to reality=real so test and synthetic schools or districts never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: "real". Source: Alpha extend.["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-reality
nameResponsestringYesHuman-readable place name. Range: 1 to 255 visible characters. Example: "TimeBack Academy - Physical". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-name
place_kindResponsestring enumYesCanonical place type. District and school are structural; tags refine them but never override them. Allowed values: department, school, district, local, state, national. Range: One of the allowed place_kind values. Example: "district". Source: Alpha rename+restrict.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-kind
public_identifierResponsestringNoHuman-readable public identifier such as NCES id. Range: 0 to 255 visible characters. Example: "NCES-123456". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-public-identifier
parent_place_idResponseplace idConditionalParent place in the stock OneRoster tree. Range: 1 to 255 printable characters when supplied. Example: "place_timeback_physical_district". Source: Alpha rename.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-parent-place-id
nwea_district_idResponsestringConditionalThe NWEA district/account id for exactly one Brand x Modality account. Range: NWEA account/district id supplied by the NWEA account setup. Example: "nwea-district-physical-001". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-nwea-district-id
brandResponsestring enumConditionalLocked reporting tag for the brand half of the Brand x Modality NWEA account boundary. Allowed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Range: Closed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Example: "alpha". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-brand
modalityResponsephysical | virtualConditionalLocked reporting tag for the modality half of the Brand x Modality NWEA account boundary. Allowed values: physical, virtual. Range: physical or virtual only. Example: "physical". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-modality
segmentResponsestring enumConditionalClosed reporting segment for school and district grouping. Allowed values: charter, private, sw_sales, virtual, mixed. Range: Closed values: charter, private, sw_sales, virtual, mixed. Example: "private". Source: Alpha extend.["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-segment
levelResponseWL | LL | L1 | L2 | MS | HSConditionalLocked school-level reporting tag for school and program cohort slices. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed locked school-level values: WL, LL, L1, L2, MS, HS. The list is seeded in alpha.tag_definition where tag_key=level and anchor=school. Example: "MS". Source: Alpha extend.["paitd-017-reality-flag","paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-level
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-017-reality-flag",
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /places/{placeId}

Logically deletes or retires one place resource without erasing historical roster evidence.

id
endpoint-delete-place
operation
deletePlace
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
placeIdPathstringYes["paitd-102-read-shape"]Place id from place.place_id.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-017-reality-flag",
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /alpha_level_history

Lists alpha level history rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-alpha-level-history
operation
listAlphaLevelHistory
auth
people_orgs:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
asOfDateQueryISO 8601 dateRequired for active-as-of readsDate used to answer whether effective-dated memberships are active. begin_date null excludes the row; end_date null means still active after begin_date.["paitd-004-point-in-time-memberships","paitd-103-query-model"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: personId, alphaLevel, asOfDate, isTimeLocatable.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: person_id, begin_date, end_date, alpha_level. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseAlpha Level History[]YesThe over-time answer for alphaLevel(student, date). It keeps Alpha level history instead of replacing old context with one mutable current value.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-alpha-level-history
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-018-over-time-history","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-tenant-id
history_idResponsestringYesStable id for one Alpha-level history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "alpha_level_hist_ada_2026_ms". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-history-id
person_idResponseperson idYesThe student person whose Alpha level this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-person-id
alpha_levelResponseWL | LL | L1 | L2 | MS | HSYesCanonical Alpha level for this student's effective-dated interval. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed values: WL, LL, L1, L2, MS, HS. Example: "MS". Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-alpha-level
begin_dateResponsedateNoInclusive date when this Alpha-level interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-begin-date
end_dateResponsedateNoExclusive date when this Alpha-level interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-is-time-locatable
traces
[
  "paitd-018-over-time-history",
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /alpha_level_history/{id}

Reads one alpha level history resource and returns an ETag when the resource is mutable.

id
endpoint-get-alpha-level-history
operation
getAlphaLevelHistory
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
idPathstringYes["paitd-102-read-shape"]Resource id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-018-over-time-history","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-tenant-id
history_idResponsestringYesStable id for one Alpha-level history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "alpha_level_hist_ada_2026_ms". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-history-id
person_idResponseperson idYesThe student person whose Alpha level this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-person-id
alpha_levelResponseWL | LL | L1 | L2 | MS | HSYesCanonical Alpha level for this student's effective-dated interval. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed values: WL, LL, L1, L2, MS, HS. Example: "MS". Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-alpha-level
begin_dateResponsedateNoInclusive date when this Alpha-level interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-begin-date
end_dateResponsedateNoExclusive date when this Alpha-level interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-is-time-locatable
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-018-over-time-history",
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /alpha_level_history

Creates one alpha level history resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-alpha-level-history
operation
createAlphaLevelHistory
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
history_idBodystringYesStable id for one Alpha-level history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "alpha_level_hist_ada_2026_ms". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]
person_idBodyperson idYesThe student person whose Alpha level this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]
alpha_levelBodyWL | LL | L1 | L2 | MS | HSYesCanonical Alpha level for this student's effective-dated interval. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed values: WL, LL, L1, L2, MS, HS. Example: "MS". Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]
begin_dateBodydateNoInclusive date when this Alpha-level interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]
end_dateBodydateNoExclusive date when this Alpha-level interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]
is_time_locatableBodybooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-018-over-time-history","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-tenant-id
history_idResponsestringYesStable id for one Alpha-level history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "alpha_level_hist_ada_2026_ms". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-history-id
person_idResponseperson idYesThe student person whose Alpha level this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-person-id
alpha_levelResponseWL | LL | L1 | L2 | MS | HSYesCanonical Alpha level for this student's effective-dated interval. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed values: WL, LL, L1, L2, MS, HS. Example: "MS". Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-alpha-level
begin_dateResponsedateNoInclusive date when this Alpha-level interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-begin-date
end_dateResponsedateNoExclusive date when this Alpha-level interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-is-time-locatable
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-018-over-time-history",
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /alpha_level_history/{id}

Updates one alpha level history resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-alpha-level-history
operation
updateAlphaLevelHistory
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
idPathstringYes["paitd-102-read-shape"]Resource id.
alpha_levelBodyWL | LL | L1 | L2 | MS | HSNoCanonical Alpha level for this student's effective-dated interval. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed values: WL, LL, L1, L2, MS, HS. Example: "MS". Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]
begin_dateBodydateNoInclusive date when this Alpha-level interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]
end_dateBodydateNoExclusive date when this Alpha-level interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]
is_time_locatableBodybooleanNoTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-018-over-time-history","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-tenant-id
history_idResponsestringYesStable id for one Alpha-level history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "alpha_level_hist_ada_2026_ms". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-history-id
person_idResponseperson idYesThe student person whose Alpha level this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-person-id
alpha_levelResponseWL | LL | L1 | L2 | MS | HSYesCanonical Alpha level for this student's effective-dated interval. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed values: WL, LL, L1, L2, MS, HS. Example: "MS". Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-alpha-level
begin_dateResponsedateNoInclusive date when this Alpha-level interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-begin-date
end_dateResponsedateNoExclusive date when this Alpha-level interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-is-time-locatable
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-018-over-time-history",
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /alpha_level_history/{id}

Logically deletes or retires one alpha level history resource without erasing historical roster evidence.

id
endpoint-delete-alpha-level-history
operation
deleteAlphaLevelHistory
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
idPathstringYes["paitd-102-read-shape"]Resource id.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-018-over-time-history",
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /age_grade_history

Lists age grade history rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-age-grade-history
operation
listAgeGradeHistory
auth
people_orgs:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
asOfDateQueryISO 8601 dateRequired for active-as-of readsDate used to answer whether effective-dated memberships are active. begin_date null excludes the row; end_date null means still active after begin_date.["paitd-004-point-in-time-memberships","paitd-103-query-model"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: personId, ageGrade, asOfDate, isTimeLocatable.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: person_id, begin_date, end_date, age_grade. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseAge Grade History[]YesThe over-time answer for ageGrade(student, date). It keeps age-grade history instead of replacing old context with one mutable current value.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-age-grade-history
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-018-over-time-history","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-tenant-id
history_idResponsestringYesStable id for one age-grade history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "age_grade_hist_ada_2026_7". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-history-id
person_idResponseperson idYesThe student person whose age-grade context this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-person-id
age_gradeResponsegrade_level integerYesCanonical age-grade context for this student's effective-dated interval. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-age-grade
begin_dateResponsedateNoInclusive date when this age-grade interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-begin-date
end_dateResponsedateNoExclusive date when this age-grade interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-is-time-locatable
traces
[
  "paitd-018-over-time-history",
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /age_grade_history/{id}

Reads one age grade history resource and returns an ETag when the resource is mutable.

id
endpoint-get-age-grade-history
operation
getAgeGradeHistory
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
idPathstringYes["paitd-102-read-shape"]Resource id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-018-over-time-history","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-tenant-id
history_idResponsestringYesStable id for one age-grade history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "age_grade_hist_ada_2026_7". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-history-id
person_idResponseperson idYesThe student person whose age-grade context this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-person-id
age_gradeResponsegrade_level integerYesCanonical age-grade context for this student's effective-dated interval. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-age-grade
begin_dateResponsedateNoInclusive date when this age-grade interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-begin-date
end_dateResponsedateNoExclusive date when this age-grade interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-is-time-locatable
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-018-over-time-history",
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /age_grade_history

Creates one age grade history resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-age-grade-history
operation
createAgeGradeHistory
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
history_idBodystringYesStable id for one age-grade history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "age_grade_hist_ada_2026_7". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]
person_idBodyperson idYesThe student person whose age-grade context this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]
age_gradeBodygrade_level integerYesCanonical age-grade context for this student's effective-dated interval. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]
begin_dateBodydateNoInclusive date when this age-grade interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]
end_dateBodydateNoExclusive date when this age-grade interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]
is_time_locatableBodybooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-018-over-time-history","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-tenant-id
history_idResponsestringYesStable id for one age-grade history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "age_grade_hist_ada_2026_7". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-history-id
person_idResponseperson idYesThe student person whose age-grade context this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-person-id
age_gradeResponsegrade_level integerYesCanonical age-grade context for this student's effective-dated interval. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-age-grade
begin_dateResponsedateNoInclusive date when this age-grade interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-begin-date
end_dateResponsedateNoExclusive date when this age-grade interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-is-time-locatable
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-018-over-time-history",
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /age_grade_history/{id}

Updates one age grade history resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-age-grade-history
operation
updateAgeGradeHistory
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
idPathstringYes["paitd-102-read-shape"]Resource id.
age_gradeBodygrade_level integerNoCanonical age-grade context for this student's effective-dated interval. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]
begin_dateBodydateNoInclusive date when this age-grade interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]
end_dateBodydateNoExclusive date when this age-grade interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]
is_time_locatableBodybooleanNoTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-018-over-time-history","paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-tenant-id
history_idResponsestringYesStable id for one age-grade history interval. Range: 1 to 255 printable characters, unique within tenant. Example: "age_grade_hist_ada_2026_7". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-history-id
person_idResponseperson idYesThe student person whose age-grade context this interval describes. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-person-id
age_gradeResponsegrade_level integerYesCanonical age-grade context for this student's effective-dated interval. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-age-grade
begin_dateResponsedateNoInclusive date when this age-grade interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-begin-date
end_dateResponsedateNoExclusive date when this age-grade interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha extend.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-is-time-locatable
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-018-over-time-history",
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /age_grade_history/{id}

Logically deletes or retires one age grade history resource without erasing historical roster evidence.

id
endpoint-delete-age-grade-history
operation
deleteAgeGradeHistory
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
idPathstringYes["paitd-102-read-shape"]Resource id.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-018-over-time-history",
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /place_memberships

Lists place membership rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-place-membership
operation
listPlaceMembership
auth
people_orgs:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
asOfDateQueryISO 8601 dateRequired for active-as-of readsDate used to answer whether effective-dated memberships are active. begin_date null excludes the row; end_date null means still active after begin_date.["paitd-004-point-in-time-memberships","paitd-103-query-model"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: personId, placeId, roleKind, rolePriority, asOfDate, isTimeLocatable, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: person_id, place_id, role_kind, begin_date, end_date. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponsePlace Membership[]YesA dated relationship saying what one person is in one place, such as parent, guardian, guide, student, administrator, or staff.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-place-membership
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-tenant-id
membership_idResponsestringYesStable id for one person's dated role in one place. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place_membership). Example: "pm_person_ada_place_school_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-membership-id
person_idResponseperson idYesPerson who holds the role. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-person-id
place_idResponseplace idYesPlace where the role applies. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-place-id
role_kindResponsestring enumYesCanonical role enum with a maintained alias fold; never parsed from names or titles. Allowed values: student, parent, guardian, relative, guide, staff, administrator. Range: One of the canonical role_kind values. Example: "guide". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-kind
role_priorityResponseprimary | secondaryNoPrimary or secondary role marker. Allowed values: primary, secondary. Range: primary or secondary. Example: "primary". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-priority
begin_dateResponsedateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-begin-date
end_dateResponsedateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-is-time-locatable
profile_idResponsestringNoOptional non-secret profile reference. Range: 1 to 255 printable characters when supplied. Example: "profile_canvas_001". Source: Alpha rename+restrict.["paitd-008-app-credentials","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-profile-id
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /place_memberships/{membershipId}

Reads one place membership resource and returns an ETag when the resource is mutable.

id
endpoint-get-place-membership
operation
getPlaceMembership
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
membershipIdPathstringYes["paitd-102-read-shape"]Membership id from membership_id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-tenant-id
membership_idResponsestringYesStable id for one person's dated role in one place. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place_membership). Example: "pm_person_ada_place_school_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-membership-id
person_idResponseperson idYesPerson who holds the role. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-person-id
place_idResponseplace idYesPlace where the role applies. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-place-id
role_kindResponsestring enumYesCanonical role enum with a maintained alias fold; never parsed from names or titles. Allowed values: student, parent, guardian, relative, guide, staff, administrator. Range: One of the canonical role_kind values. Example: "guide". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-kind
role_priorityResponseprimary | secondaryNoPrimary or secondary role marker. Allowed values: primary, secondary. Range: primary or secondary. Example: "primary". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-priority
begin_dateResponsedateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-begin-date
end_dateResponsedateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-is-time-locatable
profile_idResponsestringNoOptional non-secret profile reference. Range: 1 to 255 printable characters when supplied. Example: "profile_canvas_001". Source: Alpha rename+restrict.["paitd-008-app-credentials","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-profile-id
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /place_memberships

Creates one place membership resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-place-membership
operation
createPlaceMembership
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
membership_idBodystringYesStable id for one person's dated role in one place. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place_membership). Example: "pm_person_ada_place_school_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]
person_idBodyperson idYesPerson who holds the role. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]
place_idBodyplace idYesPlace where the role applies. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]
role_kindBodystring enumYesCanonical role enum with a maintained alias fold; never parsed from names or titles. Allowed values: student, parent, guardian, relative, guide, staff, administrator. Range: One of the canonical role_kind values. Example: "guide". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]
role_priorityBodyprimary | secondaryNoPrimary or secondary role marker. Allowed values: primary, secondary. Range: primary or secondary. Example: "primary". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
begin_dateBodydateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
end_dateBodydateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
is_time_locatableBodybooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]
profile_idBodystringNoOptional non-secret profile reference. Range: 1 to 255 printable characters when supplied. Example: "profile_canvas_001". Source: Alpha rename+restrict.["paitd-008-app-credentials","paitd-009-sensitive-profile-privacy"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-tenant-id
membership_idResponsestringYesStable id for one person's dated role in one place. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place_membership). Example: "pm_person_ada_place_school_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-membership-id
person_idResponseperson idYesPerson who holds the role. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-person-id
place_idResponseplace idYesPlace where the role applies. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-place-id
role_kindResponsestring enumYesCanonical role enum with a maintained alias fold; never parsed from names or titles. Allowed values: student, parent, guardian, relative, guide, staff, administrator. Range: One of the canonical role_kind values. Example: "guide". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-kind
role_priorityResponseprimary | secondaryNoPrimary or secondary role marker. Allowed values: primary, secondary. Range: primary or secondary. Example: "primary". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-priority
begin_dateResponsedateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-begin-date
end_dateResponsedateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-is-time-locatable
profile_idResponsestringNoOptional non-secret profile reference. Range: 1 to 255 printable characters when supplied. Example: "profile_canvas_001". Source: Alpha rename+restrict.["paitd-008-app-credentials","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-profile-id
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /place_memberships/{membershipId}

Updates one place membership resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-place-membership
operation
updatePlaceMembership
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
membershipIdPathstringYes["paitd-102-read-shape"]Membership id from membership_id.
role_kindBodystring enumNoCanonical role enum with a maintained alias fold; never parsed from names or titles. Allowed values: student, parent, guardian, relative, guide, staff, administrator. Range: One of the canonical role_kind values. Example: "guide". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]
role_priorityBodyprimary | secondaryNoPrimary or secondary role marker. Allowed values: primary, secondary. Range: primary or secondary. Example: "primary". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
begin_dateBodydateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
end_dateBodydateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
is_time_locatableBodybooleanNoTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]
profile_idBodystringNoOptional non-secret profile reference. Range: 1 to 255 printable characters when supplied. Example: "profile_canvas_001". Source: Alpha rename+restrict.["paitd-008-app-credentials","paitd-009-sensitive-profile-privacy"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-tenant-id
membership_idResponsestringYesStable id for one person's dated role in one place. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place_membership). Example: "pm_person_ada_place_school_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-membership-id
person_idResponseperson idYesPerson who holds the role. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-person-id
place_idResponseplace idYesPlace where the role applies. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-place-id
role_kindResponsestring enumYesCanonical role enum with a maintained alias fold; never parsed from names or titles. Allowed values: student, parent, guardian, relative, guide, staff, administrator. Range: One of the canonical role_kind values. Example: "guide". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-kind
role_priorityResponseprimary | secondaryNoPrimary or secondary role marker. Allowed values: primary, secondary. Range: primary or secondary. Example: "primary". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-priority
begin_dateResponsedateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-begin-date
end_dateResponsedateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-is-time-locatable
profile_idResponsestringNoOptional non-secret profile reference. Range: 1 to 255 printable characters when supplied. Example: "profile_canvas_001". Source: Alpha rename+restrict.["paitd-008-app-credentials","paitd-009-sensitive-profile-privacy"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-profile-id
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /place_memberships/{membershipId}

Logically deletes or retires one place membership resource without erasing historical roster evidence.

id
endpoint-delete-place-membership
operation
deletePlaceMembership
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
membershipIdPathstringYes["paitd-102-read-shape"]Membership id from membership_id.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /class_memberships

Lists class membership rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-class-membership
operation
listClassMembership
auth
people_orgs:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
asOfDateQueryISO 8601 dateRequired for active-as-of readsDate used to answer whether effective-dated memberships are active. begin_date null excludes the row; end_date null means still active after begin_date.["paitd-004-point-in-time-memberships","paitd-103-query-model"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: personId, schoolId, learningGroupId, roleKind, isPrimaryGuide, guidePersonId via studentsForGuide, asOfDate, isTimeLocatable, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: school_id, learning_group_id, person_id, role_kind, begin_date. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseClass Membership[]YesA dated relationship saying that one person belongs to one learning group at one school. It is the source for student<->guide association and studentsForGuide(guide, date); the detailed class/course object is not re-owned by this module.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-class-membership
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-tenant-id
membership_idResponsestringYesStable id for one person's dated membership in one learning group. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.class_membership). Example: "cm_alg1_ada_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-membership-id
person_idResponseperson idYesPerson in the learning group. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id
school_idResponseplace idYesSchool place for the membership. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename+restrict.["paitd-003-place-nwea-boundary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-school-id
learning_group_idResponsestringYesOneRoster class id retained as a real relationship column. Range: 1 to 255 printable characters. Example: "class_algebra_1_a". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-learning-group-id
role_kindResponsestring enumYesCanonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: "student". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-role-kind
is_primary_guideResponsebooleanNoPrimary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: "false". Source: Alpha rename+restrict.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-primary-guide
begin_dateResponsedateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date
end_dateResponsedateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-time-locatable
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /class_memberships/{membershipId}

Reads one class membership resource and returns an ETag when the resource is mutable.

id
endpoint-get-class-membership
operation
getClassMembership
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
membershipIdPathstringYes["paitd-102-read-shape"]Membership id from membership_id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-tenant-id
membership_idResponsestringYesStable id for one person's dated membership in one learning group. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.class_membership). Example: "cm_alg1_ada_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-membership-id
person_idResponseperson idYesPerson in the learning group. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id
school_idResponseplace idYesSchool place for the membership. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename+restrict.["paitd-003-place-nwea-boundary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-school-id
learning_group_idResponsestringYesOneRoster class id retained as a real relationship column. Range: 1 to 255 printable characters. Example: "class_algebra_1_a". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-learning-group-id
role_kindResponsestring enumYesCanonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: "student". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-role-kind
is_primary_guideResponsebooleanNoPrimary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: "false". Source: Alpha rename+restrict.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-primary-guide
begin_dateResponsedateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date
end_dateResponsedateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-time-locatable
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /class_memberships

Creates one class membership resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-class-membership
operation
createClassMembership
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
membership_idBodystringYesStable id for one person's dated membership in one learning group. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.class_membership). Example: "cm_alg1_ada_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]
person_idBodyperson idYesPerson in the learning group. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]
school_idBodyplace idYesSchool place for the membership. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename+restrict.["paitd-003-place-nwea-boundary","paitd-004-point-in-time-memberships"]
learning_group_idBodystringYesOneRoster class id retained as a real relationship column. Range: 1 to 255 printable characters. Example: "class_algebra_1_a". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]
role_kindBodystring enumYesCanonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: "student". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]
is_primary_guideBodybooleanNoPrimary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: "false". Source: Alpha rename+restrict.["paitd-004-point-in-time-memberships"]
begin_dateBodydateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
end_dateBodydateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
is_time_locatableBodybooleanYesTrue only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-tenant-id
membership_idResponsestringYesStable id for one person's dated membership in one learning group. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.class_membership). Example: "cm_alg1_ada_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-membership-id
person_idResponseperson idYesPerson in the learning group. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id
school_idResponseplace idYesSchool place for the membership. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename+restrict.["paitd-003-place-nwea-boundary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-school-id
learning_group_idResponsestringYesOneRoster class id retained as a real relationship column. Range: 1 to 255 printable characters. Example: "class_algebra_1_a". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-learning-group-id
role_kindResponsestring enumYesCanonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: "student". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-role-kind
is_primary_guideResponsebooleanNoPrimary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: "false". Source: Alpha rename+restrict.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-primary-guide
begin_dateResponsedateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date
end_dateResponsedateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-time-locatable
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /class_memberships/{membershipId}

Updates one class membership resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-class-membership
operation
updateClassMembership
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
membershipIdPathstringYes["paitd-102-read-shape"]Membership id from membership_id.
role_kindBodystring enumNoCanonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: "student". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]
is_primary_guideBodybooleanNoPrimary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: "false". Source: Alpha rename+restrict.["paitd-004-point-in-time-memberships"]
begin_dateBodydateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
end_dateBodydateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]
is_time_locatableBodybooleanNoTrue only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-tenant-id
membership_idResponsestringYesStable id for one person's dated membership in one learning group. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.class_membership). Example: "cm_alg1_ada_student_2026". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-membership-id
person_idResponseperson idYesPerson in the learning group. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id
school_idResponseplace idYesSchool place for the membership. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha rename+restrict.["paitd-003-place-nwea-boundary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-school-id
learning_group_idResponsestringYesOneRoster class id retained as a real relationship column. Range: 1 to 255 printable characters. Example: "class_algebra_1_a". Source: Alpha rename.["paitd-004-point-in-time-memberships","paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-learning-group-id
role_kindResponsestring enumYesCanonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: "student". Source: Alpha rename+restrict.["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-role-kind
is_primary_guideResponsebooleanNoPrimary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: "false". Source: Alpha rename+restrict.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-primary-guide
begin_dateResponsedateNoInclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date
end_dateResponsedateNoExclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-time-locatable
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /class_memberships/{membershipId}

Logically deletes or retires one class membership resource without erasing historical roster evidence.

id
endpoint-delete-class-membership
operation
deleteClassMembership
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
membershipIdPathstringYes["paitd-102-read-shape"]Membership id from membership_id.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /school_periods

Lists school period rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-school-period
operation
listSchoolPeriod
auth
people_orgs:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
asOfDateQueryISO 8601 dateRequired for active-as-of readsDate used to answer whether effective-dated memberships are active. begin_date null excludes the row; end_date null means still active after begin_date.["paitd-004-point-in-time-memberships","paitd-103-query-model"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: periodKind, schoolYear, asOfDate, parentPeriodId, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: school_year, start_date, end_date, period_kind, title. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseSchool Period[]YesA school year, term, semester, or grading period used to answer roster questions as of a date.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-school-period
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-tenant-id
period_idResponsestringYesStable school period id. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.school_period). Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-005-school-periods","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-005-school-periods","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-updated-at
titleResponsestringYesHuman title for the period. Range: 1 to 255 visible characters. Example: "2026-2027 School Year". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-title
period_kindResponsestring enumYesCanonical period type; consumers never parse the title. Allowed values: school_year, semester, term, grading_period. Range: school_year, semester, term, or grading_period. Example: "school_year". Source: Alpha rename+restrict.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-kind
start_dateResponsedateYesInclusive period start date. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-start-date
end_dateResponsedateYesExclusive period end date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-end-date
parent_period_idResponseperiod idNoParent period relationship. Range: 1 to 255 printable characters when supplied. Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-parent-period-id
school_yearResponseintegerYesTyped school-year value, not a string parsed from title. Range: Four-digit ending year, such as 2027. Example: 2027. Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-school-year
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /school_periods/{periodId}

Reads one school period resource and returns an ETag when the resource is mutable.

id
endpoint-get-school-period
operation
getSchoolPeriod
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
periodIdPathstringYes["paitd-102-read-shape"]School period id from period_id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-tenant-id
period_idResponsestringYesStable school period id. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.school_period). Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-005-school-periods","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-005-school-periods","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-updated-at
titleResponsestringYesHuman title for the period. Range: 1 to 255 visible characters. Example: "2026-2027 School Year". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-title
period_kindResponsestring enumYesCanonical period type; consumers never parse the title. Allowed values: school_year, semester, term, grading_period. Range: school_year, semester, term, or grading_period. Example: "school_year". Source: Alpha rename+restrict.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-kind
start_dateResponsedateYesInclusive period start date. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-start-date
end_dateResponsedateYesExclusive period end date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-end-date
parent_period_idResponseperiod idNoParent period relationship. Range: 1 to 255 printable characters when supplied. Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-parent-period-id
school_yearResponseintegerYesTyped school-year value, not a string parsed from title. Range: Four-digit ending year, such as 2027. Example: 2027. Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-school-year
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /school_periods

Creates one school period resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-school-period
operation
createSchoolPeriod
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
period_idBodystringYesStable school period id. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.school_period). Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods","paitd-010-alias-map-contract"]
source_statusBodystring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-005-school-periods","paitd-111-privacy-retention"]
titleBodystringYesHuman title for the period. Range: 1 to 255 visible characters. Example: "2026-2027 School Year". Source: Alpha rename.["paitd-005-school-periods"]
period_kindBodystring enumYesCanonical period type; consumers never parse the title. Allowed values: school_year, semester, term, grading_period. Range: school_year, semester, term, or grading_period. Example: "school_year". Source: Alpha rename+restrict.["paitd-005-school-periods"]
start_dateBodydateYesInclusive period start date. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-005-school-periods"]
end_dateBodydateYesExclusive period end date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-005-school-periods"]
parent_period_idBodyperiod idNoParent period relationship. Range: 1 to 255 printable characters when supplied. Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods"]
school_yearBodyintegerYesTyped school-year value, not a string parsed from title. Range: Four-digit ending year, such as 2027. Example: 2027. Source: Alpha rename.["paitd-005-school-periods"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-tenant-id
period_idResponsestringYesStable school period id. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.school_period). Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-005-school-periods","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-005-school-periods","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-updated-at
titleResponsestringYesHuman title for the period. Range: 1 to 255 visible characters. Example: "2026-2027 School Year". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-title
period_kindResponsestring enumYesCanonical period type; consumers never parse the title. Allowed values: school_year, semester, term, grading_period. Range: school_year, semester, term, or grading_period. Example: "school_year". Source: Alpha rename+restrict.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-kind
start_dateResponsedateYesInclusive period start date. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-start-date
end_dateResponsedateYesExclusive period end date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-end-date
parent_period_idResponseperiod idNoParent period relationship. Range: 1 to 255 printable characters when supplied. Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-parent-period-id
school_yearResponseintegerYesTyped school-year value, not a string parsed from title. Range: Four-digit ending year, such as 2027. Example: 2027. Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-school-year
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /school_periods/{periodId}

Updates one school period resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-school-period
operation
updateSchoolPeriod
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
periodIdPathstringYes["paitd-102-read-shape"]School period id from period_id.
source_statusBodystring enumNoOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-005-school-periods","paitd-111-privacy-retention"]
source_updated_atBodyISO 8601 datetimeNoSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-005-school-periods","paitd-103-query-model"]
titleBodystringNoHuman title for the period. Range: 1 to 255 visible characters. Example: "2026-2027 School Year". Source: Alpha rename.["paitd-005-school-periods"]
period_kindBodystring enumNoCanonical period type; consumers never parse the title. Allowed values: school_year, semester, term, grading_period. Range: school_year, semester, term, or grading_period. Example: "school_year". Source: Alpha rename+restrict.["paitd-005-school-periods"]
start_dateBodydateNoInclusive period start date. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-005-school-periods"]
end_dateBodydateNoExclusive period end date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-005-school-periods"]
parent_period_idBodyperiod idNoParent period relationship. Range: 1 to 255 printable characters when supplied. Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods"]
school_yearBodyintegerNoTyped school-year value, not a string parsed from title. Range: Four-digit ending year, such as 2027. Example: 2027. Source: Alpha rename.["paitd-005-school-periods"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-tenant-id
period_idResponsestringYesStable school period id. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.school_period). Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods","paitd-010-alias-map-contract"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-id
source_statusResponsestring enumConditionalOneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: "active". Source: Alpha rename.["paitd-005-school-periods","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-status
source_updated_atResponseISO 8601 datetimeConditionalSource-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha rename.["paitd-005-school-periods","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-updated-at
titleResponsestringYesHuman title for the period. Range: 1 to 255 visible characters. Example: "2026-2027 School Year". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-title
period_kindResponsestring enumYesCanonical period type; consumers never parse the title. Allowed values: school_year, semester, term, grading_period. Range: school_year, semester, term, or grading_period. Example: "school_year". Source: Alpha rename+restrict.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-kind
start_dateResponsedateYesInclusive period start date. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-start-date
end_dateResponsedateYesExclusive period end date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-end-date
parent_period_idResponseperiod idNoParent period relationship. Range: 1 to 255 printable characters when supplied. Example: "period_2026_2027_school_year". Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-parent-period-id
school_yearResponseintegerYesTyped school-year value, not a string parsed from title. Range: Four-digit ending year, such as 2027. Example: 2027. Source: Alpha rename.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-school-year
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /school_periods/{periodId}

Logically deletes or retires one school period resource without erasing historical roster evidence.

id
endpoint-delete-school-period
operation
deleteSchoolPeriod
auth
people_orgs:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
periodIdPathstringYes["paitd-102-read-shape"]School period id from period_id.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /person_sensitive_profiles

Lists person sensitive profile rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-person-sensitive-profile
operation
listPersonSensitiveProfile
auth
people_orgs:sensitive_profile:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:sensitive_profile:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: personId, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: person_id. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponsePerson Sensitive Profile[]YesSensitive demographic facts kept out of ordinary roster lists and returned only through authorized self, guardian, or administrative views.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-person-sensitive-profile
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-tenant-id
person_idResponseperson idYesPerson whose sensitive profile is described. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-person-id
birth_dateResponsedateNoDate of birth when lawfully supplied. Range: ISO 8601 date YYYY-MM-DD. Example: "2012-04-23". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-birth-date
sexResponsestring enumNoSource demographic sex value. Allowed values: male, female, unspecified, other. Range: male, female, unspecified, or other. Example: "unspecified". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-sex
race_ethnicity_flagsResponseobject of boolean flagsNoIndependent source race and ethnicity flags; never inferred from names or places. Allowed values: american_indian_or_alaska_native, asian, black_or_african_american, native_hawaiian_or_other_pacific_islander, white, two_or_more_races, hispanic_or_latino_ethnicity. Range: Allowed keys listed below; each present value is true or false. Example: {"asian":true,"hispanic_or_latino_ethnicity":false}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-race-ethnicity-flags
birth_place_fieldsResponseobjectNoOptional source-supplied birth location details. Allowed values: country_of_birth_code, state_of_birth_abbreviation, city_of_birth. Range: Allowed keys listed below; text values preserve source format. Example: {"country_of_birth_code":"US","state_of_birth_abbreviation":"CA"}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-birth-place-fields
residence_statusResponsestringNoSource legal-residence status. Range: 0 to 255 visible characters supplied by the source. Example: "resident". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-residence-status
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /person_sensitive_profiles/{personId}

Reads one person sensitive profile resource and returns an ETag when the resource is mutable.

id
endpoint-get-person-sensitive-profile
operation
getPersonSensitiveProfile
auth
people_orgs:sensitive_profile:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:sensitive_profile:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
personIdPathstringYes["paitd-102-read-shape"]Person id whose sensitive profile is being read.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-tenant-id
person_idResponseperson idYesPerson whose sensitive profile is described. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-person-id
birth_dateResponsedateNoDate of birth when lawfully supplied. Range: ISO 8601 date YYYY-MM-DD. Example: "2012-04-23". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-birth-date
sexResponsestring enumNoSource demographic sex value. Allowed values: male, female, unspecified, other. Range: male, female, unspecified, or other. Example: "unspecified". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-sex
race_ethnicity_flagsResponseobject of boolean flagsNoIndependent source race and ethnicity flags; never inferred from names or places. Allowed values: american_indian_or_alaska_native, asian, black_or_african_american, native_hawaiian_or_other_pacific_islander, white, two_or_more_races, hispanic_or_latino_ethnicity. Range: Allowed keys listed below; each present value is true or false. Example: {"asian":true,"hispanic_or_latino_ethnicity":false}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-race-ethnicity-flags
birth_place_fieldsResponseobjectNoOptional source-supplied birth location details. Allowed values: country_of_birth_code, state_of_birth_abbreviation, city_of_birth. Range: Allowed keys listed below; text values preserve source format. Example: {"country_of_birth_code":"US","state_of_birth_abbreviation":"CA"}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-birth-place-fields
residence_statusResponsestringNoSource legal-residence status. Range: 0 to 255 visible characters supplied by the source. Example: "resident". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-residence-status
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /person_sensitive_profiles

Creates one person sensitive profile resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-person-sensitive-profile
operation
createPersonSensitiveProfile
auth
people_orgs:sensitive_profile:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:sensitive_profile:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
person_idBodyperson idYesPerson whose sensitive profile is described. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]
birth_dateBodydateNoDate of birth when lawfully supplied. Range: ISO 8601 date YYYY-MM-DD. Example: "2012-04-23". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]
sexBodystring enumNoSource demographic sex value. Allowed values: male, female, unspecified, other. Range: male, female, unspecified, or other. Example: "unspecified". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]
race_ethnicity_flagsBodyobject of boolean flagsNoIndependent source race and ethnicity flags; never inferred from names or places. Allowed values: american_indian_or_alaska_native, asian, black_or_african_american, native_hawaiian_or_other_pacific_islander, white, two_or_more_races, hispanic_or_latino_ethnicity. Range: Allowed keys listed below; each present value is true or false. Example: {"asian":true,"hispanic_or_latino_ethnicity":false}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]
birth_place_fieldsBodyobjectNoOptional source-supplied birth location details. Allowed values: country_of_birth_code, state_of_birth_abbreviation, city_of_birth. Range: Allowed keys listed below; text values preserve source format. Example: {"country_of_birth_code":"US","state_of_birth_abbreviation":"CA"}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]
residence_statusBodystringNoSource legal-residence status. Range: 0 to 255 visible characters supplied by the source. Example: "resident". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-tenant-id
person_idResponseperson idYesPerson whose sensitive profile is described. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-person-id
birth_dateResponsedateNoDate of birth when lawfully supplied. Range: ISO 8601 date YYYY-MM-DD. Example: "2012-04-23". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-birth-date
sexResponsestring enumNoSource demographic sex value. Allowed values: male, female, unspecified, other. Range: male, female, unspecified, or other. Example: "unspecified". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-sex
race_ethnicity_flagsResponseobject of boolean flagsNoIndependent source race and ethnicity flags; never inferred from names or places. Allowed values: american_indian_or_alaska_native, asian, black_or_african_american, native_hawaiian_or_other_pacific_islander, white, two_or_more_races, hispanic_or_latino_ethnicity. Range: Allowed keys listed below; each present value is true or false. Example: {"asian":true,"hispanic_or_latino_ethnicity":false}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-race-ethnicity-flags
birth_place_fieldsResponseobjectNoOptional source-supplied birth location details. Allowed values: country_of_birth_code, state_of_birth_abbreviation, city_of_birth. Range: Allowed keys listed below; text values preserve source format. Example: {"country_of_birth_code":"US","state_of_birth_abbreviation":"CA"}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-birth-place-fields
residence_statusResponsestringNoSource legal-residence status. Range: 0 to 255 visible characters supplied by the source. Example: "resident". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-residence-status
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /person_sensitive_profiles/{personId}

Updates one person sensitive profile resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-person-sensitive-profile
operation
updatePersonSensitiveProfile
auth
people_orgs:sensitive_profile:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:sensitive_profile:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
personIdPathstringYes["paitd-102-read-shape"]Person id whose sensitive profile is being read.
birth_dateBodydateNoDate of birth when lawfully supplied. Range: ISO 8601 date YYYY-MM-DD. Example: "2012-04-23". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]
sexBodystring enumNoSource demographic sex value. Allowed values: male, female, unspecified, other. Range: male, female, unspecified, or other. Example: "unspecified". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]
race_ethnicity_flagsBodyobject of boolean flagsNoIndependent source race and ethnicity flags; never inferred from names or places. Allowed values: american_indian_or_alaska_native, asian, black_or_african_american, native_hawaiian_or_other_pacific_islander, white, two_or_more_races, hispanic_or_latino_ethnicity. Range: Allowed keys listed below; each present value is true or false. Example: {"asian":true,"hispanic_or_latino_ethnicity":false}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]
birth_place_fieldsBodyobjectNoOptional source-supplied birth location details. Allowed values: country_of_birth_code, state_of_birth_abbreviation, city_of_birth. Range: Allowed keys listed below; text values preserve source format. Example: {"country_of_birth_code":"US","state_of_birth_abbreviation":"CA"}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]
residence_statusBodystringNoSource legal-residence status. Range: 0 to 255 visible characters supplied by the source. Example: "resident". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-tenant-id
person_idResponseperson idYesPerson whose sensitive profile is described. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-person-id
birth_dateResponsedateNoDate of birth when lawfully supplied. Range: ISO 8601 date YYYY-MM-DD. Example: "2012-04-23". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-birth-date
sexResponsestring enumNoSource demographic sex value. Allowed values: male, female, unspecified, other. Range: male, female, unspecified, or other. Example: "unspecified". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-sex
race_ethnicity_flagsResponseobject of boolean flagsNoIndependent source race and ethnicity flags; never inferred from names or places. Allowed values: american_indian_or_alaska_native, asian, black_or_african_american, native_hawaiian_or_other_pacific_islander, white, two_or_more_races, hispanic_or_latino_ethnicity. Range: Allowed keys listed below; each present value is true or false. Example: {"asian":true,"hispanic_or_latino_ethnicity":false}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-race-ethnicity-flags
birth_place_fieldsResponseobjectNoOptional source-supplied birth location details. Allowed values: country_of_birth_code, state_of_birth_abbreviation, city_of_birth. Range: Allowed keys listed below; text values preserve source format. Example: {"country_of_birth_code":"US","state_of_birth_abbreviation":"CA"}. Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-birth-place-fields
residence_statusResponsestringNoSource legal-residence status. Range: 0 to 255 visible characters supplied by the source. Example: "resident". Source: Alpha restrict.["paitd-009-sensitive-profile-privacy","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sensitive-profile-residence-status
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /person_sensitive_profiles/{personId}

Logically deletes or retires one person sensitive profile resource without erasing historical roster evidence.

id
endpoint-delete-person-sensitive-profile
operation
deletePersonSensitiveProfile
auth
people_orgs:sensitive_profile:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:sensitive_profile:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
personIdPathstringYes["paitd-102-read-shape"]Person id whose sensitive profile is being read.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /guardians

Lists guardian rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-guardian
operation
listGuardian
auth
people_orgs:read + relationship/admin scope when family or staff scoped
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read + relationship/admin scope when family or staff scoped scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: guardianId, contactUniqueId, studentPersonId via guardian_relationship, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: full_name, guardian_id, source_updated_at. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]
includeDeletedQuerybooleanNo; audit/admin scope onlyOrdinary Alpha reads behave as includeDeleted=false and exclude draft records. Audit callers may request retained Ed-Fi soft-delete history only through a privileged path.["paitd-012-edfi-second-upstream","paitd-111-privacy-retention"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseGuardian[]YesA parent, guardian, emergency contact, or family contact for a student.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-guardian-view
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-tenant-id
guardian_idResponsestringYesTenant-scoped Ed-Fi local id for the canonical Contact record. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: "guardian_contact_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-guardian-id
contact_unique_idResponsestringConditionalEd-Fi contact unique id. Range: Ed-Fi ContactUniqueId string. Example: "contact-ada-family-001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-contact-unique-id
full_nameResponsestringConditionalFull legal name supplied by Ed-Fi Contact. Range: 1 to 240 visible characters when supplied. Example: "Grace Hopper". Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-full-name
emailResponseemail stringNoContact email, redacted by relationship-scoped authorization when required. Range: 0 to 320 characters, parseable as email when supplied. Example: "grace.hopper@example.edu". Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-email
phoneResponsestringNoContact phone, redacted by relationship-scoped authorization when required. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-phone
language_codesResponsearray of stringsNoCommunication languages from the Ed-Fi Contact payload. Range: Source language codes or descriptors normalized by Ed-Fi. Example: ["en","es"]. Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-language-codes
source_updated_atResponseISO 8601 datetimeYesCanonical Ed-Fi record updated timestamp. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-source-updated-at
is_deletedResponsebooleanYesAlways false in ordinary Alpha views; deleted contacts are visible only to authorized audit paths. Allowed values: true, false. Range: false in ordinary Alpha reads; true only on authorized audit paths. Example: false. Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-is-deleted
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /guardians/{guardianId}

Reads one guardian view row. Alpha exposes Ed-Fi canonical records read-only and routes mutations to the Ed-Fi 1EdTech surface.

id
endpoint-get-guardian
operation
getGuardian
auth
people_orgs:read + relationship/admin scope when family or staff scoped
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read + relationship/admin scope when family or staff scoped scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
guardianIdPathstringYes["paitd-102-read-shape"]Guardian id from guardian.guardian_id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-tenant-id
guardian_idResponsestringYesTenant-scoped Ed-Fi local id for the canonical Contact record. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: "guardian_contact_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-guardian-id
contact_unique_idResponsestringConditionalEd-Fi contact unique id. Range: Ed-Fi ContactUniqueId string. Example: "contact-ada-family-001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-contact-unique-id
full_nameResponsestringConditionalFull legal name supplied by Ed-Fi Contact. Range: 1 to 240 visible characters when supplied. Example: "Grace Hopper". Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-full-name
emailResponseemail stringNoContact email, redacted by relationship-scoped authorization when required. Range: 0 to 320 characters, parseable as email when supplied. Example: "grace.hopper@example.edu". Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-email
phoneResponsestringNoContact phone, redacted by relationship-scoped authorization when required. Range: 0 to 80 visible characters. Example: "+15550101010". Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-phone
language_codesResponsearray of stringsNoCommunication languages from the Ed-Fi Contact payload. Range: Source language codes or descriptors normalized by Ed-Fi. Example: ["en","es"]. Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-language-codes
source_updated_atResponseISO 8601 datetimeYesCanonical Ed-Fi record updated timestamp. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-source-updated-at
is_deletedResponsebooleanYesAlways false in ordinary Alpha views; deleted contacts are visible only to authorized audit paths. Allowed values: true, false. Range: false in ordinary Alpha reads; true only on authorized audit paths. Example: false. Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-is-deleted
ETagHeaderHTTP entity tagNo on read-only Alpha viewsEd-Fi-backed Alpha views do not accept Alpha PATCH or DELETE. Use source_updated_at for polling.["paitd-012-edfi-second-upstream"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

GET /guardian_relationships

Lists guardian relationship rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-guardian-relationship
operation
listGuardianRelationship
auth
people_orgs:read + relationship/admin scope when family or staff scoped
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read + relationship/admin scope when family or staff scoped scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: studentPersonId, guardianId, relationshipKind, isLegalGuardian, isPrimaryContact, isEmergencyContact, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: student_person_id, contact_priority, relationship_kind, guardian_id. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]
includeDeletedQuerybooleanNo; audit/admin scope onlyOrdinary Alpha reads behave as includeDeleted=false and exclude draft records. Audit callers may request retained Ed-Fi soft-delete history only through a privileged path.["paitd-012-edfi-second-upstream","paitd-111-privacy-retention"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseGuardian Relationship[]YesThe relationship between one student and one guardian/contact.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-guardian-relationship-view
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-tenant-id
guardian_relationship_idResponsestringYesTenant-scoped Ed-Fi local id for the StudentContactAssociation record. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: "guardian_rel_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-guardian-relationship-id
student_person_idResponseperson idYesStudent person id resolved through the platform3 sourcedId boundary. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-student-person-id
guardian_idResponseguardian idYesContact id from the StudentContactAssociation payload, resolved to alpha.guardian_view when present. Range: 1 to 255 printable characters. Example: "guardian_contact_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-guardian-id
relationship_kindResponsestringConditionalGoverned Ed-Fi relation descriptor resolved to a stable plain value. Range: Resolved Ed-Fi Relation descriptor value; open governed code list. Example: "guardian". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-relationship-kind
is_primary_contactResponsebooleanNoWhether Ed-Fi marks this contact as primary. Allowed values: true, false. Range: true, false, or null. Example: true. Source: Alpha Ed-Fi view.["paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-is-primary-contact
is_legal_guardianResponsebooleanNoWhether Ed-Fi marks this contact as a legal guardian. Allowed values: true, false. Range: true, false, or null. Example: true. Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-is-legal-guardian
lives_with_studentResponsebooleanNoWhether the student lives with the contact. Allowed values: true, false. Range: true, false, or null. Example: false. Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-lives-with-student
is_emergency_contactResponsebooleanNoWhether the contact is an emergency contact. Allowed values: true, false. Range: true, false, or null. Example: true. Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-is-emergency-contact
contact_priorityResponseintegerNoPreferred contact order. Range: Positive integer when supplied. Example: 1. Source: Alpha Ed-Fi view.["paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-contact-priority
contact_restrictionsResponsearray of strings, redacted when unauthorizedNoContact restrictions; restricted/redacted by privacy rules. Range: Restriction text or descriptor values after privacy filtering. Example: ["do_not_release_address"]. Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-contact-restrictions
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /guardian_relationships/{guardianRelationshipId}

Reads one guardian relationship view row. Alpha exposes Ed-Fi canonical records read-only and routes mutations to the Ed-Fi 1EdTech surface.

id
endpoint-get-guardian-relationship
operation
getGuardianRelationship
auth
people_orgs:read + relationship/admin scope when family or staff scoped
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read + relationship/admin scope when family or staff scoped scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
guardianRelationshipIdPathstringYes["paitd-102-read-shape"]Guardian relationship id from guardian_relationship.guardian_relationship_id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-tenant-id
guardian_relationship_idResponsestringYesTenant-scoped Ed-Fi local id for the StudentContactAssociation record. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: "guardian_rel_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-guardian-relationship-id
student_person_idResponseperson idYesStudent person id resolved through the platform3 sourcedId boundary. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-student-person-id
guardian_idResponseguardian idYesContact id from the StudentContactAssociation payload, resolved to alpha.guardian_view when present. Range: 1 to 255 printable characters. Example: "guardian_contact_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-guardian-id
relationship_kindResponsestringConditionalGoverned Ed-Fi relation descriptor resolved to a stable plain value. Range: Resolved Ed-Fi Relation descriptor value; open governed code list. Example: "guardian". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-relationship-kind
is_primary_contactResponsebooleanNoWhether Ed-Fi marks this contact as primary. Allowed values: true, false. Range: true, false, or null. Example: true. Source: Alpha Ed-Fi view.["paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-is-primary-contact
is_legal_guardianResponsebooleanNoWhether Ed-Fi marks this contact as a legal guardian. Allowed values: true, false. Range: true, false, or null. Example: true. Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-is-legal-guardian
lives_with_studentResponsebooleanNoWhether the student lives with the contact. Allowed values: true, false. Range: true, false, or null. Example: false. Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-lives-with-student
is_emergency_contactResponsebooleanNoWhether the contact is an emergency contact. Allowed values: true, false. Range: true, false, or null. Example: true. Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-is-emergency-contact
contact_priorityResponseintegerNoPreferred contact order. Range: Positive integer when supplied. Example: 1. Source: Alpha Ed-Fi view.["paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-contact-priority
contact_restrictionsResponsearray of strings, redacted when unauthorizedNoContact restrictions; restricted/redacted by privacy rules. Range: Restriction text or descriptor values after privacy filtering. Example: ["do_not_release_address"]. Source: Alpha Ed-Fi view.["paitd-013-guardian-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-contact-restrictions
ETagHeaderHTTP entity tagNo on read-only Alpha viewsEd-Fi-backed Alpha views do not accept Alpha PATCH or DELETE. Use source_updated_at for polling.["paitd-012-edfi-second-upstream"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

GET /staff_assignments

Lists staff assignment rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-staff-assignment
operation
listStaffAssignment
auth
people_orgs:read + relationship/admin scope when family or staff scoped
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read + relationship/admin scope when family or staff scoped scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
asOfDateQueryISO 8601 dateRequired for active-as-of readsDate used to answer whether effective-dated memberships are active. begin_date null excludes the row; end_date null means still active after begin_date.["paitd-004-point-in-time-memberships","paitd-103-query-model"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: staffPersonId, placeId, staffClassification, asOfDate, isTimeLocatable, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: place_id, staff_person_id, staff_classification, begin_date, assignment_order. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]
includeDeletedQuerybooleanNo; audit/admin scope onlyOrdinary Alpha reads behave as includeDeleted=false and exclude draft records. Audit callers may request retained Ed-Fi soft-delete history only through a privileged path.["paitd-012-edfi-second-upstream","paitd-111-privacy-retention"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseStaff Assignment[]YesA staff member's assignment to a school, district, department, or other education organization beyond the role rows OneRoster already carries.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-staff-assignment-view
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-tenant-id
staff_assignment_idResponsestringYesTenant-scoped Ed-Fi local id for the staff assignment. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: "staff_assignment_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-staff-assignment-id
staff_person_idResponseperson idYesStaff person id resolved through the platform3 sourcedId boundary. Range: 1 to 255 printable characters. Example: "person_grace_hopper". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-staff-person-id
place_idResponseplace idYesSchool or education organization place id resolved through OneRoster. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-place-id
staff_classificationResponsestringConditionalGoverned staff-classification descriptor. Range: Resolved Ed-Fi StaffClassification descriptor value; open governed code list. Example: "Teacher". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-staff-classification
position_titleResponsestringNoHuman staff position title. Range: 0 to 200 visible characters. Example: "Middle School Math Guide". Source: Alpha Ed-Fi view.["paitd-014-staff-assignment-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-position-title
begin_dateResponsedateNoInclusive date the assignment becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha Ed-Fi view.["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-begin-date
end_dateResponsedateNoDate the assignment ends; null means active after begin_date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha Ed-Fi view.["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is present; consumers do not infer from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-is-time-locatable
assignment_orderResponseintegerNoPrimary/secondary assignment order when supplied. Range: Positive integer when supplied. Example: 1. Source: Alpha Ed-Fi view.["paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-assignment-order
full_time_equivalencyResponsenumberNoRatio of expected work time for the assignment. Range: 0.0 to 1.0 unless source policy documents another bound. Example: 1. Source: Alpha Ed-Fi view.["paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-full-time-equivalency
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /staff_assignments/{staffAssignmentId}

Reads one staff assignment view row. Alpha exposes Ed-Fi canonical records read-only and routes mutations to the Ed-Fi 1EdTech surface.

id
endpoint-get-staff-assignment
operation
getStaffAssignment
auth
people_orgs:read + relationship/admin scope when family or staff scoped
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read + relationship/admin scope when family or staff scoped scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
staffAssignmentIdPathstringYes["paitd-102-read-shape"]Staff assignment id from staff_assignment.staff_assignment_id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-tenant-id
staff_assignment_idResponsestringYesTenant-scoped Ed-Fi local id for the staff assignment. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: "staff_assignment_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-staff-assignment-id
staff_person_idResponseperson idYesStaff person id resolved through the platform3 sourcedId boundary. Range: 1 to 255 printable characters. Example: "person_grace_hopper". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-staff-person-id
place_idResponseplace idYesSchool or education organization place id resolved through OneRoster. Range: 1 to 255 printable characters. Example: "place_timeback_school". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-place-id
staff_classificationResponsestringConditionalGoverned staff-classification descriptor. Range: Resolved Ed-Fi StaffClassification descriptor value; open governed code list. Example: "Teacher". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-staff-classification
position_titleResponsestringNoHuman staff position title. Range: 0 to 200 visible characters. Example: "Middle School Math Guide". Source: Alpha Ed-Fi view.["paitd-014-staff-assignment-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-position-title
begin_dateResponsedateNoInclusive date the assignment becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha Ed-Fi view.["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-begin-date
end_dateResponsedateNoDate the assignment ends; null means active after begin_date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha Ed-Fi view.["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is present; consumers do not infer from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-is-time-locatable
assignment_orderResponseintegerNoPrimary/secondary assignment order when supplied. Range: Positive integer when supplied. Example: 1. Source: Alpha Ed-Fi view.["paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-assignment-order
full_time_equivalencyResponsenumberNoRatio of expected work time for the assignment. Range: 0.0 to 1.0 unless source policy documents another bound. Example: 1. Source: Alpha Ed-Fi view.["paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-full-time-equivalency
ETagHeaderHTTP entity tagNo on read-only Alpha viewsEd-Fi-backed Alpha views do not accept Alpha PATCH or DELETE. Use source_updated_at for polling.["paitd-012-edfi-second-upstream"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

GET /program_participations

Lists program participation rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-program-participation
operation
listProgramParticipation
auth
people_orgs:read + relationship/admin scope when family or staff scoped
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read + relationship/admin scope when family or staff scoped scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
asOfDateQueryISO 8601 dateRequired for active-as-of readsDate used to answer whether effective-dated memberships are active. begin_date null excludes the row; end_date null means still active after begin_date.["paitd-004-point-in-time-memberships","paitd-103-query-model"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: studentPersonId, placeId, programId, programType, participationStatus, sourceProgramResource, asOfDate, isTimeLocatable, modifiedSince.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: student_person_id, program_type, program_name, begin_date. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]
includeDeletedQuerybooleanNo; audit/admin scope onlyOrdinary Alpha reads behave as includeDeleted=false and exclude draft records. Audit callers may request retained Ed-Fi soft-delete history only through a privileged path.["paitd-012-edfi-second-upstream","paitd-111-privacy-retention"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseProgram Participation[]YesA student's participation in an administrative program such as Special Education, Title I, English Learner, Section 504, food service, or another Ed-Fi program association.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-program-participation-view
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-tenant-id
program_participation_idResponsestringYesTenant-scoped Ed-Fi local id for the program association. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: "program_participation_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-participation-id
student_person_idResponseperson idYesStudent person id resolved through the platform3 sourcedId boundary. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-student-person-id
place_idResponseplace idConditionalSchool or education organization place id resolved through OneRoster. Range: 1 to 255 printable characters when supplied. Example: "place_timeback_school". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-place-id
program_idResponsestringConditionalProgram identifier from the linked Ed-Fi Program payload when present. Range: Ed-Fi ProgramId from the canonical payload. Example: "program-special-education". Source: Alpha Ed-Fi view.["paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-id
program_nameResponsestringNoPlain program name. Range: 0 to 240 visible characters. Example: "Special Education". Source: Alpha Ed-Fi view.["paitd-015-program-participation-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-name
program_typeResponsestringConditionalGoverned Ed-Fi program-type descriptor. Range: Resolved Ed-Fi ProgramType descriptor value; open governed code list. Example: "Special Education". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-type
participation_statusResponsestringNoGoverned participation-status descriptor. Range: Resolved Ed-Fi ProgramParticipationStatus descriptor value; open governed code list. Example: "Participating". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-participation-status
begin_dateResponsedateNoInclusive date the student becomes involved with the program. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha Ed-Fi view.["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-begin-date
end_dateResponsedateNoDate the student exits the program; null means active after begin_date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha Ed-Fi view.["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is present. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-is-time-locatable
source_program_resourceResponsestring enumYesExact Ed-Fi association/specialization that produced the row. Allowed values: GeneralStudentProgramAssociation, StudentProgramAssociation, SpecialEducationProgramAssociation, TitleIPartAProgramAssociation, EnglishLearnerProgramAssociation, Section504ProgramAssociation, FoodServiceProgramAssociation. Range: One of the Ed-Fi program-association resources exposed by PAITD-015. Example: "GeneralStudentProgramAssociation". Source: Alpha Ed-Fi view.["paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-source-program-resource
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /program_participations/{programParticipationId}

Reads one program participation view row. Alpha exposes Ed-Fi canonical records read-only and routes mutations to the Ed-Fi 1EdTech surface.

id
endpoint-get-program-participation
operation
getProgramParticipation
auth
people_orgs:read + relationship/admin scope when family or staff scoped
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read + relationship/admin scope when family or staff scoped scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
programParticipationIdPathstringYes["paitd-102-read-shape"]Program participation id from program_participation.program_participation_id.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-tenant-id
program_participation_idResponsestringYesTenant-scoped Ed-Fi local id for the program association. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: "program_participation_001". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-participation-id
student_person_idResponseperson idYesStudent person id resolved through the platform3 sourcedId boundary. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-student-person-id
place_idResponseplace idConditionalSchool or education organization place id resolved through OneRoster. Range: 1 to 255 printable characters when supplied. Example: "place_timeback_school". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-place-id
program_idResponsestringConditionalProgram identifier from the linked Ed-Fi Program payload when present. Range: Ed-Fi ProgramId from the canonical payload. Example: "program-special-education". Source: Alpha Ed-Fi view.["paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-id
program_nameResponsestringNoPlain program name. Range: 0 to 240 visible characters. Example: "Special Education". Source: Alpha Ed-Fi view.["paitd-015-program-participation-views","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-name
program_typeResponsestringConditionalGoverned Ed-Fi program-type descriptor. Range: Resolved Ed-Fi ProgramType descriptor value; open governed code list. Example: "Special Education". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-type
participation_statusResponsestringNoGoverned participation-status descriptor. Range: Resolved Ed-Fi ProgramParticipationStatus descriptor value; open governed code list. Example: "Participating". Source: Alpha Ed-Fi view.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-participation-status
begin_dateResponsedateNoInclusive date the student becomes involved with the program. Range: ISO 8601 date YYYY-MM-DD. Example: "2026-08-15". Source: Alpha Ed-Fi view.["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-begin-date
end_dateResponsedateNoDate the student exits the program; null means active after begin_date. Range: ISO 8601 date YYYY-MM-DD. Example: "2027-06-01". Source: Alpha Ed-Fi view.["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is present. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-is-time-locatable
source_program_resourceResponsestring enumYesExact Ed-Fi association/specialization that produced the row. Allowed values: GeneralStudentProgramAssociation, StudentProgramAssociation, SpecialEducationProgramAssociation, TitleIPartAProgramAssociation, EnglishLearnerProgramAssociation, Section504ProgramAssociation, FoodServiceProgramAssociation. Range: One of the Ed-Fi program-association resources exposed by PAITD-015. Example: "GeneralStudentProgramAssociation". Source: Alpha Ed-Fi view.["paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-source-program-resource
ETagHeaderHTTP entity tagNo on read-only Alpha viewsEd-Fi-backed Alpha views do not accept Alpha PATCH or DELETE. Use source_updated_at for polling.["paitd-012-edfi-second-upstream"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

GET /app_credentials

Lists app credential rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-app-credential
operation
listAppCredential
auth
people_orgs:credential_status:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:credential_status:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: studentSourcedId, appId, hasCredential, lastRotatedBefore.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: student_sourced_id, app_id, last_rotated_at. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseApp Credential[]YesA first-class operational secret reference for a student's login to a third-party learning app. The secret value is never stored in a roster field, tag, log, or API response.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-app-credential
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-tenant-id
student_sourced_idResponseperson idYesStudent person id that owns the credential. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-student-sourced-id
app_idResponsestringYesLearning app identifier. Range: 1 to 120 lowercase letters, digits, hyphens, underscores, or dots. Example: "ixl_math". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-app-id
has_credentialResponsebooleanYesTrue when a vault reference exists. The raw secret_ref is never returned. Range: Managed-vault reference URI or key accepted by the security-approved vault. Example: true. Source: Alpha extend.["paitd-008-app-credentials","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-secret-ref
created_atResponseISO 8601 datetimeYesCredential reference creation time. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-created-at
last_rotated_atResponseISO 8601 datetime or nullNoLast rotation time surfaced for audit and operations. Range: ISO 8601 UTC datetime when supplied. Example: "2026-11-01T09:00:00.000Z". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-last-rotated-at
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /app_credentials/{studentSourcedId}/{appId}

Reads one app credential resource and returns an ETag when the resource is mutable.

id
endpoint-get-app-credential
operation
getAppCredential
auth
people_orgs:credential_status:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:credential_status:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
studentSourcedIdPathstringYes["paitd-102-read-shape"]Student person id that owns the credential reference.
appIdPathstringYes["paitd-102-read-shape"]Learning app identifier.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-tenant-id
student_sourced_idResponseperson idYesStudent person id that owns the credential. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-student-sourced-id
app_idResponsestringYesLearning app identifier. Range: 1 to 120 lowercase letters, digits, hyphens, underscores, or dots. Example: "ixl_math". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-app-id
has_credentialResponsebooleanYesTrue when a vault reference exists. The raw secret_ref is never returned. Range: Managed-vault reference URI or key accepted by the security-approved vault. Example: true. Source: Alpha extend.["paitd-008-app-credentials","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-secret-ref
created_atResponseISO 8601 datetimeYesCredential reference creation time. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-created-at
last_rotated_atResponseISO 8601 datetime or nullNoLast rotation time surfaced for audit and operations. Range: ISO 8601 UTC datetime when supplied. Example: "2026-11-01T09:00:00.000Z". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-last-rotated-at
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /app_credentials

Creates one app credential resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-app-credential
operation
createAppCredential
auth
people_orgs:credential_reference:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:credential_reference:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
student_sourced_idBodyperson idYesStudent person id that owns the credential. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-008-app-credentials"]
app_idBodystringYesLearning app identifier. Range: 1 to 120 lowercase letters, digits, hyphens, underscores, or dots. Example: "ixl_math". Source: Alpha extend.["paitd-008-app-credentials"]
secret_refBodyredacted reference statusYesReference to a managed secrets vault, never plaintext. Range: Managed-vault reference URI or key accepted by the security-approved vault. Example: [vault reference supplied out of band]. Source: Alpha extend.["paitd-008-app-credentials","paitd-111-privacy-retention"]
created_atBodyISO 8601 datetimeYesCredential reference creation time. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha extend.["paitd-008-app-credentials"]
last_rotated_atBodyISO 8601 datetime or nullNoLast rotation time surfaced for audit and operations. Range: ISO 8601 UTC datetime when supplied. Example: "2026-11-01T09:00:00.000Z". Source: Alpha extend.["paitd-008-app-credentials"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-tenant-id
student_sourced_idResponseperson idYesStudent person id that owns the credential. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-student-sourced-id
app_idResponsestringYesLearning app identifier. Range: 1 to 120 lowercase letters, digits, hyphens, underscores, or dots. Example: "ixl_math". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-app-id
has_credentialResponsebooleanYesTrue when a vault reference exists. The raw secret_ref is never returned. Range: Managed-vault reference URI or key accepted by the security-approved vault. Example: true. Source: Alpha extend.["paitd-008-app-credentials","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-secret-ref
created_atResponseISO 8601 datetimeYesCredential reference creation time. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-created-at
last_rotated_atResponseISO 8601 datetime or nullNoLast rotation time surfaced for audit and operations. Range: ISO 8601 UTC datetime when supplied. Example: "2026-11-01T09:00:00.000Z". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-last-rotated-at
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /app_credentials/{studentSourcedId}/{appId}

Updates one app credential resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-app-credential
operation
updateAppCredential
auth
people_orgs:credential_reference:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:credential_reference:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
studentSourcedIdPathstringYes["paitd-102-read-shape"]Student person id that owns the credential reference.
appIdPathstringYes["paitd-102-read-shape"]Learning app identifier.
secret_refBodyredacted reference statusNoReference to a managed secrets vault, never plaintext. Range: Managed-vault reference URI or key accepted by the security-approved vault. Example: [vault reference supplied out of band]. Source: Alpha extend.["paitd-008-app-credentials","paitd-111-privacy-retention"]
last_rotated_atBodyISO 8601 datetime or nullNoLast rotation time surfaced for audit and operations. Range: ISO 8601 UTC datetime when supplied. Example: "2026-11-01T09:00:00.000Z". Source: Alpha extend.["paitd-008-app-credentials"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-tenant-id
student_sourced_idResponseperson idYesStudent person id that owns the credential. Range: 1 to 255 printable characters. Example: "person_ada_lovelace". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-student-sourced-id
app_idResponsestringYesLearning app identifier. Range: 1 to 120 lowercase letters, digits, hyphens, underscores, or dots. Example: "ixl_math". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-app-id
has_credentialResponsebooleanYesTrue when a vault reference exists. The raw secret_ref is never returned. Range: Managed-vault reference URI or key accepted by the security-approved vault. Example: true. Source: Alpha extend.["paitd-008-app-credentials","paitd-111-privacy-retention"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-secret-ref
created_atResponseISO 8601 datetimeYesCredential reference creation time. Range: ISO 8601 UTC datetime. Example: "2026-08-15T13:45:30.000Z". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-created-at
last_rotated_atResponseISO 8601 datetime or nullNoLast rotation time surfaced for audit and operations. Range: ISO 8601 UTC datetime when supplied. Example: "2026-11-01T09:00:00.000Z". Source: Alpha extend.["paitd-008-app-credentials"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-app-credential-last-rotated-at
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /app_credentials/{studentSourcedId}/{appId}

Logically deletes or retires one app credential resource without erasing historical roster evidence.

id
endpoint-delete-app-credential
operation
deleteAppCredential
auth
people_orgs:credential_reference:write
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:credential_reference:write scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
studentSourcedIdPathstringYes["paitd-102-read-shape"]Student person id that owns the credential reference.
appIdPathstringYes["paitd-102-read-shape"]Learning app identifier.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /tag_definitions

Lists tag definition rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-tag-definition
operation
listTagDefinition
auth
people_orgs:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: tagKey, anchor, isLocked.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: tag_key, anchor. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseTag Definition[]YesGoverned tag registry for low-cardinality roster reporting dimensions that do not belong as enforced relationship columns.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-tag-definition
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-tenant-id
tag_keyResponsestringYesStable tag key. Range: 1 to 80 lowercase letters, digits, underscores, or dots. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-tag-key
anchorResponsestring enumYesThe grain the tag is allowed to attach to, such as nwea_account or school. Allowed values: nwea_account, school, person. Range: One of the allowed anchors. Example: "school". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-anchor
allowed_valuesResponsearray of stringsYesGoverned allowed value list. Range: Array of governed scalar values; each value must fit the tag value_type. Example: ["WL","LL","L1","L2","MS","HS"]. Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-allowed-values
value_typeResponsestring enumYesTyped value class. Allowed values: string, integer, boolean, date. Range: string, integer, boolean, or date. Example: "string". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-value-type
is_lockedResponsebooleanYesTrue when setup seeds and locks the tag, as with brand, modality, segment, and level. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-is-locked
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /tag_definitions/{anchor}/{tagKey}

Reads one tag definition resource and returns an ETag when the resource is mutable.

id
endpoint-get-tag-definition
operation
getTagDefinition
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
anchorPathstringYes["paitd-102-read-shape"]Tag grain, such as nwea_account or school.
tagKeyPathstringYes["paitd-102-read-shape"]Registered tag key.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-tenant-id
tag_keyResponsestringYesStable tag key. Range: 1 to 80 lowercase letters, digits, underscores, or dots. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-tag-key
anchorResponsestring enumYesThe grain the tag is allowed to attach to, such as nwea_account or school. Allowed values: nwea_account, school, person. Range: One of the allowed anchors. Example: "school". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-anchor
allowed_valuesResponsearray of stringsYesGoverned allowed value list. Range: Array of governed scalar values; each value must fit the tag value_type. Example: ["WL","LL","L1","L2","MS","HS"]. Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-allowed-values
value_typeResponsestring enumYesTyped value class. Allowed values: string, integer, boolean, date. Range: string, integer, boolean, or date. Example: "string". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-value-type
is_lockedResponsebooleanYesTrue when setup seeds and locks the tag, as with brand, modality, segment, and level. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-is-locked
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /tag_definitions

Creates one tag definition resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-tag-definition
operation
createTagDefinition
auth
people_orgs:admin
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:admin scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
tag_keyBodystringYesStable tag key. Range: 1 to 80 lowercase letters, digits, underscores, or dots. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]
anchorBodystring enumYesThe grain the tag is allowed to attach to, such as nwea_account or school. Allowed values: nwea_account, school, person. Range: One of the allowed anchors. Example: "school". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]
allowed_valuesBodyarray of stringsYesGoverned allowed value list. Range: Array of governed scalar values; each value must fit the tag value_type. Example: ["WL","LL","L1","L2","MS","HS"]. Source: Alpha extend.["paitd-006-tag-registry"]
value_typeBodystring enumYesTyped value class. Allowed values: string, integer, boolean, date. Range: string, integer, boolean, or date. Example: "string". Source: Alpha extend.["paitd-006-tag-registry"]
is_lockedBodybooleanYesTrue when setup seeds and locks the tag, as with brand, modality, segment, and level. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-tenant-id
tag_keyResponsestringYesStable tag key. Range: 1 to 80 lowercase letters, digits, underscores, or dots. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-tag-key
anchorResponsestring enumYesThe grain the tag is allowed to attach to, such as nwea_account or school. Allowed values: nwea_account, school, person. Range: One of the allowed anchors. Example: "school". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-anchor
allowed_valuesResponsearray of stringsYesGoverned allowed value list. Range: Array of governed scalar values; each value must fit the tag value_type. Example: ["WL","LL","L1","L2","MS","HS"]. Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-allowed-values
value_typeResponsestring enumYesTyped value class. Allowed values: string, integer, boolean, date. Range: string, integer, boolean, or date. Example: "string". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-value-type
is_lockedResponsebooleanYesTrue when setup seeds and locks the tag, as with brand, modality, segment, and level. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-is-locked
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /tag_definitions/{anchor}/{tagKey}

Updates one tag definition resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-tag-definition
operation
updateTagDefinition
auth
people_orgs:admin
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:admin scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
anchorPathstringYes["paitd-102-read-shape"]Tag grain, such as nwea_account or school.
tagKeyPathstringYes["paitd-102-read-shape"]Registered tag key.
tag_keyBodystringNoStable tag key. Range: 1 to 80 lowercase letters, digits, underscores, or dots. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]
anchorBodystring enumNoThe grain the tag is allowed to attach to, such as nwea_account or school. Allowed values: nwea_account, school, person. Range: One of the allowed anchors. Example: "school". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]
allowed_valuesBodyarray of stringsNoGoverned allowed value list. Range: Array of governed scalar values; each value must fit the tag value_type. Example: ["WL","LL","L1","L2","MS","HS"]. Source: Alpha extend.["paitd-006-tag-registry"]
value_typeBodystring enumNoTyped value class. Allowed values: string, integer, boolean, date. Range: string, integer, boolean, or date. Example: "string". Source: Alpha extend.["paitd-006-tag-registry"]
is_lockedBodybooleanNoTrue when setup seeds and locks the tag, as with brand, modality, segment, and level. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-tenant-id
tag_keyResponsestringYesStable tag key. Range: 1 to 80 lowercase letters, digits, underscores, or dots. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-tag-key
anchorResponsestring enumYesThe grain the tag is allowed to attach to, such as nwea_account or school. Allowed values: nwea_account, school, person. Range: One of the allowed anchors. Example: "school". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-anchor
allowed_valuesResponsearray of stringsYesGoverned allowed value list. Range: Array of governed scalar values; each value must fit the tag value_type. Example: ["WL","LL","L1","L2","MS","HS"]. Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-allowed-values
value_typeResponsestring enumYesTyped value class. Allowed values: string, integer, boolean, date. Range: string, integer, boolean, or date. Example: "string". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-value-type
is_lockedResponsebooleanYesTrue when setup seeds and locks the tag, as with brand, modality, segment, and level. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-tag-definition-is-locked
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /tag_definitions/{anchor}/{tagKey}

Logically deletes or retires one tag definition resource without erasing historical roster evidence.

id
endpoint-delete-tag-definition
operation
deleteTagDefinition
auth
people_orgs:admin
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:admin scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
anchorPathstringYes["paitd-102-read-shape"]Tag grain, such as nwea_account or school.
tagKeyPathstringYes["paitd-102-read-shape"]Registered tag key.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /object_tags

Lists object tag rows visible to the caller, with paging, fail-loud query validation, data-dictionary links, and architecture provenance.

id
endpoint-list-object-tag
operation
listObjectTag
auth
people_orgs:read
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope, plus relationship claims when the row is student/family scoped.["paitd-106-auth-shape","paitd-109-tenant-routing"]
filterQuerystringNoDocumented comparisons only. Minimum syntax: field==value, joined with AND and URL encoded. Supported filter fields for this collection: objectKind, objectId, tagKey, tagValue.["paitd-103-query-model","paitd-108-error-envelope"]
sortQuerystringNoComma-separated sort keys. Supported sort keys: object_kind, tag_key, tag_value. Prefix with - for descending order.["paitd-103-query-model"]
limitQueryintegerNoPositive integer page size. The server may cap the value and returns an opaque cursor when more rows remain.["paitd-103-query-model"]
cursorQueryopaque stringNoServer-provided continuation token. Clients must not parse it or reuse it across tenants.["paitd-103-query-model"]
modifiedSinceQueryISO 8601 datetimeNoPolls rows changed after the supplied instant. This is the shipped sync primitive; webhooks are deferred.["paitd-103-query-model","paitd-107-eventing-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseObject Tag[]YesA governed tag assignment for report slicing only. It is never used for relationships, joins to live rows, or secrets.["paitd-102-read-shape","paitd-112-list-endpoints"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-object-tag
countResponseintegerYesTotal rows after filters and before paging.["paitd-103-query-model"]
links.nextResponsestring or nullYesOpaque cursor URL when another page exists.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the table definition for this collection.["paitd-010-alias-map-contract"]

fieldRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tenant-id
object_kindResponsestring enumYesTagged Alpha object kind. Allowed values: person, place, school_period, place_membership, class_membership. Range: One of the allowed object kinds. Example: "place". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-object-kind
object_idResponsestringYesTagged object id. Range: 1 to 255 printable characters. Example: "place_alpha_ms". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-object-id
tag_keyResponsestringYesRegistered tag key. Range: Existing tag_definition.tag_key for this tenant and compatible anchor. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tag-key
tag_valueResponsestringYesAllowed value from tag_definition. Range: One of tag_definition.allowed_values for the tag_key and anchor. Example: "MS". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tag-value
traces
[
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-112-list-endpoints"
]

GET /object_tags/{objectKind}/{objectId}/{tagKey}

Reads one object tag resource and returns an ETag when the resource is mutable.

id
endpoint-get-object-tag
operation
getObjectTag
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
objectKindPathstringYes["paitd-102-read-shape"]Tagged Alpha object kind.
objectIdPathstringYes["paitd-102-read-shape"]Tagged object id.
tagKeyPathstringYes["paitd-102-read-shape"]Registered tag key.

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tenant-id
object_kindResponsestring enumYesTagged Alpha object kind. Allowed values: person, place, school_period, place_membership, class_membership. Range: One of the allowed object kinds. Example: "place". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-object-kind
object_idResponsestringYesTagged object id. Range: 1 to 255 printable characters. Example: "place_alpha_ms". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-object-id
tag_keyResponsestringYesRegistered tag key. Range: Existing tag_definition.tag_key for this tenant and compatible anchor. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tag-key
tag_valueResponsestringYesAllowed value from tag_definition. Range: One of tag_definition.allowed_values for the tag_key and anchor. Example: "MS". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tag-value
ETagHeaderHTTP entity tagYes for mutable resourcesValidator required before PATCH, PUT, or DELETE.["paitd-104-concurrency-model"]
traces
[
  "paitd-102-read-shape",
  "paitd-104-concurrency-model"
]

POST /object_tags

Creates one object tag resource. Alpha writes are per-resource commands; sourced fields route to the owning 1EdTech base surface and Alpha extension fields stay in extension tables.

id
endpoint-create-object-tag
operation
createObjectTag
auth
people_orgs:admin
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:admin scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
Idempotency-KeyHeaderASCII stringYesRetry key for this create request. Same key plus same body replays the same result.["paitd-105-idempotency-model"]
object_kindBodystring enumYesTagged Alpha object kind. Allowed values: person, place, school_period, place_membership, class_membership. Range: One of the allowed object kinds. Example: "place". Source: Alpha extend.["paitd-006-tag-registry"]
object_idBodystringYesTagged object id. Range: 1 to 255 printable characters. Example: "place_alpha_ms". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]
tag_keyBodystringYesRegistered tag key. Range: Existing tag_definition.tag_key for this tenant and compatible anchor. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]
tag_valueBodystringYesAllowed value from tag_definition. Range: One of tag_definition.allowed_values for the tag_key and anchor. Example: "MS". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
statusHTTP201 CreatedYesResource was created.["paitd-101-write-granularity"]
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tenant-id
object_kindResponsestring enumYesTagged Alpha object kind. Allowed values: person, place, school_period, place_membership, class_membership. Range: One of the allowed object kinds. Example: "place". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-object-kind
object_idResponsestringYesTagged object id. Range: 1 to 255 printable characters. Example: "place_alpha_ms". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-object-id
tag_keyResponsestringYesRegistered tag key. Range: Existing tag_definition.tag_key for this tenant and compatible anchor. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tag-key
tag_valueResponsestringYesAllowed value from tag_definition. Range: One of tag_definition.allowed_values for the tag_key and anchor. Example: "MS". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tag-value
ETagHeaderHTTP entity tagYesValidator for the created resource.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-105-idempotency-model"
]

PATCH /object_tags/{objectKind}/{objectId}/{tagKey}

Updates one object tag resource with optimistic concurrency. Missing If-Match returns a typed 428 Problem.

id
endpoint-update-object-tag
operation
updateObjectTag
auth
people_orgs:admin
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:admin scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this update request.["paitd-105-idempotency-model"]
objectKindPathstringYes["paitd-102-read-shape"]Tagged Alpha object kind.
objectIdPathstringYes["paitd-102-read-shape"]Tagged object id.
tagKeyPathstringYes["paitd-102-read-shape"]Registered tag key.
object_kindBodystring enumNoTagged Alpha object kind. Allowed values: person, place, school_period, place_membership, class_membership. Range: One of the allowed object kinds. Example: "place". Source: Alpha extend.["paitd-006-tag-registry"]
tag_keyBodystringNoRegistered tag key. Range: Existing tag_definition.tag_key for this tenant and compatible anchor. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]
tag_valueBodystringNoAllowed value from tag_definition. Range: One of tag_definition.allowed_values for the tag_key and anchor. Example: "MS". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
tenant_idResponseHidden in ordinary Alpha responses; selected from the verified JWT.YesThe tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: "0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3". Source: Alpha inherited.["paitd-109-tenant-routing"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tenant-id
object_kindResponsestring enumYesTagged Alpha object kind. Allowed values: person, place, school_period, place_membership, class_membership. Range: One of the allowed object kinds. Example: "place". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-object-kind
object_idResponsestringYesTagged object id. Range: 1 to 255 printable characters. Example: "place_alpha_ms". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-object-id
tag_keyResponsestringYesRegistered tag key. Range: Existing tag_definition.tag_key for this tenant and compatible anchor. Example: "level". Source: Alpha extend.["paitd-006-tag-registry"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tag-key
tag_valueResponsestringYesAllowed value from tag_definition. Range: One of tag_definition.allowed_values for the tag_key and anchor. Example: "MS". Source: Alpha extend.["paitd-006-tag-registry","paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-object-tag-tag-value
ETagHeaderHTTP entity tagYesNew validator after the update.["paitd-104-concurrency-model"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-105-idempotency-model"
]

DELETE /object_tags/{objectKind}/{objectId}/{tagKey}

Logically deletes or retires one object tag resource without erasing historical roster evidence.

id
endpoint-delete-object-tag
operation
deleteObjectTag
auth
people_orgs:admin
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontracemeaning
AuthorizationHeaderBearer JWTYesToken must carry tenant and people_orgs:admin scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
If-MatchHeaderETagYesValidator from the latest GET response.["paitd-104-concurrency-model"]
Idempotency-KeyHeaderASCII stringYesRetry key for this delete request.["paitd-105-idempotency-model"]
objectKindPathstringYes["paitd-102-read-shape"]Tagged Alpha object kind.
objectIdPathstringYes["paitd-102-read-shape"]Tagged object id.
tagKeyPathstringYes["paitd-102-read-shape"]Registered tag key.

responseRows

namelocationtyperequireddescriptiontrace
deletedResponsebooleanYesTrue when the resource was logically deleted or retired.["paitd-111-privacy-retention"]
idResponsestringYesThe deleted resource id in its own collection.["paitd-102-read-shape"]
traces
[
  "paitd-101-write-granularity",
  "paitd-104-concurrency-model",
  "paitd-111-privacy-retention"
]

GET /policy_config

Lists the alpha.policy.* config People & Orgs exposes so apps do not hardcode school levels, tenure buckets, school-day logic, or the XP-minute convention.

id
endpoint-list-policy-config
operation
listPolicyConfig
auth
people_orgs:read
fieldRows

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]

responseRows

namelocationtyperequireddescriptiontrace
data[]ResponsePolicyConfig[]YesPublished policy entries including school levels, tenure buckets, school-day calendar policy, and XP-minute convention.["paitd-007-tenure-and-grade-context"]
countResponseintegerYesNumber of policy entries returned.["paitd-103-query-model"]
links.customerWebsiteResponseURLYesStable link back to this policy section.["paitd-102-read-shape"]

schemaTables

titlerows
PolicyConfig fields returned in data[][{"name":"key","location":"Response","type":"alpha.policy.* key","required":"Yes","description":"Stable policy key. Clients branch on this key instead of hardcoding local lists or formulas.","trace":["paitd-007-tenure-and-grade-context"]},{"name":"type","location":"Response","type":"string","required":"Yes","description":"Plain type of policy payload.","trace":["paitd-007-tenure-and-grade-context"]},{"name":"owner","location":"Response","type":"string","required":"When present","description":"Surface or module that owns the policy answer.","trace":["paitd-010-alias-map-contract"]},{"name":"meaning","location":"Response","type":"string","required":"Yes","description":"What the policy means in student/parent-facing terms.","trace":["paitd-010-alias-map-contract"]},{"name":"requiredBy","location":"Response","type":"string","required":"When present","description":"Workflows that depend on this policy.","trace":["paitd-007-tenure-and-grade-context"]},{"name":"invalidWhen","location":"Response","type":"string","required":"Yes","description":"The client behavior this policy replaces.","trace":["paitd-108-error-envelope"]},{"name":"example","location":"Response","type":"object","required":"When useful","description":"Machine-readable example payload or regression value.","trace":["paitd-103-query-model"]},{"name":"itds[]","location":"Response","type":"trace link[]","required":"Yes","description":"Architecture decisions that pin this policy.","trace":["paitd-010-alias-map-contract"]}]
traces
[
  "paitd-007-tenure-and-grade-context",
  "paitd-103-query-model"
]

GET /policy_config/{key}

Reads one alpha.policy.* key, such as alpha.policy.expected_xp_minute_convention, by stable key.

id
endpoint-get-policy-config
operation
getPolicyConfig
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
keyPathalpha.policy.* keyYesPolicy key to read. Example: alpha.policy.expected_xp_minute_convention.["paitd-007-tenure-and-grade-context"]

responseRows

namelocationtyperequireddescriptiontrace
keyResponsealpha.policy.* keyYesStable policy key. Clients branch on this key instead of hardcoding local lists or formulas.["paitd-007-tenure-and-grade-context"]
typeResponsestringYesPlain type of policy payload.["paitd-007-tenure-and-grade-context"]
ownerResponsestringWhen presentSurface or module that owns the policy answer.["paitd-010-alias-map-contract"]
meaningResponsestringYesWhat the policy means in student/parent-facing terms.["paitd-010-alias-map-contract"]
requiredByResponsestringWhen presentWorkflows that depend on this policy.["paitd-007-tenure-and-grade-context"]
invalidWhenResponsestringYesThe client behavior this policy replaces.["paitd-108-error-envelope"]
exampleResponseobjectWhen usefulMachine-readable example payload or regression value.["paitd-103-query-model"]
itds[]Responsetrace link[]YesArchitecture decisions that pin this policy.["paitd-010-alias-map-contract"]
traces
[
  "paitd-007-tenure-and-grade-context",
  "paitd-103-query-model"
]

GET /places/{placeId}/school_calendar/{date}

Reads one school calendar date and says whether it is a school day.

id
endpoint-get-school-calendar-day
operation
getSchoolCalendarDay
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
placeIdPathplace_idYesSchool place id.["paitd-003-place-nwea-boundary"]
datePathISO 8601 dateYesCalendar date to read.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontrace
school_idResponseplace_idYesSchool place id used for the calendar read.["paitd-003-place-nwea-boundary"]
calendar_dateResponseISO 8601 dateYes on day/range rowsDate from the Ed-Fi CalendarDate-backed alpha.school_calendar view.["paitd-005-school-periods"]
is_school_dayResponsebooleanYes on day/range rowsTrue only for actual school days. This is served by the surface, not computed by weekday counting.["paitd-005-school-periods"]
reasonResponseenumYes on day/range rowsReason code such as instructional, weekend, holiday_break, teacher_workshop, nwea_map_testing, or other.["paitd-005-school-periods"]
source_refResponsestringYes on day/range rowsCalendarDate source reference used for audit/debugging.["paitd-010-alias-map-contract"]
school_yearResponseintegerYes when knownSchool year associated with the CalendarDate row.["paitd-005-school-periods"]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-005-school-periods",
  "paitd-103-query-model"
]

GET /places/{placeId}/school_calendar

Lists Ed-Fi-backed school calendar dates in an inclusive range and includes the served school-day count.

id
endpoint-list-school-calendar-range
operation
listSchoolCalendarRange
auth
people_orgs:read
fieldRows

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
placeIdPathplace_idYesSchool place id.["paitd-003-place-nwea-boundary"]
startDateQueryISO 8601 dateYesInclusive start date.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]
endDateQueryISO 8601 dateYesInclusive end date.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontrace
data[]ResponseSchoolCalendarDay[]YesOne row per date in the inclusive range. Missing CalendarDate facts fail closed instead of being filled by weekday math.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]
countResponseintegerYesCalendar days returned.["paitd-103-query-model"]
school_days_in_rangeResponseintegerYesCount of rows with is_school_day=true.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]

schemaTables

titlerows
SchoolCalendarDay fields returned in data[][{"name":"school_id","location":"Response","type":"place_id","required":"Yes","description":"School place id used for the calendar read.","trace":["paitd-003-place-nwea-boundary"]},{"name":"calendar_date","location":"Response","type":"ISO 8601 date","required":"Yes on day/range rows","description":"Date from the Ed-Fi CalendarDate-backed alpha.school_calendar view.","trace":["paitd-005-school-periods"]},{"name":"is_school_day","location":"Response","type":"boolean","required":"Yes on day/range rows","description":"True only for actual school days. This is served by the surface, not computed by weekday counting.","trace":["paitd-005-school-periods"]},{"name":"reason","location":"Response","type":"enum","required":"Yes on day/range rows","description":"Reason code such as instructional, weekend, holiday_break, teacher_workshop, nwea_map_testing, or other.","trace":["paitd-005-school-periods"]},{"name":"source_ref","location":"Response","type":"string","required":"Yes on day/range rows","description":"CalendarDate source reference used for audit/debugging.","trace":["paitd-010-alias-map-contract"]},{"name":"school_year","location":"Response","type":"integer","required":"Yes when known","description":"School year associated with the CalendarDate row.","trace":["paitd-005-school-periods"]}]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-005-school-periods",
  "paitd-103-query-model"
]

GET /places/{placeId}/school_days_between

Counts school days in an inclusive date range. The 2025-08-13 through 2026-07-24 regression returns 204.

id
endpoint-get-school-days-between
operation
getSchoolDaysBetween
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
placeIdPathplace_idYesSchool place id.["paitd-003-place-nwea-boundary"]
startDateQueryISO 8601 dateYesInclusive start date.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]
endDateQueryISO 8601 dateYesInclusive end date.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontrace
school_days_betweenResponseintegerYesCount of actual school days in the inclusive range.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]
calendar_daysResponseintegerYesNumber of CalendarDate rows inspected.["paitd-103-query-model"]
range_inclusiveResponsebooleanYesAlways true; both endpoints are included.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-005-school-periods",
  "paitd-103-query-model"
]

GET /places/{placeId}/school_days_remaining

Counts school days remaining from asOfDate through the active school-year end date. The 2026-06-12 regression returns 31.

id
endpoint-get-school-days-remaining
operation
getSchoolDaysRemaining
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
placeIdPathplace_idYesSchool place id.["paitd-003-place-nwea-boundary"]
asOfDateQueryISO 8601 dateYesDate used to find the active school period and remaining calendar range.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]
periodIdQueryschool_period idNoOptional explicit period when the caller already knows the school year.["paitd-005-school-periods"]

responseRows

namelocationtyperequireddescriptiontrace
school_days_remainingResponseintegerYesCount of actual school days remaining through endDate.["paitd-004-point-in-time-memberships","paitd-005-school-periods","paitd-103-query-model"]
endDateResponseISO 8601 dateYesEnd date of the selected school-year period.["paitd-005-school-periods"]
period_idResponseschool_period idYesSchool period used for the answer.["paitd-005-school-periods"]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-005-school-periods",
  "paitd-103-query-model"
]

GET /places/{placeId}/next_school_year_start

Reads the next school-year start date from school_period / academic-session rows.

id
endpoint-get-next-school-year-start
operation
getNextSchoolYearStart
auth
people_orgs:read
fieldRows
schemaTables

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and people_orgs:read scope.["paitd-106-auth-shape","paitd-109-tenant-routing"]
placeIdPathplace_idYesSchool place id.["paitd-003-place-nwea-boundary"]
asOfDateQueryISO 8601 dateYesDate before the next school-year start.["paitd-005-school-periods"]

responseRows

namelocationtyperequireddescriptiontrace
next_school_year_startResponseISO 8601 dateYesBegin date of the next school-year period.["paitd-005-school-periods"]
period_idResponseschool_period idYesSchool-year period that supplies the date.["paitd-005-school-periods"]
school_yearResponseintegerYesSchool-year value for the returned period.["paitd-005-school-periods"]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-005-school-periods",
  "paitd-103-query-model"
]

GET /people/{personId}/memberships

Lists a person's place and class memberships at an asOfDate so apps do not infer roles from names, emails, or stale current-only snapshots.

id
endpoint-list-person-memberships
operation
listPersonMemberships
auth
people_orgs:read
fieldRows

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and relationship-scoped access to the person.["paitd-106-auth-shape"]
personIdPathstringYesPerson id.["paitd-002-person-vocabulary"]
asOfDateQueryISO 8601 dateYesDate used for point-in-time membership answers.["paitd-004-point-in-time-memberships"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
person_idResponsestringYesPerson id from the request path.["paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
asOfDateResponseISO 8601 dateYesThe point-in-time date used for the answer.["paitd-004-point-in-time-memberships"]
place_memberships[]ResponsePlaceMembership[]YesDated place roles active at asOfDate.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-place-membership
class_memberships[]ResponseClassMembership[]YesDated learning-group memberships active at asOfDate.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-class-membership
links.dataDictionaryResponseURLYesStable link to the place membership dictionary entry.["paitd-010-alias-map-contract"]
links.customerWebsiteResponseURLYesStable link back to this endpoint contract.["paitd-102-read-shape"]

schemaTables

titlerows
PlaceMembership fields returned in place_memberships[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-tenant-id"},{"name":"membership_id","location":"Response","type":"string","required":"Yes","description":"Stable id for one person's dated role in one place. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place_membership). Example: \"pm_person_ada_place_school_student_2026\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-membership-id"},{"name":"person_id","location":"Response","type":"person id","required":"Yes","description":"Person who holds the role. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-person-id"},{"name":"place_id","location":"Response","type":"place id","required":"Yes","description":"Place where the role applies. Range: 1 to 255 printable characters. Example: \"place_timeback_school\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-place-id"},{"name":"role_kind","location":"Response","type":"string enum","required":"Yes","description":"Canonical role enum with a maintained alias fold; never parsed from names or titles. Allowed values: student, parent, guardian, relative, guide, staff, administrator. Range: One of the canonical role_kind values. Example: \"guide\". Source: Alpha rename+restrict.","trace":["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-kind"},{"name":"role_priority","location":"Response","type":"primary | secondary","required":"No","description":"Primary or secondary role marker. Allowed values: primary, secondary. Range: primary or secondary. Example: \"primary\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-priority"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Exclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-is-time-locatable"},{"name":"profile_id","location":"Response","type":"string","required":"No","description":"Optional non-secret profile reference. Range: 1 to 255 printable characters when supplied. Example: \"profile_canvas_001\". Source: Alpha rename+restrict.","trace":["paitd-008-app-credentials","paitd-009-sensitive-profile-privacy"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-profile-id"}]
ClassMembership fields returned in class_memberships[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-tenant-id"},{"name":"membership_id","location":"Response","type":"string","required":"Yes","description":"Stable id for one person's dated membership in one learning group. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.class_membership). Example: \"cm_alg1_ada_student_2026\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-membership-id"},{"name":"person_id","location":"Response","type":"person id","required":"Yes","description":"Person in the learning group. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id"},{"name":"school_id","location":"Response","type":"place id","required":"Yes","description":"School place for the membership. Range: 1 to 255 printable characters. Example: \"place_timeback_school\". Source: Alpha rename+restrict.","trace":["paitd-003-place-nwea-boundary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-school-id"},{"name":"learning_group_id","location":"Response","type":"string","required":"Yes","description":"OneRoster class id retained as a real relationship column. Range: 1 to 255 printable characters. Example: \"class_algebra_1_a\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-learning-group-id"},{"name":"role_kind","location":"Response","type":"string enum","required":"Yes","description":"Canonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: \"student\". Source: Alpha rename+restrict.","trace":["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-role-kind"},{"name":"is_primary_guide","location":"Response","type":"boolean","required":"No","description":"Primary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: \"false\". Source: Alpha rename+restrict.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-primary-guide"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Exclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-time-locatable"}]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-102-read-shape"
]

GET /places/{placeId}/people

Lists the people who belong to one place at an asOfDate, optionally narrowed by roleKind.

id
endpoint-list-place-people
operation
listPlacePeople
auth
people_orgs:read
fieldRows

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and place-scoped access.["paitd-106-auth-shape"]
placeIdPathstringYesPlace id.["paitd-003-place-nwea-boundary"]
asOfDateQueryISO 8601 dateYesDate used for point-in-time membership answers.["paitd-004-point-in-time-memberships"]
roleKindQuerystring enumNoOptional role filter. roleKind codes: student, parent, guardian, relative, guide, staff, administrator. Send the code, never a prose role label.["paitd-004-point-in-time-memberships"]
filter, sort, limit, cursor, modifiedSinceQuerynot acceptedRejected if sentThis relationship read is not a pageable collection scan. Send only asOfDate and optional roleKind; unsupported query controls return people_orgs:unsupported_query_parameter. Use /place_memberships or /people when the job needs collection filtering, sorting, paging, or modifiedSince polling.["paitd-103-query-model","paitd-108-error-envelope"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponsePerson[] plus data[].membershipYesPeople with active membership in the place. Each row carries the membership evidence that made the person active.["paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-person
data[].person_idResponsestringYesStable person id to store and use as the student-grain key.["paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
data[].membershipResponsePlaceMembershipYesMembership row that made the person active for this answer.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-place-membership
countResponseintegerYesNumber of returned membership-grain rows.["paitd-103-query-model"]
links.dataDictionaryResponseURLYesStable link to the person dictionary entry.["paitd-010-alias-map-contract"]
links.customerWebsiteResponseURLYesStable link back to this endpoint contract.["paitd-102-read-shape"]

schemaTables

titlerows
Person fields returned in data[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-017-reality-flag","paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-tenant-id"},{"name":"person_id","location":"Response","type":"string","required":"Yes","description":"Stable TimeBack person id for one roster human. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.person). Example: \"person_ada_lovelace\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id"},{"name":"source_status","location":"Response","type":"string enum","required":"Conditional","description":"OneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: \"active\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-status"},{"name":"source_updated_at","location":"Response","type":"ISO 8601 datetime","required":"Conditional","description":"Source-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: \"2026-08-15T13:45:30.000Z\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-source-updated-at"},{"name":"reality","location":"Response","type":"real | test | synthetic","required":"Yes","description":"Typed reality classification for this person. Ordinary reports default to reality=real so test and synthetic people never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: \"real\". Source: Alpha extend.","trace":["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-reality"},{"name":"is_enabled","location":"Response","type":"boolean","required":"Yes","description":"Whether the source system says this person's account is enabled. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-is-enabled"},{"name":"username","location":"Response","type":"string","required":"Yes","description":"Roster username for the person. Range: 1 to 255 visible characters. It is not a password. Example: \"ada.lovelace\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-username"},{"name":"first_name","location":"Response","type":"string","required":"Yes","description":"Legal or source first name. Range: 1 to 200 visible characters. Example: \"Ada\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-first-name"},{"name":"last_name","location":"Response","type":"string","required":"Yes","description":"Legal or source family name. Range: 1 to 200 visible characters. Example: \"Lovelace\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-last-name"},{"name":"middle_name","location":"Response","type":"string","required":"No","description":"Legal or source middle name. Range: 0 to 200 visible characters. Example: \"Byron\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-middle-name"},{"name":"preferred_first_name","location":"Response","type":"string","required":"No","description":"Preferred first name. Range: 0 to 200 visible characters. Example: \"Ada\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-first-name"},{"name":"preferred_last_name","location":"Response","type":"string","required":"No","description":"Preferred family name. Range: 0 to 200 visible characters. Example: \"Lovelace\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-preferred-last-name"},{"name":"email","location":"Response","type":"email string","required":"No","description":"Contact email visible only to scopes allowed for this relationship. Range: 0 to 320 characters, parseable as email when supplied. Example: \"ada@example.edu\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-email"},{"name":"sms","location":"Response","type":"string","required":"No","description":"SMS contact address supplied by the source. Range: 0 to 80 visible characters. Example: \"+15550101010\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-sms"},{"name":"phone","location":"Response","type":"string","required":"No","description":"Phone contact supplied by the source. Range: 0 to 80 visible characters. Example: \"+15550101010\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-009-sensitive-profile-privacy"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-phone"},{"name":"family_or_agent_person_ids","location":"Response","type":"array of person ids","required":"No","description":"Explicit OneRoster agent relationships such as parent or guardian links. Range: Each id is 1 to 255 printable characters and must reference a person in the same tenant when supplied. Example: [\"person_grace_hopper\"]. Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-family-or-agent-person-ids"},{"name":"grade_levels","location":"Response","type":"array of grade_level integers","required":"No","description":"Source grade values folded to the Alpha grade_level closed enum at write time. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Live aliases PK->-1, K->0, 4TH_GRADE/Grade_4->4 fold at write time. Example: [7]. Source: Alpha rename+restrict.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-007-tenure-and-grade-context"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-grade-levels"},{"name":"primary_place_id","location":"Response","type":"place id","required":"No","description":"Source primary organization for the person, expressed as an Alpha place id. Range: 1 to 255 printable characters when supplied. Example: \"place_north_valley_school\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-002-person-vocabulary","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-primary-place-id"},{"name":"admission_date","location":"Response","type":"date","required":"Conditional","description":"Date the student joined the school or program for tenure calculations. Range: ISO 8601 date YYYY-MM-DD. Example: \"2025-08-18\". Source: Alpha extend.","trace":["paitd-017-reality-flag","paitd-007-tenure-and-grade-context"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-admission-date"},{"name":"age_grade","location":"Response","type":"grade_level integer","required":"Conditional","description":"Canonical age-grade context folded at write time from source grade aliases. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.","trace":["paitd-017-reality-flag","paitd-018-over-time-history","paitd-007-tenure-and-grade-context"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-age-grade"}]
PlaceMembership fields returned in data[].membership[{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-tenant-id"},{"name":"membership_id","location":"Response","type":"string","required":"Yes","description":"Stable id for one person's dated role in one place. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place_membership). Example: \"pm_person_ada_place_school_student_2026\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-membership-id"},{"name":"person_id","location":"Response","type":"person id","required":"Yes","description":"Person who holds the role. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-person-id"},{"name":"place_id","location":"Response","type":"place id","required":"Yes","description":"Place where the role applies. Range: 1 to 255 printable characters. Example: \"place_timeback_school\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-place-id"},{"name":"role_kind","location":"Response","type":"string enum","required":"Yes","description":"Canonical role enum with a maintained alias fold; never parsed from names or titles. Allowed values: student, parent, guardian, relative, guide, staff, administrator. Range: One of the canonical role_kind values. Example: \"guide\". Source: Alpha rename+restrict.","trace":["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-kind"},{"name":"role_priority","location":"Response","type":"primary | secondary","required":"No","description":"Primary or secondary role marker. Allowed values: primary, secondary. Range: primary or secondary. Example: \"primary\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-priority"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Exclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-is-time-locatable"},{"name":"profile_id","location":"Response","type":"string","required":"No","description":"Optional non-secret profile reference. Range: 1 to 255 printable characters when supplied. Example: \"profile_canvas_001\". Source: Alpha rename+restrict.","trace":["paitd-008-app-credentials","paitd-009-sensitive-profile-privacy"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-profile-id"}]
traces
[
  "paitd-002-person-vocabulary",
  "paitd-004-point-in-time-memberships",
  "paitd-102-read-shape"
]

GET /people/{personId}/guardians

Lists a student's guardian contacts and relationship evidence without asking the client to parse Ed-Fi descriptors or join Contact records.

id
endpoint-list-student-guardians
operation
listStudentGuardians
auth
people_orgs:read + agentOf/student relationship scope
fieldRows

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and relationship-scoped access to the student or administrative roster access.["paitd-106-auth-shape"]
personIdPathstringYesStudent person id.["paitd-002-person-vocabulary","paitd-013-guardian-views"]
relationshipKindQuerystring enumNoOptional relationship filter such as guardian, parent, relative, or emergency_contact.["paitd-013-guardian-views"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
student_person_idResponsestringYesStudent id from the path.["paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
guardians[]ResponseGuardian[]YesGuardian contacts resolved from canonical, non-deleted Ed-Fi Contact records.["paitd-012-edfi-second-upstream","paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-guardian-view
relationships[]ResponseGuardianRelationship[]YesRelationship rows that explain why each guardian is linked to the student.["paitd-013-guardian-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-guardian-relationship-view
links.dataDictionaryResponseURLYesStable link to the guardian relationship dictionary entry.["paitd-010-alias-map-contract"]
links.customerWebsiteResponseURLYesStable link back to this endpoint contract.["paitd-102-read-shape"]

schemaTables

titlerows
Guardian fields returned in guardians[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-tenant-id"},{"name":"guardian_id","location":"Response","type":"string","required":"Yes","description":"Tenant-scoped Ed-Fi local id for the canonical Contact record. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: \"guardian_contact_001\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-013-guardian-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-guardian-id"},{"name":"contact_unique_id","location":"Response","type":"string","required":"Conditional","description":"Ed-Fi contact unique id. Range: Ed-Fi ContactUniqueId string. Example: \"contact-ada-family-001\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-013-guardian-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-contact-unique-id"},{"name":"full_name","location":"Response","type":"string","required":"Conditional","description":"Full legal name supplied by Ed-Fi Contact. Range: 1 to 240 visible characters when supplied. Example: \"Grace Hopper\". Source: Alpha Ed-Fi view.","trace":["paitd-013-guardian-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-full-name"},{"name":"email","location":"Response","type":"email string","required":"No","description":"Contact email, redacted by relationship-scoped authorization when required. Range: 0 to 320 characters, parseable as email when supplied. Example: \"grace.hopper@example.edu\". Source: Alpha Ed-Fi view.","trace":["paitd-013-guardian-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-email"},{"name":"phone","location":"Response","type":"string","required":"No","description":"Contact phone, redacted by relationship-scoped authorization when required. Range: 0 to 80 visible characters. Example: \"+15550101010\". Source: Alpha Ed-Fi view.","trace":["paitd-013-guardian-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-phone"},{"name":"language_codes","location":"Response","type":"array of strings","required":"No","description":"Communication languages from the Ed-Fi Contact payload. Range: Source language codes or descriptors normalized by Ed-Fi. Example: [\"en\",\"es\"]. Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-013-guardian-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-language-codes"},{"name":"source_updated_at","location":"Response","type":"ISO 8601 datetime","required":"Yes","description":"Canonical Ed-Fi record updated timestamp. Range: ISO 8601 UTC datetime. Example: \"2026-08-15T13:45:30.000Z\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-source-updated-at"},{"name":"is_deleted","location":"Response","type":"boolean","required":"Yes","description":"Always false in ordinary Alpha views; deleted contacts are visible only to authorized audit paths. Allowed values: true, false. Range: false in ordinary Alpha reads; true only on authorized audit paths. Example: false. Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-013-guardian-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-view-is-deleted"}]
GuardianRelationship fields returned in relationships[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-tenant-id"},{"name":"guardian_relationship_id","location":"Response","type":"string","required":"Yes","description":"Tenant-scoped Ed-Fi local id for the StudentContactAssociation record. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: \"guardian_rel_001\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-013-guardian-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-guardian-relationship-id"},{"name":"student_person_id","location":"Response","type":"person id","required":"Yes","description":"Student person id resolved through the platform3 sourcedId boundary. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-013-guardian-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-student-person-id"},{"name":"guardian_id","location":"Response","type":"guardian id","required":"Yes","description":"Contact id from the StudentContactAssociation payload, resolved to alpha.guardian_view when present. Range: 1 to 255 printable characters. Example: \"guardian_contact_001\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-013-guardian-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-guardian-id"},{"name":"relationship_kind","location":"Response","type":"string","required":"Conditional","description":"Governed Ed-Fi relation descriptor resolved to a stable plain value. Range: Resolved Ed-Fi Relation descriptor value; open governed code list. Example: \"guardian\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-013-guardian-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-relationship-kind"},{"name":"is_primary_contact","location":"Response","type":"boolean","required":"No","description":"Whether Ed-Fi marks this contact as primary. Allowed values: true, false. Range: true, false, or null. Example: true. Source: Alpha Ed-Fi view.","trace":["paitd-013-guardian-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-is-primary-contact"},{"name":"is_legal_guardian","location":"Response","type":"boolean","required":"No","description":"Whether Ed-Fi marks this contact as a legal guardian. Allowed values: true, false. Range: true, false, or null. Example: true. Source: Alpha Ed-Fi view.","trace":["paitd-013-guardian-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-is-legal-guardian"},{"name":"lives_with_student","location":"Response","type":"boolean","required":"No","description":"Whether the student lives with the contact. Allowed values: true, false. Range: true, false, or null. Example: false. Source: Alpha Ed-Fi view.","trace":["paitd-013-guardian-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-lives-with-student"},{"name":"is_emergency_contact","location":"Response","type":"boolean","required":"No","description":"Whether the contact is an emergency contact. Allowed values: true, false. Range: true, false, or null. Example: true. Source: Alpha Ed-Fi view.","trace":["paitd-013-guardian-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-is-emergency-contact"},{"name":"contact_priority","location":"Response","type":"integer","required":"No","description":"Preferred contact order. Range: Positive integer when supplied. Example: 1. Source: Alpha Ed-Fi view.","trace":["paitd-013-guardian-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-contact-priority"},{"name":"contact_restrictions","location":"Response","type":"array of strings, redacted when unauthorized","required":"No","description":"Contact restrictions; restricted/redacted by privacy rules. Range: Restriction text or descriptor values after privacy filtering. Example: [\"do_not_release_address\"]. Source: Alpha Ed-Fi view.","trace":["paitd-013-guardian-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-guardian-relationship-view-contact-restrictions"}]
traces
[
  "paitd-012-edfi-second-upstream",
  "paitd-013-guardian-views",
  "paitd-102-read-shape"
]

GET /people/{personId}/program_participations

Lists the programs a student belongs to at an asOfDate. Outcomes, eligibility formulas, and intervention effectiveness stay out of People & Orgs.

id
endpoint-list-student-programs
operation
listStudentPrograms
auth
people_orgs:read + student relationship scope
fieldRows

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and relationship-scoped access to the student or administrative roster access.["paitd-106-auth-shape"]
personIdPathstringYesStudent person id.["paitd-002-person-vocabulary"]
asOfDateQueryISO 8601 dateYesDate used to include only time-locatable active program participation rows.["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"]
programTypeQuerystringNoOptional Ed-Fi descriptor-resolved program type filter.["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
student_person_idResponsestringYesStudent id from the path.["paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
asOfDateResponseISO 8601 dateYesThe point-in-time date used for the answer.["paitd-004-point-in-time-memberships"]
program_participations[]ResponseProgramParticipation[]YesProgram belonging rows active at asOfDate.["paitd-015-program-participation-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-program-participation-view

schemaTables

titlerows
ProgramParticipation fields returned in program_participations[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-tenant-id"},{"name":"program_participation_id","location":"Response","type":"string","required":"Yes","description":"Tenant-scoped Ed-Fi local id for the program association. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: \"program_participation_001\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-participation-id"},{"name":"student_person_id","location":"Response","type":"person id","required":"Yes","description":"Student person id resolved through the platform3 sourcedId boundary. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-student-person-id"},{"name":"place_id","location":"Response","type":"place id","required":"Conditional","description":"School or education organization place id resolved through OneRoster. Range: 1 to 255 printable characters when supplied. Example: \"place_timeback_school\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-place-id"},{"name":"program_id","location":"Response","type":"string","required":"Conditional","description":"Program identifier from the linked Ed-Fi Program payload when present. Range: Ed-Fi ProgramId from the canonical payload. Example: \"program-special-education\". Source: Alpha Ed-Fi view.","trace":["paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-id"},{"name":"program_name","location":"Response","type":"string","required":"No","description":"Plain program name. Range: 0 to 240 visible characters. Example: \"Special Education\". Source: Alpha Ed-Fi view.","trace":["paitd-015-program-participation-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-name"},{"name":"program_type","location":"Response","type":"string","required":"Conditional","description":"Governed Ed-Fi program-type descriptor. Range: Resolved Ed-Fi ProgramType descriptor value; open governed code list. Example: \"Special Education\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-program-type"},{"name":"participation_status","location":"Response","type":"string","required":"No","description":"Governed participation-status descriptor. Range: Resolved Ed-Fi ProgramParticipationStatus descriptor value; open governed code list. Example: \"Participating\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-participation-status"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date the student becomes involved with the program. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha Ed-Fi view.","trace":["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Date the student exits the program; null means active after begin_date. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha Ed-Fi view.","trace":["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is present. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-004-point-in-time-memberships","paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-is-time-locatable"},{"name":"source_program_resource","location":"Response","type":"string enum","required":"Yes","description":"Exact Ed-Fi association/specialization that produced the row. Allowed values: GeneralStudentProgramAssociation, StudentProgramAssociation, SpecialEducationProgramAssociation, TitleIPartAProgramAssociation, EnglishLearnerProgramAssociation, Section504ProgramAssociation, FoodServiceProgramAssociation. Range: One of the Ed-Fi program-association resources exposed by PAITD-015. Example: \"GeneralStudentProgramAssociation\". Source: Alpha Ed-Fi view.","trace":["paitd-015-program-participation-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-program-participation-view-source-program-resource"}]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-015-program-participation-views",
  "paitd-102-read-shape"
]

GET /places/{placeId}/staff_assignments

Lists staff assignments active for a place at an asOfDate, with Ed-Fi staff classifications resolved by the surface.

id
endpoint-list-place-staff-assignments
operation
listPlaceStaffAssignments
auth
people_orgs:read + place/admin scope
fieldRows

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and place-scoped staff access.["paitd-106-auth-shape"]
placeIdPathstringYesPlace id.["paitd-003-place-nwea-boundary"]
asOfDateQueryISO 8601 dateYesDate used to include only time-locatable active staff assignment rows.["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"]
staffClassificationQuerystringNoOptional descriptor-resolved staff classification.["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
place_idResponsestringYesPlace id from the path.["paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-id
asOfDateResponseISO 8601 dateYesThe point-in-time date used for the answer.["paitd-004-point-in-time-memberships"]
staff_assignments[]ResponseStaffAssignment[]YesStaff assignment rows active at asOfDate.["paitd-014-staff-assignment-views"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-staff-assignment-view

schemaTables

titlerows
StaffAssignment fields returned in staff_assignments[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-tenant-id"},{"name":"staff_assignment_id","location":"Response","type":"string","required":"Yes","description":"Tenant-scoped Ed-Fi local id for the staff assignment. Range: Tenant-scoped Ed-Fi local id, 1 to 255 printable characters. Example: \"staff_assignment_001\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-staff-assignment-id"},{"name":"staff_person_id","location":"Response","type":"person id","required":"Yes","description":"Staff person id resolved through the platform3 sourcedId boundary. Range: 1 to 255 printable characters. Example: \"person_grace_hopper\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-staff-person-id"},{"name":"place_id","location":"Response","type":"place id","required":"Yes","description":"School or education organization place id resolved through OneRoster. Range: 1 to 255 printable characters. Example: \"place_timeback_school\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-place-id"},{"name":"staff_classification","location":"Response","type":"string","required":"Conditional","description":"Governed staff-classification descriptor. Range: Resolved Ed-Fi StaffClassification descriptor value; open governed code list. Example: \"Teacher\". Source: Alpha Ed-Fi view.","trace":["paitd-012-edfi-second-upstream","paitd-014-staff-assignment-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-staff-classification"},{"name":"position_title","location":"Response","type":"string","required":"No","description":"Human staff position title. Range: 0 to 200 visible characters. Example: \"Middle School Math Guide\". Source: Alpha Ed-Fi view.","trace":["paitd-014-staff-assignment-views","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-position-title"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date the assignment becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha Ed-Fi view.","trace":["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Date the assignment ends; null means active after begin_date. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha Ed-Fi view.","trace":["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is present; consumers do not infer from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-004-point-in-time-memberships","paitd-014-staff-assignment-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-is-time-locatable"},{"name":"assignment_order","location":"Response","type":"integer","required":"No","description":"Primary/secondary assignment order when supplied. Range: Positive integer when supplied. Example: 1. Source: Alpha Ed-Fi view.","trace":["paitd-014-staff-assignment-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-assignment-order"},{"name":"full_time_equivalency","location":"Response","type":"number","required":"No","description":"Ratio of expected work time for the assignment. Range: 0.0 to 1.0 unless source policy documents another bound. Example: 1. Source: Alpha Ed-Fi view.","trace":["paitd-014-staff-assignment-views"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-staff-assignment-view-full-time-equivalency"}]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-014-staff-assignment-views",
  "paitd-102-read-shape"
]

GET /places/{placeId}/schools

Lists school places under one district place. For NWEA, the district place is the Brand x Modality account boundary.

id
endpoint-list-district-schools
operation
listDistrictSchools
auth
people_orgs:read
fieldRows

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and place-scoped access.["paitd-106-auth-shape"]
placeIdPathstringYesDistrict place id.["paitd-003-place-nwea-boundary"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
districtResponsePlaceYesThe Brand x Modality district account.["paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-place
schools[]ResponsePlace[]YesSchools whose parent_place_id points at the district.["paitd-003-place-nwea-boundary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-place

schemaTables

titlerows
Place fields returned in district and schools[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-017-reality-flag","paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-tenant-id"},{"name":"place_id","location":"Response","type":"string","required":"Yes","description":"Stable place id for a school, district, level, department, or NWEA account. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place). Example: \"place_timeback_physical_district\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-id"},{"name":"source_status","location":"Response","type":"string enum","required":"Conditional","description":"OneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: \"active\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-status"},{"name":"source_updated_at","location":"Response","type":"ISO 8601 datetime","required":"Conditional","description":"Source-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: \"2026-08-15T13:45:30.000Z\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-source-updated-at"},{"name":"reality","location":"Response","type":"real | test | synthetic","required":"Yes","description":"Typed reality classification for this place. Ordinary reports default to reality=real so test and synthetic schools or districts never enter customer answers. Allowed values: real, test, synthetic. Range: Closed values: real, test, synthetic. Example: \"real\". Source: Alpha extend.","trace":["paitd-017-reality-flag","paitd-103-query-model","paitd-111-privacy-retention","paitd-011-storage-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-reality"},{"name":"name","location":"Response","type":"string","required":"Yes","description":"Human-readable place name. Range: 1 to 255 visible characters. Example: \"TimeBack Academy - Physical\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-name"},{"name":"place_kind","location":"Response","type":"string enum","required":"Yes","description":"Canonical place type. District and school are structural; tags refine them but never override them. Allowed values: department, school, district, local, state, national. Range: One of the allowed place_kind values. Example: \"district\". Source: Alpha rename+restrict.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-place-kind"},{"name":"public_identifier","location":"Response","type":"string","required":"No","description":"Human-readable public identifier such as NCES id. Range: 0 to 255 visible characters. Example: \"NCES-123456\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-public-identifier"},{"name":"parent_place_id","location":"Response","type":"place id","required":"Conditional","description":"Parent place in the stock OneRoster tree. Range: 1 to 255 printable characters when supplied. Example: \"place_timeback_physical_district\". Source: Alpha rename.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-parent-place-id"},{"name":"nwea_district_id","location":"Response","type":"string","required":"Conditional","description":"The NWEA district/account id for exactly one Brand x Modality account. Range: NWEA account/district id supplied by the NWEA account setup. Example: \"nwea-district-physical-001\". Source: Alpha extend.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-nwea-district-id"},{"name":"brand","location":"Response","type":"string enum","required":"Conditional","description":"Locked reporting tag for the brand half of the Brand x Modality NWEA account boundary. Allowed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Range: Closed values: 100for100, alpha, gt, limitless_education, montessorium, nextgen, nova_academy, novatio, sw_sales, texas_sports_academy, towermath, unbound, waypoint. Example: \"alpha\". Source: Alpha extend.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-brand"},{"name":"modality","location":"Response","type":"physical | virtual","required":"Conditional","description":"Locked reporting tag for the modality half of the Brand x Modality NWEA account boundary. Allowed values: physical, virtual. Range: physical or virtual only. Example: \"physical\". Source: Alpha extend.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-modality"},{"name":"segment","location":"Response","type":"string enum","required":"Conditional","description":"Closed reporting segment for school and district grouping. Allowed values: charter, private, sw_sales, virtual, mixed. Range: Closed values: charter, private, sw_sales, virtual, mixed. Example: \"private\". Source: Alpha extend.","trace":["paitd-017-reality-flag","paitd-003-place-nwea-boundary","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-segment"},{"name":"level","location":"Response","type":"WL | LL | L1 | L2 | MS | HS","required":"Conditional","description":"Locked school-level reporting tag for school and program cohort slices. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed locked school-level values: WL, LL, L1, L2, MS, HS. The list is seeded in alpha.tag_definition where tag_key=level and anchor=school. Example: \"MS\". Source: Alpha extend.","trace":["paitd-017-reality-flag","paitd-006-tag-registry","paitd-003-place-nwea-boundary"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-level"}]
traces
[
  "paitd-003-place-nwea-boundary",
  "paitd-102-read-shape"
]

GET /school_periods/{periodId}/active_memberships

Lists active memberships inside a typed school period without parsing period titles.

id
endpoint-list-school-period-memberships
operation
listSchoolPeriodMemberships
auth
people_orgs:read
fieldRows

requestRows

namelocationtyperequireddescriptiontrace
AuthorizationHeaderBearer JWTYesToken must include tenant and relationship-scoped roster access.["paitd-106-auth-shape"]
periodIdPathstringYesSchool period id.["paitd-005-school-periods"]
asOfDateQueryISO 8601 dateYesDate within the school period used for active membership answers.["paitd-004-point-in-time-memberships"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
asOfDateResponseISO 8601 dateYesThe point-in-time date used for the answer.["paitd-004-point-in-time-memberships"]
school_periodResponseSchoolPeriodYesTyped school period.["paitd-005-school-periods"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-school-period
place_memberships[]ResponsePlaceMembership[]YesDated place memberships active at asOfDate.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-place-membership
class_memberships[]ResponseClassMembership[]YesDated class memberships active at asOfDate.["paitd-004-point-in-time-memberships"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#table-alpha-class-membership

schemaTables

titlerows
SchoolPeriod fields returned in school_period[{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-tenant-id"},{"name":"period_id","location":"Response","type":"string","required":"Yes","description":"Stable school period id. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.school_period). Example: \"period_2026_2027_school_year\". Source: Alpha rename.","trace":["paitd-005-school-periods","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-id"},{"name":"source_status","location":"Response","type":"string enum","required":"Conditional","description":"OneRoster lifecycle marker preserved for provenance. Allowed values: active, tobedeleted. Range: active or tobedeleted. Example: \"active\". Source: Alpha rename.","trace":["paitd-005-school-periods","paitd-111-privacy-retention"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-status"},{"name":"source_updated_at","location":"Response","type":"ISO 8601 datetime","required":"Conditional","description":"Source-system modified timestamp for modifiedSince scans. Range: ISO 8601 UTC datetime. Example: \"2026-08-15T13:45:30.000Z\". Source: Alpha rename.","trace":["paitd-005-school-periods","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-source-updated-at"},{"name":"title","location":"Response","type":"string","required":"Yes","description":"Human title for the period. Range: 1 to 255 visible characters. Example: \"2026-2027 School Year\". Source: Alpha rename.","trace":["paitd-005-school-periods"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-title"},{"name":"period_kind","location":"Response","type":"string enum","required":"Yes","description":"Canonical period type; consumers never parse the title. Allowed values: school_year, semester, term, grading_period. Range: school_year, semester, term, or grading_period. Example: \"school_year\". Source: Alpha rename+restrict.","trace":["paitd-005-school-periods"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-period-kind"},{"name":"start_date","location":"Response","type":"date","required":"Yes","description":"Inclusive period start date. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha rename.","trace":["paitd-005-school-periods"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-start-date"},{"name":"end_date","location":"Response","type":"date","required":"Yes","description":"Exclusive period end date. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha rename.","trace":["paitd-005-school-periods"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-end-date"},{"name":"parent_period_id","location":"Response","type":"period id","required":"No","description":"Parent period relationship. Range: 1 to 255 printable characters when supplied. Example: \"period_2026_2027_school_year\". Source: Alpha rename.","trace":["paitd-005-school-periods"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-parent-period-id"},{"name":"school_year","location":"Response","type":"integer","required":"Yes","description":"Typed school-year value, not a string parsed from title. Range: Four-digit ending year, such as 2027. Example: 2027. Source: Alpha rename.","trace":["paitd-005-school-periods"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-school-period-school-year"}]
PlaceMembership fields returned in place_memberships[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-tenant-id"},{"name":"membership_id","location":"Response","type":"string","required":"Yes","description":"Stable id for one person's dated role in one place. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.place_membership). Example: \"pm_person_ada_place_school_student_2026\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-membership-id"},{"name":"person_id","location":"Response","type":"person id","required":"Yes","description":"Person who holds the role. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-person-id"},{"name":"place_id","location":"Response","type":"place id","required":"Yes","description":"Place where the role applies. Range: 1 to 255 printable characters. Example: \"place_timeback_school\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-place-id"},{"name":"role_kind","location":"Response","type":"string enum","required":"Yes","description":"Canonical role enum with a maintained alias fold; never parsed from names or titles. Allowed values: student, parent, guardian, relative, guide, staff, administrator. Range: One of the canonical role_kind values. Example: \"guide\". Source: Alpha rename+restrict.","trace":["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-kind"},{"name":"role_priority","location":"Response","type":"primary | secondary","required":"No","description":"Primary or secondary role marker. Allowed values: primary, secondary. Range: primary or secondary. Example: \"primary\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-role-priority"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Exclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-is-time-locatable"},{"name":"profile_id","location":"Response","type":"string","required":"No","description":"Optional non-secret profile reference. Range: 1 to 255 printable characters when supplied. Example: \"profile_canvas_001\". Source: Alpha rename+restrict.","trace":["paitd-008-app-credentials","paitd-009-sensitive-profile-privacy"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-place-membership-profile-id"}]
ClassMembership fields returned in class_memberships[][{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-tenant-id"},{"name":"membership_id","location":"Response","type":"string","required":"Yes","description":"Stable id for one person's dated membership in one learning group. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.class_membership). Example: \"cm_alg1_ada_student_2026\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-membership-id"},{"name":"person_id","location":"Response","type":"person id","required":"Yes","description":"Person in the learning group. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id"},{"name":"school_id","location":"Response","type":"place id","required":"Yes","description":"School place for the membership. Range: 1 to 255 printable characters. Example: \"place_timeback_school\". Source: Alpha rename+restrict.","trace":["paitd-003-place-nwea-boundary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-school-id"},{"name":"learning_group_id","location":"Response","type":"string","required":"Yes","description":"OneRoster class id retained as a real relationship column. Range: 1 to 255 printable characters. Example: \"class_algebra_1_a\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-learning-group-id"},{"name":"role_kind","location":"Response","type":"string enum","required":"Yes","description":"Canonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: \"student\". Source: Alpha rename+restrict.","trace":["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-role-kind"},{"name":"is_primary_guide","location":"Response","type":"boolean","required":"No","description":"Primary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: \"false\". Source: Alpha rename+restrict.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-primary-guide"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Exclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-time-locatable"}]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-005-school-periods",
  "paitd-102-read-shape"
]

GET /people/{personId}/alpha_level

Returns the student's Alpha level that is active at asOfDate from the surface-owned effective-dated history, not from a current-only field or a place name.

id
endpoint-named-alpha-level
operation
alphaLevel
auth
people_orgs:read + student relationship scope
fieldRows

requestRows

namelocationtyperequireddescriptiontracefieldHref
AuthorizationHeaderBearer JWTYesToken must include tenant and relationship-scoped access to the student or administrative roster access.["paitd-106-auth-shape"]
personIdPathstringYesStudent person id.["paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
asOfDateQueryISO 8601 dateYesDate used to select the active Alpha-level interval. begin_date null excludes the row; end_date null means still active after begin_date.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
person_idResponsestringYesStudent person id.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-person-id
alpha_levelResponseenumYesAlpha level active at asOfDate.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-alpha-level
begin_dateResponseISO 8601 dateYesInclusive start date for the selected interval.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-begin-date
end_dateResponseISO 8601 date or nullYesExclusive end date for the selected interval; null means still active.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is present, so consumers never infer the null rule.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-is-time-locatable
links.dataDictionaryResponseURLYesStable link to the named-query and history-table dictionary entries.["paitd-010-alias-map-contract"]

schemaTables

titlerows
AlphaLevelHistory source fields[{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-018-over-time-history","paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-tenant-id"},{"name":"history_id","location":"Response","type":"string","required":"Yes","description":"Stable id for one Alpha-level history interval. Range: 1 to 255 printable characters, unique within tenant. Example: \"alpha_level_hist_ada_2026_ms\". Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-history-id"},{"name":"person_id","location":"Response","type":"person id","required":"Yes","description":"The student person whose Alpha level this interval describes. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-person-id"},{"name":"alpha_level","location":"Response","type":"WL | LL | L1 | L2 | MS | HS","required":"Yes","description":"Canonical Alpha level for this student's effective-dated interval. Allowed values: WL, LL, L1, L2, MS, HS. Glossary: WL=WonderLab, the pre-K Alpha level. LL=Lower Elementary (LearningLab), the K-1 Alpha level. L1=Level 1, the grade 2-3 Alpha level after live cohort confirmation. L2=Level 2, the grade 4-5 Alpha level after live cohort confirmation. MS=Middle School, the grade 6-8 Alpha level. HS=High School, the grade 9-12 Alpha level. Range: Closed values: WL, LL, L1, L2, MS, HS. Example: \"MS\". Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-alpha-level"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date when this Alpha-level interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Exclusive date when this Alpha-level interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-alpha-level-history-is-time-locatable"}]
traces
[
  "paitd-018-over-time-history",
  "paitd-017-reality-flag",
  "paitd-004-point-in-time-memberships",
  "paitd-007-tenure-and-grade-context",
  "paitd-103-query-model"
]

GET /people/{personId}/age_grade

Returns the student's age-grade active at asOfDate from the effective-dated age-grade history, without mixing it with Results working grade.

id
endpoint-named-age-grade
operation
ageGrade
auth
people_orgs:read + student relationship scope
fieldRows

requestRows

namelocationtyperequireddescriptiontracefieldHref
AuthorizationHeaderBearer JWTYesToken must include tenant and relationship-scoped access to the student or administrative roster access.["paitd-106-auth-shape"]
personIdPathstringYesStudent person id.["paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
asOfDateQueryISO 8601 dateYesDate used to select the active age-grade interval.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
person_idResponsestringYesStudent person id.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-person-id
age_gradeResponseintegerYesAge-grade active at asOfDate; this is not Results working grade.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-age-grade
begin_dateResponseISO 8601 dateYesInclusive start date for the selected interval.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-begin-date
end_dateResponseISO 8601 date or nullYesExclusive end date for the selected interval; null means still active.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-end-date
is_time_locatableResponsebooleanYesTrue only when begin_date is present, so consumers never infer the null rule.["paitd-018-over-time-history","paitd-017-reality-flag","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-is-time-locatable
links.dataDictionaryResponseURLYesStable link to the named-query and history-table dictionary entries.["paitd-010-alias-map-contract"]

schemaTables

titlerows
AgeGradeHistory source fields[{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-018-over-time-history","paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-tenant-id"},{"name":"history_id","location":"Response","type":"string","required":"Yes","description":"Stable id for one age-grade history interval. Range: 1 to 255 printable characters, unique within tenant. Example: \"age_grade_hist_ada_2026_7\". Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-011-storage-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-history-id"},{"name":"person_id","location":"Response","type":"person id","required":"Yes","description":"The student person whose age-grade context this interval describes. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-002-person-vocabulary","paitd-004-point-in-time-memberships","paitd-011-storage-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-person-id"},{"name":"age_grade","location":"Response","type":"grade_level integer","required":"Yes","description":"Canonical age-grade context for this student's effective-dated interval. Allowed values: -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12. Range: Closed grade_level values: -1 for PreK, 0 for K, and 1 through 12. Example: 7. Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-007-tenure-and-grade-context","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-age-grade"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date when this age-grade interval becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Exclusive date when this age-grade interval stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha extend.","trace":["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is non-null; consumers filter on this instead of guessing from nulls. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-018-over-time-history","paitd-004-point-in-time-memberships","paitd-103-query-model"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-age-grade-history-is-time-locatable"}]
traces
[
  "paitd-018-over-time-history",
  "paitd-017-reality-flag",
  "paitd-004-point-in-time-memberships",
  "paitd-007-tenure-and-grade-context",
  "paitd-103-query-model"
]

GET /people/{personId}/enrollment_anchors/first_single_grade

Returns the first date a student entered a single-grade learning group for a subject, using surface-owned subject and grade context instead of parsing course titles.

id
endpoint-named-first-single-grade-enrollment-date
operation
firstSingleGradeEnrollmentDate
auth
people_orgs:read + student relationship scope
fieldRows

requestRows

namelocationtyperequireddescriptiontracefieldHref
AuthorizationHeaderBearer JWTYesToken must include tenant and relationship-scoped access to the student or administrative roster access.["paitd-106-auth-shape"]
personIdPathstringYesStudent person id.["paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
subjectQuerymath | reading | language | science | vocabulary | writingYesSubject whose first single-grade enrollment anchor is requested. Subject and single-grade context come from the surface-owned typed context, never a parsed class title. Public reads accept only canonical lowercase Alpha subject ids; display/source aliases such as Math or Mathematics are invalid here.["paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
person_idResponsestringYesStudent person id.["paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
subjectResponsestringYesSubject used for the anchor.["paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]
grade_levelResponseintegerYesSingle grade level associated with the anchor; the surface owns this result so clients do not parse class titles.["paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]
first_single_grade_enrollment_dateResponseISO 8601 dateYesEarliest begin_date for a qualifying single-grade enrollment.["paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date
evidence_membership_idResponsestringYesClass membership row that proves the anchor.["paitd-004-point-in-time-memberships","paitd-007-tenure-and-grade-context","paitd-103-query-model"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-membership-id
links.dataDictionaryResponseURLYesStable link to the named-query and class-membership dictionary entries.["paitd-010-alias-map-contract"]

schemaTables

titlerows
ClassMembership evidence fields[{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-tenant-id"},{"name":"membership_id","location":"Response","type":"string","required":"Yes","description":"Stable id for one person's dated membership in one learning group. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.class_membership). Example: \"cm_alg1_ada_student_2026\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-membership-id"},{"name":"person_id","location":"Response","type":"person id","required":"Yes","description":"Person in the learning group. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id"},{"name":"school_id","location":"Response","type":"place id","required":"Yes","description":"School place for the membership. Range: 1 to 255 printable characters. Example: \"place_timeback_school\". Source: Alpha rename+restrict.","trace":["paitd-003-place-nwea-boundary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-school-id"},{"name":"learning_group_id","location":"Response","type":"string","required":"Yes","description":"OneRoster class id retained as a real relationship column. Range: 1 to 255 printable characters. Example: \"class_algebra_1_a\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-learning-group-id"},{"name":"role_kind","location":"Response","type":"string enum","required":"Yes","description":"Canonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: \"student\". Source: Alpha rename+restrict.","trace":["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-role-kind"},{"name":"is_primary_guide","location":"Response","type":"boolean","required":"No","description":"Primary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: \"false\". Source: Alpha rename+restrict.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-primary-guide"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Exclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-time-locatable"}]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-007-tenure-and-grade-context",
  "paitd-103-query-model"
]

GET /guides/{guidePersonId}/students

Returns students attached to a guide at asOfDate by joining active guide and student class memberships on learning group and school.

id
endpoint-named-students-for-guide
operation
studentsForGuide
auth
people_orgs:read + guide relationship scope
fieldRows

requestRows

namelocationtyperequireddescriptiontracefieldHref
AuthorizationHeaderBearer JWTYesToken must include tenant and guide/class scoped roster access.["paitd-106-auth-shape"]
guidePersonIdPathstringYesGuide person id.["paitd-002-person-vocabulary"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-person-person-id
asOfDateQueryISO 8601 dateYesDate used for both guide and student active membership windows.["paitd-004-point-in-time-memberships","paitd-102-read-shape","paitd-103-query-model","paitd-106-auth-shape"]

responseRows

namelocationtyperequireddescriptiontracefieldHref
data[]ResponseGuideStudent[]YesOne row per active student/learning-group link for the guide.["paitd-004-point-in-time-memberships","paitd-102-read-shape","paitd-103-query-model","paitd-106-auth-shape"]
data[].guide_person_idResponsestringYesGuide person id from the path.["paitd-004-point-in-time-memberships","paitd-102-read-shape","paitd-103-query-model","paitd-106-auth-shape"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id
data[].student_person_idResponsestringYesStudent person id attached to the guide.["paitd-004-point-in-time-memberships","paitd-102-read-shape","paitd-103-query-model","paitd-106-auth-shape"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id
data[].learning_group_idResponsestringYesShared learning group that links guide and student.["paitd-004-point-in-time-memberships","paitd-102-read-shape","paitd-103-query-model","paitd-106-auth-shape"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-learning-group-id
data[].school_idResponsestringYesSchool id shared by the guide and student memberships.["paitd-004-point-in-time-memberships","paitd-102-read-shape","paitd-103-query-model","paitd-106-auth-shape"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-school-id
data[].begin_dateResponseISO 8601 dateYesActive interval start for the student membership evidence.["paitd-004-point-in-time-memberships","paitd-102-read-shape","paitd-103-query-model","paitd-106-auth-shape"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date
data[].end_dateResponseISO 8601 date or nullYesActive interval end for the student membership evidence.["paitd-004-point-in-time-memberships","paitd-102-read-shape","paitd-103-query-model","paitd-106-auth-shape"]https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-end-date
links.dataDictionaryResponseURLYesStable link to the named-query and class-membership dictionary entries.["paitd-010-alias-map-contract"]

schemaTables

titlerows
ClassMembership evidence fields[{"name":"tenant_id","location":"Response","type":"Hidden in ordinary Alpha responses; selected from the verified JWT.","required":"Yes","description":"The tenant boundary that owns this People & Orgs row. Range: Valid PostgreSQL UUID. Example: \"0d4ce2f4-1c42-4f3c-9f0d-03fb7f5271d3\". Source: Alpha inherited.","trace":["paitd-109-tenant-routing"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-tenant-id"},{"name":"membership_id","location":"Response","type":"string","required":"Yes","description":"Stable id for one person's dated membership in one learning group. Range: 1 to 255 printable characters, unique within (tenant_id, alpha.class_membership). Example: \"cm_alg1_ada_student_2026\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-010-alias-map-contract"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-membership-id"},{"name":"person_id","location":"Response","type":"person id","required":"Yes","description":"Person in the learning group. Range: 1 to 255 printable characters. Example: \"person_ada_lovelace\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-person-id"},{"name":"school_id","location":"Response","type":"place id","required":"Yes","description":"School place for the membership. Range: 1 to 255 printable characters. Example: \"place_timeback_school\". Source: Alpha rename+restrict.","trace":["paitd-003-place-nwea-boundary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-school-id"},{"name":"learning_group_id","location":"Response","type":"string","required":"Yes","description":"OneRoster class id retained as a real relationship column. Range: 1 to 255 printable characters. Example: \"class_algebra_1_a\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships","paitd-006-tag-registry"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-learning-group-id"},{"name":"role_kind","location":"Response","type":"string enum","required":"Yes","description":"Canonical enrollment role: student, guide, proctor, or administrator. Allowed values: student, guide, proctor, administrator. Range: student, guide, proctor, or administrator. Example: \"student\". Source: Alpha rename+restrict.","trace":["paitd-002-person-vocabulary","paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-role-kind"},{"name":"is_primary_guide","location":"Response","type":"boolean","required":"No","description":"Primary-teacher marker, valid only for guide rows. Allowed values: true, false. Range: true, false, or null. Example: \"false\". Source: Alpha rename+restrict.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-primary-guide"},{"name":"begin_date","location":"Response","type":"date","required":"No","description":"Inclusive date when the membership becomes locatable. Range: ISO 8601 date YYYY-MM-DD. Example: \"2026-08-15\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-begin-date"},{"name":"end_date","location":"Response","type":"date","required":"No","description":"Exclusive date when the membership stops being active. Range: ISO 8601 date YYYY-MM-DD. Example: \"2027-06-01\". Source: Alpha rename.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-end-date"},{"name":"is_time_locatable","location":"Response","type":"boolean","required":"Yes","description":"True only when begin_date is non-null. Allowed values: true, false. Range: true or false. Example: true. Source: Alpha derived view field.","trace":["paitd-004-point-in-time-memberships"],"fieldHref":"https://platform3-andymontgomery-9773s-projects.vercel.app/people_and_orgs/alpha/data_dictionary#field-alpha-class-membership-is-time-locatable"}]
traces
[
  "paitd-004-point-in-time-memberships",
  "paitd-102-read-shape",
  "paitd-103-query-model",
  "paitd-106-auth-shape"
]