# Training evidence

Outcomes, completions, certificates and check codes, and how to find training that is missing.

The registers record what Kapi saw: what each employee owed, by when, and what they did about it. Your integration decides what that means for its own controls and notifications.

## Find missing training

Join training records to people and courses by their stable IDs, then compare them with your own employee roster and training policy. A person missing from Kapi has no records, so find them from your roster. People and requirements have to be in Kapi before the registers can show them.

Your integration can use these facts to flag missing evidence, tell its users, and clear the warning after a later complete pull. Kapi does not choose another platform's control mappings or notification policy.

## Outcomes

Every training record has an `outcome`:

| Outcome                        | Meaning                                                                                                |
| ------------------------------ | ------------------------------------------------------------------------------------------------------ |
| `completed_on_time`            | Completed by the deadline, or completed when there is no deadline. `completed_at` holds the time.      |
| `completed_late`               | Completed after the deadline. `days_late` says by how many days.                                       |
| `completed_before_requirement` | Completed before the requirement began. Review it against your policy.                                 |
| `not_due_yet`                  | Not completed, and the deadline has not passed or there is none.                                       |
| `overdue`                      | Not completed, and the deadline has passed.                                                            |
| `missed`                       | The record stopped applying after its deadline, without a completion.                                  |
| `excused`                      | The record stopped applying before its deadline, without a completion. An exception, not a completion. |
| `waived`                       | An administrator waived it, or it is no longer required. An exception, not a completion.               |
| `optional_not_done`            | Optional training not completed. Not a failure of required training.                                   |

v1 can add outcome values. Treat an outcome you do not know as needing review, not as completed.

A person with `no_required_records` set to `true` has no required records open at that moment. Decide whether that agrees with your policy; do not mark the person as trained because of it.

## What completion means

Completion is the completion Kapi recorded, not a separate exam score. `completed_at` is when Kapi's server received it; training finished offline arrives when the device next syncs, so a completion can arrive after its deadline. `joined_at` is when the person joined Kapi, not when they started work, and joiner deadlines count from joining Kapi.

## Certificates

A certificate record is not a PDF. Its `status` at the requested moment is `valid`, `expired`, `revoked` or `replaced`. `kind` is `completion` or `assessed`.

A person who finished the course by attending a Kapi live session in full has the session on their certificate record: `live_session_id`, `live_session_format` (`online` or `on_site`), `live_session_starts_at`, `live_session_ends_at`, `live_session_minutes` and `live_session_marked_by` (`trainer`, or `kapi` when Kapi changed the mark after an ask). With `people:read` it also has `trainer_name`. These fields are null for a course finished online.

With `people:read`, each certificate has a `check_code`. Anyone can confirm a certificate at `https://www.kapiworks.com/verify/<check_code>`; that page shows the holder's name, which is why the code needs `people:read`.

## People who were erased

When Kapi erases a person at the company's instruction, their training records and certificates stay under their IDs, so the company's evidence stays complete. `person_name` reads "Erased person" and `work_email` is null. The people register shows `access_state` as `erased`, and records that were still open end with `ended_reason` `source_removed`. Their certificate check page shows nothing. This holds for any `as_at`, including moments before the erasure, because names and work emails always come from current records, not from history.

The company that asked for the erasure should tell you the `person_id`. When you see "Erased person" or `access_state` `erased` for a person you hold, delete the name, work email and anything else you copied that identifies them, unless the company tells you otherwise. You may keep the IDs and dates so your counts stay right. Do not try to find out who the person was.

## What the API covers

The registers cover employee-targeted training only: the employees of the company that created the key, including employees in shares that also reach partners or customers. Partner and customer learners are not in v1.
