# Training completions (https://developers.asip.io/docs/queries/learning-completions)

Courses finished in ASIP, with the certificate serial. Through an API key you read your own completions only.

> **Status: Available on request.** API keys, the read-only Data API, the MCP server (with an API key) and signed webhooks are live on app.asip.io. Developer access is off by default for every company: ask ASIP to enable it for yours (https://developers.asip.io/docs/how-to-get-access). One-click OAuth sign-in for AI connectors (claude.ai, ChatGPT, Copilot) is not available yet; use an API key. The changelog at https://developers.asip.io/docs/changelog says when each part becomes available.

|           |                                                                                                                                                           |
| --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Data API  | `GET /api/v1/data/learning-completions` and `GET /api/v1/data/learning-completions/feed` ([endpoint reference](/docs/api-reference/learning-completions)) |
| MCP query | `query://asip/learning_completions`                                                                                                                       |
| Scope     | `learning:read`                                                                                                                                           |
| Module    | Training                                                                                                                                                  |
| Filters   | `cursor`, `limit`, `updatedSince` (see [below](#who-can-read-it) for `stationId`)                                                                         |
| Order     | `recordedAt`, then `id`: the feed delivers **new** completions only                                                                                       |

## Who can read it

Any member of a company with the Training module. **Through an API key, the query returns the key
owner's own completions, and nobody else's**, whatever their role.

Inside ASIP, some oversight roles can open colleagues' training records. That needs the permission
**Check whether a person may perform a task**, which is never carried by an API key, so a key cannot
list other people's completions. Because a key reads only its owner's completions, the `stationId`
filter (which narrows *other people's* completions to one station) is refused with `403 restricted`.

## What each record carries

| Field                                        | Meaning                                                                                                                           |
| -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `id`, `module`, `url`                        | The completion's ASIP id, `training`, and a link to the training record in ASIP.                                                  |
| `isOwn`                                      | `true` when the completion is your own (always `true` through an API key).                                                        |
| `learnerName`                                | Who completed the course, as their name appears in the directory.                                                                 |
| `courseId`, `courseVersionId`, `courseTitle` | The course and the version that was completed. `courseTitle` can be `null`.                                                       |
| `completedAt`                                | When the course was completed.                                                                                                    |
| `recordedAt`                                 | When ASIP recorded the completion. This is the field the list and the feed are ordered by, and the one `updatedSince` filters on. |
| `certificateSerial`, `certificateIssuedAt`   | The certificate issued for the completion.                                                                                        |
| `evidenceOrigin`                             | Where the evidence of completion came from.                                                                                       |

## What is left out, and why

* **Assessment answers** (the attempt behind a completion) and the **requirements snapshot**, which
  can hold waiver reasons and override rationale. These are personal and are not needed to know that
  a course was finished.
* Internal ledger ids and stages, content and certificate hashes, correlation ids, and the learner's
  user id.

## Feed

A completion is never edited once recorded, so the feed is ordered by `recordedAt` and delivers **new
completions only**. Like every feed, it stops 30 seconds behind the current time. See
[Keeping in sync with /feed](/docs/api-reference#keeping-in-sync-with-feed).
