Every training record owed during a period
/v1/training-records/periodEvery record owed at any time between from and to, with its outcome at the end of the period or when it ended. Requires training:read. Names, work emails and certificate check codes also need people:read; without it they are left out.
Authorization
bearerAuth training:readA company API key, not an OAuth access token: kw_live_ in production, kw_test_ elsewhere. Send it only in the Authorization header. A key sent in a URL is revoked.
In: header
Scope: training:read
Query Parameters
Required on the first page. Period start, inclusive; a date starts the company's day. Omit it with a cursor, which keeps it. At most 400 days before to.
Required on the first page. Period end, inclusive, as an instant or a company date. Omit it with a cursor, which keeps it.
Optional course UUID. The cursor keeps it.
uuidOpaque next_cursor from the previous page. Send it unchanged to the same endpoint. It pins the snapshot and filters, and grants no access.
Rows per page, 1 to 200. Larger values are treated as 200. A page can hold fewer rows to stay within 3 MiB, so follow next_cursor until it is null.
1 <= value200Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
# Supply the key from your server's secret manager. Do not log it.# curl reads the header from stdin, keeping the key out of its arguments.printf 'header = "Authorization: Bearer %s"\n' "$KAPI_WORKS_API_KEY" | curl --config - --silent --show-error --fail-with-body \ 'https://example.com/v1/training-records/period'{ "data": [ { "deployment_id": "00000000-0000-4000-8000-000000000001", "organization_id": "4f6b2a52-1c1e-4f7a-9d3e-2b7c8a9e0d11", "learning_space_id": "8b2d6c3e-5f41-4a8e-9c27-1d0e3f4a5b62", "record_id": "a7e3c1b9-2d48-4f6a-8e15-9b0c7d6e5f43", "learner_profile_id": "c3a1e7f2-8d64-4b1f-a9e2-6f5d4c3b2a10", "person_name": "Amira Okafor", "work_email": "amira.okafor@example.com", "course_id": "d2f8b4a6-7c1e-4e93-b5a0-3c9e8f7d6a21", "course_release_id": "e5c2a9d7-4b3f-4c18-9a6e-2f1d0c9b8a77", "renews_certificate_id": null, "sequence": 1271, "valid_from": "2026-09-12T13:41:09Z", "recorded_at": "2026-09-12T13:41:12Z", "cause": "change", "logic_version": 4, "requirement": "required", "assigned_at": "2026-09-01T08:00:00Z", "due_at": "2026-09-30T22:59:59Z", "due_time_zone": "Europe/London", "due_basis": "share_deadline", "completed_at": "2026-09-12T13:41:09Z", "completion_receipt_id": "9c8b7a6f-5e4d-4c3b-8a29-1f0e9d8c7b66", "ended_at": null, "ended_reason": null, "waived_at": null, "waiver_actor_id": null, "waiver_reason_code": null, "outcome": "completed_on_time", "days_late": null, "reminders_sent": 1, "share_ids": [ "b6d4f2a8-9e1c-4a35-8f72-0e9d8c7b6a54" ], "doors": [ "employee" ], "certificate_id": "f1b9d3e5-6a2c-4d70-8b4e-5c3a2f1e0d98", "obligation_change_id": null } ], "total": 1, "snapshot": { "organization_id": "4f6b2a52-1c1e-4f7a-9d3e-2b7c8a9e0d11", "deployment_id": "00000000-0000-4000-8000-000000000001", "as_at": "2026-10-09T09:00:00Z", "from": null, "known_at": "2026-10-09T08:59:41Z", "sequence": 1284, "capture_sequence": 352, "chain_hash": "3f9a1c7e5b2d8f4a6c0e9b1d3f5a7c9e2b4d6f8a0c1e3b5d7f9a2c4e6b8d0f1a", "logic": { "version": 4, "date": "2026-10-06" }, "history_complete_from": "2026-10-06T05:00:00Z", "available": true }, "next_cursor": null}Training records at a moment
Every record an employee owes at `as_at`, with its outcome then. Requires `training:read`. Names, work emails and certificate check codes also need `people:read`; without it they are left out.
Certificates at a moment
Employee certificates issued by `as_at`, with their state then. Requires `certificates:read`. Names, work emails and certificate check codes also need `people:read`; without it they are left out.