# The five registers

What each register returns, at a moment or over a period, and how dates and the company's time zone work.

The API has five registers of employee evidence, plus a snapshot check. All of them answer `GET` with JSON.

| Endpoint | Returns | Scope |
| --- | --- | --- |
| [`GET /v1/training-records`](https://docs.kapiworks.com/reference/list-training-records) | Training records at a moment | `training:read` |
| [`GET /v1/training-records/period`](https://docs.kapiworks.com/reference/list-period-training-records) | Every training record owed during a period | `training:read` |
| [`GET /v1/certificates`](https://docs.kapiworks.com/reference/list-certificates) | Certificates at a moment | `certificates:read` |
| [`GET /v1/people`](https://docs.kapiworks.com/reference/list-people) | Employees and invitations during a period | `people:read` |
| [`GET /v1/courses`](https://docs.kapiworks.com/reference/list-courses) | Course versions referenced by employee records | `training:read` |
| [`GET /v1/snapshot`](https://docs.kapiworks.com/reference/get-snapshot) | Check whether anything changed | Any |

## At a moment, or over a period

**At a moment.** Training records and certificates accept `as_at`: the register as it stood then. Leave it out to read the register now.

**Over a period.** Period training records and people need `from` and `to` on the first page of a pull. A period is at most 400 days long. Period training lists every record owed at any time in the period, with its outcome at the end of the period or when the record ended. People lists the employees and invitations that existed in the period.

The cursor keeps the dates of the first call, so send `from`, `to` and `as_at` only on the first page.

Training endpoints also accept `course`, a course UUID, to read one course. Courses list the published course versions that employee records refer to, with their content fingerprints.

## Dates and the company's time zone

Prefer RFC 3339 timestamps with an explicit offset, such as `2026-10-09T09:00:00Z`. A date on its own is read in the company's time zone: `from` starts at the beginning of that day, and `as_at` and `to` end at the end of it.

## Where history starts

Kapi records history from `history_complete_from`, which every snapshot carries. Earlier records are unavailable, not empty: asking for a moment or period before it answers [`before_history`](https://docs.kapiworks.com/errors/before_history), with `history_complete_from` in the body. Use that time as the earliest you ask for.

## The response

Every register answers with the same envelope:

* `data`: the rows of this page;
* `total`: the rows in the whole pull, not just this page;
* `snapshot`: the pinned snapshot the pull reads, with the company and deployment it belongs to;
* `next_cursor`: send it to get the next page; null when the pull is complete.

Rows hold only the fields the contract publishes. v1 can add fields and new values for open fields such as `outcome`; ignore fields you do not know, and see [Versioning](https://docs.kapiworks.com/versioning) for the rest. The [field dictionary](https://docs.kapiworks.com/reference/field-dictionary) explains every field.
