Skip to content

Partner API

Assessments

Endpoint reference for listing and retrieving educators' completed assessments.

Audience: developers building an integration against the Master Teacher platform.

Endpoint reference for the ax resource. Both endpoints require a bearer token — see Authentication.

GET /api/v1/ax/assessments

Returns completed assessments for the organizations and assessments your integration covers, filtered, sorted, and paginated by the parameters below.

Terminal window
curl "https://api.masterteacher.net/api/v1/ax/assessments?page=100&filter[start_date]=2026-01-01" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN"

These go at the top level of the query string.

ParameterTypeDefaultNotes
pageinteger50Page size, not page number. Values above 100 are silently reduced to 100.
offsetinteger0Number of records to skip. This is how you move through pages.
sortstringcertified_onOne of certified_on, user_name, proctor_name, product_name.
orderstringASCASC or DESC. Case-insensitive; anything else falls back to ASC.

The page parameter is the single most common source of confusion in this API: it sets how many records come back, not which page you’re on. Use offset to advance. An unrecognised sort value falls back to the default sort rather than erroring.

Filters are nested under filter. Send arrays with repeated bracketed keys — filter[product_ids][]=12&filter[product_ids][]=15.

FilterTypeMatches
filter[search]stringCase-insensitive partial match on assessment name, first name, or last name. A two-word value is also matched as “first last”.
filter[start_date]dateCompleted on or after this date, from the start of that day.
filter[end_date]dateCompleted on or before this date, through the end of that day.
filter[product_ids][]integer arraySpecific assessments.
filter[user_ids][]integer arraySpecific educators, by platform user ID.
filter[seids][]string arraySpecific educators, by State Educator ID.
filter[proctor_ids][]integer arraySpecific proctors, by platform user ID.
filter[organization_ids][]integer arrayEducators belonging to these organizations.
filter[user_record_status][]string arrayEducator record status: active, archived, or both.
filter[legacy_record][]boolean arraytrue for records migrated from a prior system, false for natively created ones, both for everything.

All filters combine with AND. Empty values are dropped, so sending a blank filter is the same as omitting it. Date filters are interpreted against the platform’s time zone and expanded to whole-day boundaries — filter[end_date]=2026-04-18 includes everything completed on 18 April.

Filters can only narrow your integration’s provisioned scope, never widen it. Passing an organization_ids your integration doesn’t cover returns nothing rather than an error.

filter[seids][] takes a batch of State Educator IDs, so you can ask for specific educators rather than pulling everything and matching afterwards.

Terminal window
curl -G "https://api.masterteacher.net/api/v1/ax/assessments" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
--data-urlencode "filter[seids][]=1234567" \
--data-urlencode "filter[seids][]=7654321" \
--data-urlencode "page=100"

A SEID you send can come back with nothing for three reasons: the educator has no completed assessments, they fall outside your integration’s scope, or no SEID was recorded on their record — a blank seid can’t match this filter even when the assessments exist. The response doesn’t distinguish them, so a gap tells you to look, not what to conclude.

That makes this filter best for checking specific educators rather than reconciling a large roster. If you need completeness, filter by organization and date instead and match on your side, so educators with no SEID still appear.

The 100-record cap applies here as anywhere else, so page through with offset.

{
"data": [
{
"id": 88212,
"seid": "1234567",
"name": "Dana Whitfield",
"first_name": "Dana",
"last_name": "Whitfield",
"email": "dana.whitfield@example.org",
"organization_id": 412,
"organization_name": "Riverbend Unified School District",
"assessment_name": "Classroom Management Assessment",
"certified_on": "2026-04-18",
"results": [
{
"assessment_id": 88213,
"assessment_name": "Classroom Management — Part 1",
"certified_on": "2026-03-02",
"proctor_id": 5501,
"proctor_name": "Alex Romero"
},
{
"assessment_id": 88214,
"assessment_name": "Classroom Management — Part 2",
"certified_on": "2026-04-18",
"proctor_id": 5501,
"proctor_name": "Alex Romero"
}
]
}
],
"meta": { "count": 1, "offset": 0, "page": 50 }
}

meta

FieldTypeMeaning
countintegerTotal records matching your filters, ignoring paging. Use this to drive a paging loop.
offsetintegerThe offset applied to this response.
pageintegerThe page size applied to this response, after the 100 cap.

Each record in data

FieldTypeMeaning
idintegerID of the overall assessment. Pass this to Retrieve one assessment.
seidstringState Educator ID. The educator’s state-issued identifier. May be null if it was never recorded for that educator.
namestringFull display name.
first_namestringGiven name, for your own display or matching.
last_namestringFamily name.
emailstringThe educator’s email address on the platform.
organization_idintegerID of the organization the assessment belongs to.
organization_namestringName of that organization.
assessment_namestringName of the assessment the educator completed.
certified_onstringDate the assessment was completed (YYYY-MM-DD).
resultsarrayThe individual parts behind it — see below.

An assessment can be made up of several separately proctored parts. When it is, the record describes the overall assessment and results lists each part. An assessment with no separate parts returns a single entry in results describing itself.

Either way results is always populated, so you can treat it uniformly:

FieldTypeMeaning
assessment_idintegerID of that individual part.
assessment_namestringName of that part.
certified_onstringDate that part was completed (YYYY-MM-DD).
proctor_idintegerID of the proctor who supervised that part.
proctor_namestringThat proctor’s name.

The top-level certified_on is the date the overall assessment was completed; the dates inside results are per-part and will often be earlier.

count tells you the size of the full result set, so a loop is straightforward:

Terminal window
# page size 100, advancing offset by 100 until offset >= count
curl "https://api.masterteacher.net/api/v1/ax/assessments?page=100&offset=0" -H "Authorization: Bearer $TOKEN"
curl "https://api.masterteacher.net/api/v1/ax/assessments?page=100&offset=100" -H "Authorization: Bearer $TOKEN"

For a stable full export, pin the sort (sort=certified_on&order=ASC) so records don’t shift between requests, and re-request an access token if a long run outlives its two-hour window.

GET /api/v1/ax/assessments/:id

Returns a single completed assessment, in the same field shape as one entry in data — but not wrapped in data, and with no meta:

{
"id": 88212,
"seid": "1234567",
"name": "Dana Whitfield",
"organization_id": 412,
"assessment_name": "Classroom Management Assessment",
"certified_on": "2026-04-18",
"results": [ ... ]
}

Use the id from a list response as the :id here.

One thing to watch: :id must be the ID of an overall assessment — the top-level id. The values inside results are assessment_ids identifying individual parts, and passing one of those returns 404. The two are easy to mix up because a single-part assessment’s results[0].assessment_id happens to equal its top-level id; that coincidence doesn’t hold once an assessment has parts.

StatusMeaning
401Missing, malformed, or expired access token. Request a new token and retry.
400Your integration has no organizations or assessments assigned — a provisioning issue. See Authentication.
404No assessment with that ID within your integration’s scope, or the ID identifies an individual part (a results[].assessment_id) rather than an overall assessment.

An empty data array with count: 0 is a successful response, not an error. It means your filters — or your integration’s provisioned scope — matched nothing.

  • Everything is read-only. GET is the only supported method.
  • One record per educator, per completed assessment. An educator who has completed three assessments appears three times.
  • Two kinds of ID. The top-level id identifies the overall assessment; results[].assessment_id identifies one part of it. Only the former works with GET /assessments/:id.
  • seid can be null. Don’t assume every record carries a State Educator ID; decide up front how your integration handles the gap.
  • Scope is invisible in the response. Nothing in the payload tells you which organizations or assessments your integration covers. If counts look wrong, confirm the provisioned scope before debugging your query.