Skip to content

Core concepts

The Public API exposes a learning platform. Before you integrate, it helps to have a mental model of the main objects and how they relate. This page is the map; the API reference is the territory.

The object model at a glance

graph TD
    U[Users] -->|grouped into| G[Groups]
    CI[Content items] -->|surfaced in| CH[Channels]
    CI -->|bundled into| COL[Collections]
    TR[Tracks] -->|ordered sequence of| CI
    A[Assignments] -->|link user to| CI
    A -->|link user to| U
    ES[Event series] -->|template for| EV[Events]
    EN[Enrollments] -->|link user to| EV
    EN -->|link user to| U
    TAG[Tags] -->|categorize| CI

Content items

A content item is any piece of learning content. Every content item shares a common shape — public_id, name, description, is_hidden, is_archived, tags, facilitators — and supports the same lifecycle actions (archive, unarchive, clone). The content_type field tells you which subtype you're looking at:

content_type What it is Assignable? Notes
article Text-based content Yes Authored inline or via Markdown.
video A video, hosted natively (Mux) or linked (YouTube/Vimeo) Yes See Uploading a video.
course A SCORM/AICC/xAPI package Yes Hosted via SCORM Cloud. See Building a course.
guide An interactive, step-based codelab Yes Built from a ZIP. See Building a guide.
link A pointer to external content Yes Lives outside PlusPlus.
track An ordered sequence of other content items Yes A learning path. See Building learning paths.
collection A curated, ordered set of content items No A catalog container, not a learning unit.
event A scheduled occurrence with timeslots No (use enrollments) See Events lifecycle.

The generic GET /content-items/ endpoint lists and searches across all types at once; the type-specific endpoints (/videos/, /courses/, …) expose the fields unique to each subtype.

Tracks vs. Collections

Both group content, but they serve different jobs. A track is a learning path — assignable and completable, with ordering and sections that drive a learner through material. A collection is a catalog shelf — it presents related content for browsing but is never assigned or completed. Reach for a track when you want progress tracking; reach for a collection when you just want to group things on the catalog.

People and organization

  • Users are the people on your platform — learners, organizers, and admins (role). Each user optionally references a manager (another user).
  • Groups are logical collections of users (teams, departments, cohorts). Groups scope access and reporting, and let you assign or enroll many users at once. Manage membership via the /groups/{public_id}/members/ sub-resource.
  • Channels are spaces that surface content to learners. A channel has owners, group-based access controls, and curated featured and shared item lists. Channels organize presentation; they don't own content exclusively.
  • Tags categorize content items by topic. Filter the catalog by tag with GET /content-items/?tag=onboarding.

Connecting users to content

Two relationship objects link people to things:

  • Assignments connect a user to a content item. An assignment carries state (not_started, in_progress, completed, dropped, exempted), progress, score, and a due date. Assigning a track fans out into one assignment per item in the track. See Assignments & completion.
  • Enrollments connect a user to an event. An enrollment carries attendance method (in_person / online), status (enrolled, waitlisted, dropped), and check-in. See Events lifecycle.

The distinction matters: content items are assigned; events are enrolled. You won't find an assignment endpoint for events — use enrollments.

Events and event series

An event series is a reusable template that holds default settings (location, capacity, online/in-person modes). An event is a concrete scheduled occurrence with one or more timeslots. An event may belong to a series (inheriting its defaults) or stand alone. Recordings attach to a series and play back via Mux. See Events lifecycle and Uploading recordings.

Reporting

  • Insights are read-only, pre-aggregated analytics — assignment completion breakdowns, overdue counts, ratings, pass/fail rates, and video engagement (sourced from Mux).
  • Saved reports are reusable filters ("segments") over a content type, expressed in RQL. Run one via its /results/ sub-resource to get the matching rows.

Identifiers

Every resource is identified by a public_id — an opaque, stable UUID. Internal numeric IDs are never exposed. When you reference one resource from another (assign a content item to a user, add an item to a track), you always pass public_id values. The one exception is location_id on events, which is a numeric location id. Treat every public_id as an opaque string — don't parse or generate it.

Where to go next