Skip to main content
This report is the training half of a previous provider’s per-person compliance export: directory identity plus one row per person per training enrollment (module status and dates). The grain is long-form — person × assignment — because that is what GET /v1/assignments/{id}/enrollments already returns. The query does not pivot modules into columns.
Policy acknowledgements are not part of this report. Living Security has no policy-acceptance API, so those legacy columns are out of scope, not a pending mapping. See Divergences from the legacy export.
Setup, credentials, pagination, and rate-limit retry are the same as the Power BI / Excel connectivity guide. Add the shared Fn_FetchAll query first; this report calls it by name.

Required key scopes

Source endpoints

This query does not call GET /v1/entities. The enrollment row already carries email and display_name, and the entity list has no department or job title — so walking it would not populate directory columns the enrollment row does not already have.

Grain

One row per enrollment (person × assignment). A person assigned the same course through two assignments produces two rows. A person with no enrollments does not appear — /v1 cannot emit a usable directory row without email, and inventing person-only rows would mix grains. Request budget: one paginated walk per assignment, sequentially, under the shared per-key rate limit. Always set limit = "500".

Column mapping

Legacy column names are from your previous provider’s export. /v1 fields are the public API names; the query aliases some of them for the report. Join keys kept for a star-schema model: entity_id, assignment_id, course_id, user_assignment_id. The query also keeps course_slug, assignment_title, passed, attempts, assignment_lifecycle_status, and assignment_created_at. enrollment_status is the learner’s progress, not the assignment lifecycle (active / paused / completed).

Divergences from the legacy export

  • Policy acceptances are not available. This platform has no policy domain — there is no /policies, /policy_acceptances, or equivalent /v1 resource. Do not treat those columns as a pending mapping. They are out of scope.
  • Directory extras are omitted, not nulled. Department, job title, manager, and location are not on /v1. The query does not invent empty columns for them.
  • Due date is included even if the legacy export did not have it, because Enrollment.due_at is on the API.
  • Course name prefers the catalog title. Course.title is the module name. Assignment.title is used only when the catalog row is missing (deleted or unpublished).
  • Long-form, not pivoted. One row per enrollment, not one row per person with a column per module.

Next steps

Power BI and Excel setup

Credentials, pagination, and loading these queries in Power BI or Excel.

Email phishing log

Event-level phishing interactions for the trailing 12 months.

Most susceptible users

Per-person 12-month click, credential, and report rollup.

API keys

Grant training:read and course:read on the key that refreshes this report.