Authenticate to the ODS/API using OAuth 2.0 client credentials flow: POST to /oauth/token with client_id and client_secret to receive a bearer token.
Map your local attendance codes to the target SEA's descriptor URIs (e.g., uri://ed-fi.org/AttendanceEventCategoryDescriptor#In Attendance) — obtain the full descriptor list from the SEA's /ed-fi/attendanceEventCategoryDescriptors endpoint.
POST each event to /ed-fi/studentSchoolAttendanceEvents with required fields: schoolReference, studentReference, sessionReference, attendanceEventDate, and attendanceEventCategoryDescriptor.
Include the optional attendanceEventReason string for excused/unexcused classifications when required by state specification.
Handle 409 Conflict responses by switching to PUT with the natural key in the path; use If-None-Match / ETag header pattern for optimistic concurrency when the SEA enforces it.
Confirm ingestion via GET /ed-fi/studentSchoolAttendanceEvents?studentUniqueId=...&eventDate=... and check for state-side validation errors in the SEA's error dashboard.
Known gotchas
Each SEA defines its own required descriptor values and may add state-specific extensions; never assume the standard Ed-Fi descriptor namespace is sufficient without checking the SEA's data specification document.
The attendanceEventDate plus schoolReference plus studentReference form the natural key — submitting the same date twice with different categories creates a 409; you must PUT to update, not POST again.
Token expiry is typically one hour; build automatic token refresh into your client rather than caching tokens across long batch runs.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp