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
| Parameter | Type | Default | Description |
|---|---|---|---|
page | integer | 1 | Page number. Must be at least 1. |
pageSize | integer | 1000 | Records per page. Must be from 1 through 5000. |
includeArchived | boolean | false | Set to true to include archived training records. |
includeInviteStatus | boolean | false | Set to true to include the latest recorded invitation email event. The inviteStatus property is omitted when this is false. |
enrolledFrom | ISO 8601 date or date-time | none | Inclusive lower bound for the assignment date. Records without an assignment date are excluded when this filter is present. |
enrolledTo | ISO 8601 date or date-time | none | Exclusive 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.
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
| Field | Type | Description |
|---|---|---|
recordId | integer | Identifier for this training status record. Use it when reconciling repeated pulls. |
firstName | string or null | Learner's first name. |
lastName | string or null | Learner's last name. |
email | string or null | Learner's email address or username. |
courseId | UUID | Course identifier. Compare it with course IDs in the Packages API. |
courseName | string | Course name. |
assignedDateUtc | date-time or null | Date and time the training was assigned, in UTC. |
completedDateUtc | date-time or null | Date and time the training was completed, in UTC. |
groupId | UUID or null | Identifier of the group associated with the assignment. Resolve it with the Groups API. |
groupName | string or null | Name of the group associated with the assignment. |
supplierNo | string or null | Group supplier number. |
status | string | Stable machine-readable training status. See Status values. |
source | string | Assignment source: annual, ec, or headtrax. An unset source is returned as annual. |
archived | boolean | Whether the training record is archived. |
lastUpdatedUtc | date-time | Date and time the reporting record was last updated, in UTC. |
inviteStatus | string or null | Latest 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
| Value | Meaning |
|---|---|
not_started | The learner has not started the course. |
in_progress | The learner started but has not completed the course. |
completed | The course is complete and does not have a pass/fail result. |
passed | The learner completed and passed the course. |
failed | The learner completed but failed the course. |
archived | The 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 status | Meaning |
|---|---|
400 Bad Request | A query parameter is invalid. |
401 Unauthorized | The bearer token is missing, invalid, or expired. |
403 Forbidden | The token lacks training.read, or the API client is no longer authorized for its scope. |
429 Too Many Requests | A rate limit was exceeded. Retry with backoff. |
500 Internal Server Error | An 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