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.
List assessments
Section titled “List assessments”GET /api/v1/ax/assessmentsReturns completed assessments for the organizations and assessments your integration covers, filtered, sorted, and paginated by the parameters below.
curl "https://api.masterteacher.net/api/v1/ax/assessments?page=100&filter[start_date]=2026-01-01" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"Paging and sorting parameters
Section titled “Paging and sorting parameters”These go at the top level of the query string.
| Parameter | Type | Default | Notes |
|---|---|---|---|
page | integer | 50 | Page size, not page number. Values above 100 are silently reduced to 100. |
offset | integer | 0 | Number of records to skip. This is how you move through pages. |
sort | string | certified_on | One of certified_on, user_name, proctor_name, product_name. |
order | string | ASC | ASC 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.
Filter parameters
Section titled “Filter parameters”Filters are nested under filter. Send arrays with repeated bracketed keys —
filter[product_ids][]=12&filter[product_ids][]=15.
| Filter | Type | Matches |
|---|---|---|
filter[search] | string | Case-insensitive partial match on assessment name, first name, or last name. A two-word value is also matched as “first last”. |
filter[start_date] | date | Completed on or after this date, from the start of that day. |
filter[end_date] | date | Completed on or before this date, through the end of that day. |
filter[product_ids][] | integer array | Specific assessments. |
filter[user_ids][] | integer array | Specific educators, by platform user ID. |
filter[seids][] | string array | Specific educators, by State Educator ID. |
filter[proctor_ids][] | integer array | Specific proctors, by platform user ID. |
filter[organization_ids][] | integer array | Educators belonging to these organizations. |
filter[user_record_status][] | string array | Educator record status: active, archived, or both. |
filter[legacy_record][] | boolean array | true 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.
Looking up a known list of educators
Section titled “Looking up a known list of educators”filter[seids][] takes a batch of State Educator IDs, so you can ask for specific educators rather than
pulling everything and matching afterwards.
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.
Response
Section titled “Response”{ "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
| Field | Type | Meaning |
|---|---|---|
count | integer | Total records matching your filters, ignoring paging. Use this to drive a paging loop. |
offset | integer | The offset applied to this response. |
page | integer | The page size applied to this response, after the 100 cap. |
Each record in data
| Field | Type | Meaning |
|---|---|---|
id | integer | ID of the overall assessment. Pass this to Retrieve one assessment. |
seid | string | State Educator ID. The educator’s state-issued identifier. May be null if it was never recorded for that educator. |
name | string | Full display name. |
first_name | string | Given name, for your own display or matching. |
last_name | string | Family name. |
email | string | The educator’s email address on the platform. |
organization_id | integer | ID of the organization the assessment belongs to. |
organization_name | string | Name of that organization. |
assessment_name | string | Name of the assessment the educator completed. |
certified_on | string | Date the assessment was completed (YYYY-MM-DD). |
results | array | The individual parts behind it — see below. |
How results works
Section titled “How results works”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:
| Field | Type | Meaning |
|---|---|---|
assessment_id | integer | ID of that individual part. |
assessment_name | string | Name of that part. |
certified_on | string | Date that part was completed (YYYY-MM-DD). |
proctor_id | integer | ID of the proctor who supervised that part. |
proctor_name | string | That 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.
Paging through everything
Section titled “Paging through everything”count tells you the size of the full result set, so a loop is straightforward:
# page size 100, advancing offset by 100 until offset >= countcurl "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.
Retrieve one assessment
Section titled “Retrieve one assessment”GET /api/v1/ax/assessments/:idReturns 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.
Errors
Section titled “Errors”| Status | Meaning |
|---|---|
401 | Missing, malformed, or expired access token. Request a new token and retry. |
400 | Your integration has no organizations or assessments assigned — a provisioning issue. See Authentication. |
404 | No 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.
Things to know before you build
Section titled “Things to know before you build”- Everything is read-only.
GETis 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
ididentifies the overall assessment;results[].assessment_ididentifies one part of it. Only the former works withGET /assessments/:id. seidcan 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.

