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

Courses finished in ASIP, with the certificate serial.

> **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.

## Training completions

`GET https://app.asip.io/api/v1/data/learning-completions`

Courses finished in ASIP, with the certificate serial. Your own completions always; other people's only if your role oversees them AND you may open colleagues' training records, for the people at your stations. stationId narrows other people's completions to one station. A completion is never edited, so the feed delivers new completions only. Ordered by creation (recordedAt, then id), oldest first — new records only; later edits are not re-delivered. Any member, within their own station scope. MCP query id: `query://asip/learning_completions`.

**Query parameters**

| Name | Type | Required | Description |
|---|---|---|---|
| `cursor` | string | no | Opaque cursor: pass back `pagination.endCursor` from the previous page unchanged. |
| `limit` | integer (1–200) | no | Page size, 1–200. Default 50. |
| `updatedSince` | string (date-time) | no | Only records whose ordering timestamp is at or after this ISO 8601 date-time. |
| `stationId` | string | no | Restrict to one station in your scope (an id from /api/v1/data/stations). |

**Responses**

| Status | Meaning |
|---|---|
| 200 | One page of records. |
| 400 | A parameter is malformed (`bad_input`). |
| 401 | No valid API key (`unauthenticated`). Only an `asip_pk_` API key is accepted; web sign-in and ASIP Go tokens are refused. |
| 403 | Not available to your role (`restricted`/`forbidden`), or the API key lacks this query's scope (`insufficient_scope`). |
| 404 | Module not enabled, or station not in your scope (`module_disabled`/`not_found`). |
| 429 | Rate limited; see Retry-After. |

**Record fields** (`LearningCompletion`)

| Field | Type | Description |
|---|---|---|
| `id` | string | Stable ASIP record id. |
| `module` | string | The ASIP module that owns the record (a module key, or "platform"). |
| `url` | string | Deep link to the record in the ASIP app. Requires the viewer to sign in. |
| `isOwn` | boolean | True when the completion is your own. |
| `learnerName` | string | Who completed the course (directory name). |
| `courseId` | string |  |
| `courseVersionId` | string |  |
| `courseTitle` | string or null |  |
| `completedAt` | string (date-time) |  |
| `recordedAt` | string (date-time) |  |
| `certificateSerial` | string |  |
| `certificateIssuedAt` | string (date-time) |  |
| `evidenceOrigin` | string |  |

## Training completions — change feed

`GET https://app.asip.io/api/v1/data/learning-completions/feed`

Courses finished in ASIP, with the certificate serial. Your own completions always; other people's only if your role oversees them AND you may open colleagues' training records, for the people at your stations. stationId narrows other people's completions to one station. A completion is never edited, so the feed delivers new completions only. Ordered by creation (recordedAt, then id), oldest first — new records only; later edits are not re-delivered. Any member, within their own station scope. The feed stops 30 seconds behind the current time, so a record appears on it about 30 seconds after it is written; this keeps a slow write from being skipped. MCP query id: `query://asip/learning_completions`.

**Query parameters**

| Name | Type | Required | Description |
|---|---|---|---|
| `cursor` | string | no | Opaque cursor: pass back `pagination.endCursor` from the previous page unchanged. |
| `limit` | integer (1–200) | no | Page size, 1–200. Default 50. |
| `updatedSince` | string (date-time) | no | Only records whose ordering timestamp is at or after this ISO 8601 date-time. |

**Responses**

| Status | Meaning |
|---|---|
| 200 | One page of records. |
| 400 | A parameter is malformed (`bad_input`). |
| 401 | No valid API key (`unauthenticated`). Only an `asip_pk_` API key is accepted; web sign-in and ASIP Go tokens are refused. |
| 403 | Not available to your role (`restricted`/`forbidden`), or the API key lacks this query's scope (`insufficient_scope`). |
| 404 | Module not enabled, or station not in your scope (`module_disabled`/`not_found`). |
| 429 | Rate limited; see Retry-After. |
