---
title: "Report a user's training status from an external system"
method: POST
path: "/training/external-statuses"
tags: ["Training", "Preview"]
---

# Report a user's training status from an external system

`POST /training/external-statuses`

## Request

- Base URL: `https://app.ketryx.com/api/v1`
- URL: `https://app.ketryx.com/api/v1/training/external-statuses`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/ketryx/apis/ketryx-api/docs/training/external-statuses/post.ts> (a function with typed inputs; its response is checked against the schema)

Upserts the training status one external source system (e.g. an LMS or HR tool) reports for one organization member: one status is kept per user and source, and posting again replaces it. A status of OVERDUE blocks the user's training-gated Ketryx actions, with the blocking dialog naming the source; posting TRAINED lifts that block.

## Request body

- object
  - `email` string, email, required: Email address of the organization member the status is for
  - `source` string, required: Identifier of the reporting source system (e.g. "drata"). One status is kept per source; posting again for the same user and source replaces it.
  - `status` 'TRAINED' | 'OVERDUE', required: The user's training status in the source system. OVERDUE blocks the user's training-gated Ketryx actions.
  - `message` string: Optional explanation shown when the status blocks an action
  - `url` string, uri: Optional link into the source system shown when the status blocks an action

## Response `200`

Successful response

- object
  - `user` object, required: The organization member the status is for
    - `id` string, required: Ketryx ID of the user
    - `email` string, required: Normalized email address of the user
    - `name` string, nullable, required: Display name of the user
  - `externalTrainingStatus` object, required: The stored status for this user and source
    - `source` string, required: Source system the status was reported by
    - `status` 'TRAINED' | 'OVERDUE', required: The training status the source system reported
    - `message` string, nullable, required: Stored explanation, if any
    - `url` string, nullable, required: Stored source system link, if any
    - `updatedAt` string, date-time, required: When the status was last written

## Other responses

- `400`: Invalid input data
- `401`: Authorization not provided
- `403`: Insufficient access
- `500`: Internal server error

---

[API](https://skmtc.dev/ketryx/apis/ketryx-api.md) - [All operations](https://skmtc.dev/ketryx/apis/ketryx-api/llms.txt) - [OpenAPI document](https://skmtc.dev/ketryx/apis/ketryx-api/revisions/a2a484dc35ca?raw)
