Skip to main content

Training Records API

Returns learner assignments and completion results for the organization or group associated with the API client.

List training records​

GET /api/v1/training-records

Required scope: training.read. See Authentication for obtaining and using an access token.

curl --request GET \
--url "https://courses.e-learningcourses.com/api/v1/training-records?page=1&pageSize=1000" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "Accept: application/json"

The client credential determines which records are returned. The endpoint does not accept an organization or group identifier.

Query parameters​

ParameterTypeDefaultDescription
pageinteger1Page number. Must be at least 1.
pageSizeinteger1000Records per page. Must be from 1 through 5000.
includeArchivedbooleanfalseSet to true to include archived training records.
includeInviteStatusbooleanfalseSet to true to include the latest recorded invitation email event. The inviteStatus property is omitted when this is false.
enrolledFromISO 8601 date or date-timenoneInclusive lower bound for the assignment date. Records without an assignment date are excluded when this filter is present.
enrolledToISO 8601 date or date-timenoneExclusive upper bound for the assignment date. Records without an assignment date are excluded when this filter is present.

Dates without an offset are interpreted as UTC. Prefer explicit UTC values such as 2026-09-01T00:00:00Z.

The enrollment range is half-open: enrolledFrom is included and enrolledTo is excluded. To include all assignments made on September 30, for example, use enrolledTo=2026-10-01.

Enrollment filters are not change tracking

enrolledFrom and enrolledTo filter the date training was assigned. They do not filter lastUpdatedUtc. A synchronization process that must detect later completion changes should read all relevant pages and reconcile records by recordId.

Example with filters​

curl --request GET \
--url "https://courses.e-learningcourses.com/api/v1/training-records?page=1&pageSize=5000&enrolledFrom=2026-09-01T00%3A00%3A00Z&enrolledTo=2026-10-01T00%3A00%3A00Z&includeArchived=true&includeInviteStatus=true" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
--header "Accept: application/json"

Response​

{
"data": [
{
"recordId": 125804,
"firstName": "Alex",
"lastName": "Morgan",
"email": "alex.morgan@example.com",
"courseId": "38f595b7-2ff4-4da6-bf24-91316399ec9a",
"courseName": "Supplier Code of Conduct",
"assignedDateUtc": "2026-09-03T08:30:00Z",
"completedDateUtc": "2026-09-05T14:12:08Z",
"groupId": "fbc74870-3995-4f2c-b129-c2812b3e56c7",
"groupName": "Example Supplier",
"supplierNo": "SUP-1042",
"status": "passed",
"source": "annual",
"archived": false,
"lastUpdatedUtc": "2026-09-05T14:12:12Z",
"inviteStatus": "delivered"
}
],
"pagination": {
"page": 1,
"pageSize": 1000,
"totalRecords": 1,
"totalPages": 1
}
}

Training record fields​

FieldTypeDescription
recordIdintegerIdentifier for this training status record. Use it when reconciling repeated pulls.
firstNamestring or nullLearner's first name.
lastNamestring or nullLearner's last name.
emailstring or nullLearner's email address or username.
courseIdUUIDCourse identifier. Compare it with course IDs in the Packages API.
courseNamestringCourse name.
assignedDateUtcdate-time or nullDate and time the training was assigned, in UTC.
completedDateUtcdate-time or nullDate and time the training was completed, in UTC.
groupIdUUID or nullIdentifier of the group associated with the assignment. Resolve it with the Groups API.
groupNamestring or nullName of the group associated with the assignment.
supplierNostring or nullGroup supplier number.
statusstringStable machine-readable training status. See Status values.
sourcestringAssignment source: annual, ec, or headtrax. An unset source is returned as annual.
archivedbooleanWhether the training record is archived.
lastUpdatedUtcdate-timeDate and time the reporting record was last updated, in UTC.
inviteStatusstring or nullLatest recorded invitation email event for the training package and recipient. Present only when includeInviteStatus=true. Treat the provider event value as an opaque string.

Status values​

ValueMeaning
not_startedThe learner has not started the course.
in_progressThe learner started but has not completed the course.
completedThe course is complete and does not have a pass/fail result.
passedThe learner completed and passed the course.
failedThe learner completed but failed the course.
archivedThe training record is archived. This value takes precedence over its completion result.

Pagination​

Records are returned in a stable order by recordId. Continue requesting pages until page reaches totalPages. A response with no matching records has an empty data array and totalPages equal to 0.

Do not calculate the next page from the number of records received alone. Use the pagination object because the final page may contain fewer records than pageSize.

Errors​

HTTP statusMeaning
400 Bad RequestA query parameter is invalid.
401 UnauthorizedThe bearer token is missing, invalid, or expired.
403 ForbiddenThe token lacks training.read, or the API client is no longer authorized for its scope.
429 Too Many RequestsA rate limit was exceeded. Retry with backoff.
500 Internal Server ErrorAn unexpected server error occurred. Record the returned traceId when contacting support.

Validation errors use the standard Problem Details format:

{
"title": "One or more validation errors occurred.",
"status": 400,
"errors": {
"pageSize": [
"Page size must be between 1 and 5000."
]
},
"traceId": "00-..."
}

See Authentication rate limits for the shared limit.

OpenAPI​

https://courses.e-learningcourses.com/api/v1/openapi.json