PlusPlus Developer API (2.0.0)

Download OpenAPI specification:

The PlusPlus Public API enables you to programmatically manage your learning platform. Build integrations, automate workflows, and connect PlusPlus with your existing tools.

Authentication

All requests require a Bearer token. Retrieve your API token from your account settings in PlusPlus, then include it in every request:

Authorization: Bearer pp_your_token_here

Identifiers

All resources are identified by a public_id (UUID). Internal numeric IDs are never exposed. When creating relationships between resources (e.g., assigning a manager), reference them by their public_id.

Pagination

List endpoints return paginated results. Control pagination with:

  • page — Page number (default: 1)
  • page_size — Items per page (default: 25, max: 100)

Rate Limits

All endpoints are rate-limited. Rate limit headers are included in every response:

  • X-RateLimit-Limit — Your rate limit
  • X-RateLimit-Remaining — Remaining requests
  • X-RateLimit-Reset — Seconds until reset

Errors

All errors follow a consistent format:

{
  "error": {
    "code": "not_found",
    "message": "Content item not found.",
    "request_id": "req_a1b2c3d4"
  }
}

Validation errors include field-level details:

{
  "error": {
    "code": "validation_error",
    "message": "Validation failed.",
    "request_id": "req_a1b2c3d4",
    "field_errors": {
      "email": ["A user with this email already exists."]
    }
  }
}

Auth

Manage API tokens for authenticating with the PlusPlus API.

Create an API token

Create a new API token for authenticating with the PlusPlus API. The full token is only returned once in the response — store it securely.

Authorizations:
BearerTokenAuth
Request Body schema: application/json
required
name
required
string (Name)

A human-readable label for the token.

Expires At (string) or Expires At (null) (Expires At)

When the token should expire. Omit for no expiration.

Responses

Request samples

Content type
application/json
{
  • "name": "CI/CD Pipeline",
  • "expires_at": "2019-08-24T14:15:22Z"
}

Response samples

Content type
application/json
{ }

List API tokens

List all API tokens for the authenticated user.

Authorizations:
BearerTokenAuth

Responses

Response samples

Content type
application/json
{ }

Revoke an API token

Deactivate an API token by its prefix. The token will no longer be usable for authentication.

Authorizations:
BearerTokenAuth
path Parameters
prefix
required
string (Prefix)

Responses

Users

Manage learners, admins, and organizers on your platform. Users can be created individually or in bulk via HRIS sync.

List users

Retrieve a paginated list of users. Supports filtering by email, role, active status, manager, and group membership.

Authorizations:
BearerTokenAuth
query Parameters
Email (string) or Email (null) (Email)

Filter by exact email address.

Employee Id (string) or Employee Id (null) (Employee Id)

Filter by employee ID.

Search (string) or Search (null) (Search)

Search by name or email.

Is Active (boolean) or Is Active (null) (Is Active)

Filter by active status.

Role (string) or Role (null) (Role)

Filter by role (admin, organizer, user).

Manager (string) or Manager (null) (Manager)

Filter by manager's public_id.

Group (string) or Group (null) (Group)

Filter by group public_id (returns members of that group).

page
integer (Page)
Default: 1
page_size
integer (Page Size)
Default: 25

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

Create a user

Authorizations:
BearerTokenAuth
Request Body schema: application/json
required
email
required
string (Email)

The user's email address.

name
required
string (Name)

The user's display name.

Role (string) or Role (null) (Role)
Default: "user"

Role to assign. One of: admin, organizer, user.

Employee Id (string) or Employee Id (null) (Employee Id)

External employee identifier.

Manager (string) or Manager (null) (Manager)

The public_id of the user's manager.

Responses

Request samples

Content type
application/json
{
  • "email": "jane.doe@company.com",
  • "name": "Jane Doe",
  • "role": "user",
  • "employee_id": "EMP-1234",
  • "manager": "f25737c2-acd5-4873-b8df-91d937ea8194"
}

Response samples

Content type
application/json
{ }

Get a user

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Update a user

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
Name (string) or Name (null) (Name)

The user's display name.

Role (string) or Role (null) (Role)

Role to assign. One of: admin, organizer, user.

Employee Id (string) or Employee Id (null) (Employee Id)

External employee identifier.

Manager (string) or Manager (null) (Manager)

The public_id of the user's manager.

Is Active (boolean) or Is Active (null) (Is Active)

Set to false to deactivate the user.

Responses

Request samples

Content type
application/json
{
  • "name": "Jane Smith",
  • "role": "string",
  • "employee_id": "string",
  • "manager": "f25737c2-acd5-4873-b8df-91d937ea8194",
  • "is_active": true
}

Response samples

Content type
application/json
{ }

Deactivate a user

Soft-deactivates the user. They will no longer be able to log in or appear in active user lists. Their assignments and history are preserved.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Groups

Groups organize users into logical collections (teams, departments, cohorts). Use groups to scope assignments, enrollments, and reporting.

List groups

Retrieve a paginated list of groups. Supports filtering by name, source, and search.

Authorizations:
BearerTokenAuth
query Parameters
Name (string) or Name (null) (Name)

Filter by group name (case-insensitive, partial match).

Source (string) or Source (null) (Source)

Filter by group source.

Search (string) or Search (null) (Search)

Search by name or source.

page
integer (Page)
Default: 1
page_size
integer (Page Size)
Default: 25

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

Create a group

Authorizations:
BearerTokenAuth
Request Body schema: application/json
required
name
required
string (Name)

The group's display name.

Source (string) or Source (null) (Source)
Default: "plusplus"

Source of the group.

Responses

Request samples

Content type
application/json
{
  • "name": "Engineering Team",
  • "source": "plusplus"
}

Response samples

Content type
application/json
{ }

Get a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Update a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
Name (string) or Name (null) (Name)

The group's display name.

Responses

Request samples

Content type
application/json
{
  • "name": "string"
}

Response samples

Content type
application/json
{ }

Delete a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

List group members

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Add members to a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
member_ids
required
Array of strings <uuid> (Member Ids) [ items <uuid > ]

List of user public_ids to add.

Responses

Request samples

Content type
application/json
{
  • "member_ids": [
    ]
}

Response samples

Content type
application/json
{ }

Replace all members in a group

Replace the entire membership list. Requires confirm_replace: true. If removing >50% of current members, also requires confirm_large_removal: true.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
member_ids
required
Array of strings <uuid> (Member Ids) [ items <uuid > ]

List of user public_ids that will become the new member list.

confirm_replace
boolean (Confirm Replace)
Default: false

Must be true to confirm the replacement.

confirm_large_removal
boolean (Confirm Large Removal)
Default: false

Must be true when removing more than 50% of current members.

Responses

Request samples

Content type
application/json
{
  • "member_ids": [
    ],
  • "confirm_replace": false,
  • "confirm_large_removal": false
}

Response samples

Content type
application/json
{ }

Remove a member from a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
member_public_id
required
string <uuid> (Member Public Id)

Responses

List group owners

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Add owners to a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
member_ids
required
Array of strings <uuid> (Member Ids) [ items <uuid > ]

List of user public_ids to add.

Responses

Request samples

Content type
application/json
{
  • "member_ids": [
    ]
}

Response samples

Content type
application/json
{ }

Remove an owner from a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
member_public_id
required
string <uuid> (Member Public Id)

Responses

Group Members

Manage the members of a group.

List group members

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Add members to a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
member_ids
required
Array of strings <uuid> (Member Ids) [ items <uuid > ]

List of user public_ids to add.

Responses

Request samples

Content type
application/json
{
  • "member_ids": [
    ]
}

Response samples

Content type
application/json
{ }

Replace all members in a group

Replace the entire membership list. Requires confirm_replace: true. If removing >50% of current members, also requires confirm_large_removal: true.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
member_ids
required
Array of strings <uuid> (Member Ids) [ items <uuid > ]

List of user public_ids that will become the new member list.

confirm_replace
boolean (Confirm Replace)
Default: false

Must be true to confirm the replacement.

confirm_large_removal
boolean (Confirm Large Removal)
Default: false

Must be true when removing more than 50% of current members.

Responses

Request samples

Content type
application/json
{
  • "member_ids": [
    ],
  • "confirm_replace": false,
  • "confirm_large_removal": false
}

Response samples

Content type
application/json
{ }

Remove a member from a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
member_public_id
required
string <uuid> (Member Public Id)

Responses

Group Owners

Manage the owners of a group.

List group owners

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Add owners to a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
member_ids
required
Array of strings <uuid> (Member Ids) [ items <uuid > ]

List of user public_ids to add.

Responses

Request samples

Content type
application/json
{
  • "member_ids": [
    ]
}

Response samples

Content type
application/json
{ }

Remove an owner from a group

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
member_public_id
required
string <uuid> (Member Public Id)

Responses

Articles

Articles are text-based learning content. Create, update, and manage articles in your content catalog.

List articles

Retrieve a paginated list of articles. Supports filtering by search term, archived status, and visibility.

Authorizations:
BearerTokenAuth
query Parameters
Search (string) or Search (null) (Search)

Search articles by name.

Is Archived (boolean) or Is Archived (null) (Is Archived)

Filter by archived status.

Is Hidden (boolean) or Is Hidden (null) (Is Hidden)

Filter by visibility.

page
integer (Page)
Default: 1
page_size
integer (Page Size)
Default: 25

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

Create an article

Authorizations:
BearerTokenAuth
Request Body schema: application/json
required
name
required
string (Name)

The article title.

Is Hidden (boolean) or Is Hidden (null) (Is Hidden)
Default: false

Whether the article is hidden from the catalog.

Is Self Assignable (boolean) or Is Self Assignable (null) (Is Self Assignable)
Default: true

Whether users can self-assign this article.

Duration (integer) or Duration (null) (Duration)

Estimated reading time in minutes.

Responses

Request samples

Content type
application/json
{
  • "name": "Getting Started with PlusPlus",
  • "is_hidden": false,
  • "is_self_assignable": true,
  • "duration": 15
}

Response samples

Content type
application/json
{ }

Get an article

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Update an article

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
Name (string) or Name (null) (Name)

The article title.

Is Hidden (boolean) or Is Hidden (null) (Is Hidden)

Whether the article is hidden from the catalog.

Is Self Assignable (boolean) or Is Self Assignable (null) (Is Self Assignable)

Whether users can self-assign this article.

Duration (integer) or Duration (null) (Duration)

Estimated reading time in minutes.

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "is_hidden": true,
  • "is_self_assignable": true,
  • "duration": 0
}

Response samples

Content type
application/json
{ }

Delete an article

Soft-deletes the article. The article will be archived and no longer visible in the catalog.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Archive an article

Archives the article. Archived articles are hidden from the catalog but can be restored.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Unarchive an article

Restores a previously archived article, making it visible in the catalog again.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Clone an article

Creates a copy of the article with a new public_id. The clone is independent of the original.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Assignments

Assignments represent the relationship between a user and a piece of content. They track progress, completion, and feedback throughout the learning lifecycle.

List assignments

Retrieve a paginated list of assignments. Supports filtering by user, content item, state, content type, overdue status, and date ranges.

Authorizations:
BearerTokenAuth
query Parameters
User (string) or User (null) (User)

Filter by user public_id.

Content Item (string) or Content Item (null) (Content Item)

Filter by content item public_id.

State (string) or State (null) (State)

Filter by assignment state.

Content Type (string) or Content Type (null) (Content Type)

Filter by content item type.

Is Overdue (boolean) or Is Overdue (null) (Is Overdue)

Filter overdue assignments only.

Due Date Gte (string) or Due Date Gte (null) (Due Date Gte)

Filter assignments due on or after this date.

Due Date Lte (string) or Due Date Lte (null) (Due Date Lte)

Filter assignments due on or before this date.

Created Gte (string) or Created Gte (null) (Created Gte)

Filter assignments created on or after this date.

Created Lte (string) or Created Lte (null) (Created Lte)

Filter assignments created on or before this date.

page
integer (Page)
Default: 1
page_size
integer (Page Size)
Default: 25

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

Create an assignment

Assign a content item to a user. Returns 201 when a new assignment is created and 200 when an existing assignment is returned.

Authorizations:
BearerTokenAuth
Request Body schema: application/json
required
user_id
required
string <uuid> (User Id)

The user's public ID.

content_item_id
required
string <uuid> (Content Item Id)

The content item's public ID.

Due Date (string) or Due Date (null) (Due Date)

Due date.

Expires At (string) or Expires At (null) (Expires At)

Expiration datetime.

Responses

Request samples

Content type
application/json
{
  • "user_id": "a169451c-8525-4352-b8ca-070dd449a1a5",
  • "content_item_id": "1d920181-ae22-4bd9-8f02-8411f897d38f",
  • "due_date": "2019-08-24",
  • "expires_at": "2019-08-24T14:15:22Z"
}

Response samples

Content type
application/json
{
  • "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
  • "user": {
    },
  • "content_item": {
    },
  • "state": "in_progress",
  • "progress": 0.6,
  • "score": 0.92,
  • "is_success": true,
  • "due_date": "2019-08-24",
  • "is_overdue": true,
  • "started_at": "2019-08-24T14:15:22Z",
  • "completed_datetime": "2019-08-24T14:15:22Z",
  • "dropped_at": "2019-08-24T14:15:22Z",
  • "exempted_at": "2019-08-24T14:15:22Z",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "feedback_rating": 4,
  • "attempt": 1,
  • "created": "2019-08-24T14:15:22Z"
}

Get an assignment

Retrieve a single assignment by its public_id. Returns 304 if the resource has not changed since the last request.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{
  • "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
  • "user": {
    },
  • "content_item": {
    },
  • "state": "in_progress",
  • "progress": 0.6,
  • "score": 0.92,
  • "is_success": true,
  • "due_date": "2019-08-24",
  • "is_overdue": true,
  • "started_at": "2019-08-24T14:15:22Z",
  • "completed_datetime": "2019-08-24T14:15:22Z",
  • "dropped_at": "2019-08-24T14:15:22Z",
  • "exempted_at": "2019-08-24T14:15:22Z",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "feedback_rating": 4,
  • "attempt": 1,
  • "created": "2019-08-24T14:15:22Z"
}

Update an assignment

Update mutable assignment fields. Only provided fields are changed. Pass null for due_date to remove it. Returns 409 for enrollment assignments.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
Due Date (string) or Due Date (null) (Due Date)

Due date or null to remove.

Expires At (string) or Expires At (null) (Expires At)

Expiration datetime or null to remove.

Responses

Request samples

Content type
application/json
{
  • "due_date": "2019-08-24",
  • "expires_at": "2019-08-24T14:15:22Z"
}

Response samples

Content type
application/json
{
  • "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
  • "user": {
    },
  • "content_item": {
    },
  • "state": "in_progress",
  • "progress": 0.6,
  • "score": 0.92,
  • "is_success": true,
  • "due_date": "2019-08-24",
  • "is_overdue": true,
  • "started_at": "2019-08-24T14:15:22Z",
  • "completed_datetime": "2019-08-24T14:15:22Z",
  • "dropped_at": "2019-08-24T14:15:22Z",
  • "exempted_at": "2019-08-24T14:15:22Z",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "feedback_rating": 4,
  • "attempt": 1,
  • "created": "2019-08-24T14:15:22Z"
}

Mark an assignment as completed

Marks an assignment as completed. Returns 409 if the assignment is already completed or dropped. Exempted assignments can still be completed.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{
  • "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
  • "user": {
    },
  • "content_item": {
    },
  • "state": "in_progress",
  • "progress": 0.6,
  • "score": 0.92,
  • "is_success": true,
  • "due_date": "2019-08-24",
  • "is_overdue": true,
  • "started_at": "2019-08-24T14:15:22Z",
  • "completed_datetime": "2019-08-24T14:15:22Z",
  • "dropped_at": "2019-08-24T14:15:22Z",
  • "exempted_at": "2019-08-24T14:15:22Z",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "feedback_rating": 4,
  • "attempt": 1,
  • "created": "2019-08-24T14:15:22Z"
}

Drop an assignment

Marks an assignment as dropped. Returns 409 if the assignment is already dropped or completed.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
Reason (string) or Reason (null) (Reason)

Reason for dropping the assignment.

Responses

Request samples

Content type
application/json
{
  • "reason": "string"
}

Response samples

Content type
application/json
{
  • "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
  • "user": {
    },
  • "content_item": {
    },
  • "state": "in_progress",
  • "progress": 0.6,
  • "score": 0.92,
  • "is_success": true,
  • "due_date": "2019-08-24",
  • "is_overdue": true,
  • "started_at": "2019-08-24T14:15:22Z",
  • "completed_datetime": "2019-08-24T14:15:22Z",
  • "dropped_at": "2019-08-24T14:15:22Z",
  • "exempted_at": "2019-08-24T14:15:22Z",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "feedback_rating": 4,
  • "attempt": 1,
  • "created": "2019-08-24T14:15:22Z"
}

Exempt an assignment

Marks an assignment as exempted. Returns 409 if the assignment is not outstanding (already completed, dropped, or exempted).

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{
  • "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
  • "user": {
    },
  • "content_item": {
    },
  • "state": "in_progress",
  • "progress": 0.6,
  • "score": 0.92,
  • "is_success": true,
  • "due_date": "2019-08-24",
  • "is_overdue": true,
  • "started_at": "2019-08-24T14:15:22Z",
  • "completed_datetime": "2019-08-24T14:15:22Z",
  • "dropped_at": "2019-08-24T14:15:22Z",
  • "exempted_at": "2019-08-24T14:15:22Z",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "feedback_rating": 4,
  • "attempt": 1,
  • "created": "2019-08-24T14:15:22Z"
}

Undo a completed assignment

Reverts a completed assignment back to outstanding. Returns 409 if the assignment is not completed.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{
  • "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
  • "user": {
    },
  • "content_item": {
    },
  • "state": "in_progress",
  • "progress": 0.6,
  • "score": 0.92,
  • "is_success": true,
  • "due_date": "2019-08-24",
  • "is_overdue": true,
  • "started_at": "2019-08-24T14:15:22Z",
  • "completed_datetime": "2019-08-24T14:15:22Z",
  • "dropped_at": "2019-08-24T14:15:22Z",
  • "exempted_at": "2019-08-24T14:15:22Z",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "feedback_rating": 4,
  • "attempt": 1,
  • "created": "2019-08-24T14:15:22Z"
}

Undo an exempted assignment

Reverts an exempted assignment back to outstanding. Returns 409 if the assignment is not exempted.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{
  • "public_id": "eb3ce6c7-ce7e-4638-a072-e5054706f601",
  • "user": {
    },
  • "content_item": {
    },
  • "state": "in_progress",
  • "progress": 0.6,
  • "score": 0.92,
  • "is_success": true,
  • "due_date": "2019-08-24",
  • "is_overdue": true,
  • "started_at": "2019-08-24T14:15:22Z",
  • "completed_datetime": "2019-08-24T14:15:22Z",
  • "dropped_at": "2019-08-24T14:15:22Z",
  • "exempted_at": "2019-08-24T14:15:22Z",
  • "expires_at": "2019-08-24T14:15:22Z",
  • "feedback_rating": 4,
  • "attempt": 1,
  • "created": "2019-08-24T14:15:22Z"
}

Content Items

Cross-type content-item endpoints. List, search, update shared metadata (title, visibility, access groups), delete, and bulk archive/unarchive any content item regardless of type.

List content items

Retrieve a paginated list of content items across every type. Supports filtering by content type, visibility, archive status, channel, access group, and created/modified time ranges.

Authorizations:
BearerTokenAuth
query Parameters
Search (string) or Search (null) (Search)

Case-insensitive match on the item's name.

Content Type (string) or Content Type (null) (Content Type)

Filter by content type. Accepts a single value or a comma-separated list, e.g. article or article,video,course.

Is Archived (boolean) or Is Archived (null) (Is Archived)

Filter by archived status.

Is Hidden (boolean) or Is Hidden (null) (Is Hidden)

Filter by visibility.

Created Gte (string) or Created Gte (null) (Created Gte)

Only return items created at or after this ISO-8601 timestamp.

Created Lte (string) or Created Lte (null) (Created Lte)

Only return items created at or before this ISO-8601 timestamp.

Modified Gte (string) or Modified Gte (null) (Modified Gte)

Only return items modified at or after this ISO-8601 timestamp.

Modified Lte (string) or Modified Lte (null) (Modified Lte)

Only return items modified at or before this ISO-8601 timestamp.

Channel (string) or Channel (null) (Channel)

Filter by the channel's public_id.

Group (string) or Group (null) (Group)

Filter by an internal group's public_id (items granting access to it).

page
integer (Page)
Default: 1
page_size
integer (Page Size)
Default: 25

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}

Get a content item

Retrieve a single content item by public_id, regardless of its type.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Response samples

Content type
application/json
{ }

Update a content item's shared metadata

Update the shared, type-agnostic metadata of any content item: title, visibility, and access-group membership. Type-specific fields (e.g. a video's URL, a course's passing score) are edited through the type-specific endpoints.

Omitting groups leaves access-group membership unchanged. Sending [] clears all groups (making the item accessible to everyone, subject to channel rules).

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)
Request Body schema: application/json
required
Name (string) or Name (null) (Name)

The content item's title.

Is Hidden (boolean) or Is Hidden (null) (Is Hidden)

Whether the content item is hidden from the catalog.

Array of Groups (strings) or Groups (null) (Groups)

Replaces the item's access groups with the given list of internal group public_ids. Send [] to clear all groups.

Responses

Request samples

Content type
application/json
{
  • "name": "string",
  • "is_hidden": true,
  • "groups": [
    ]
}

Response samples

Content type
application/json
{ }

Delete a content item

Soft-deletes the content item. Dispatches to the type-specific service so observers and type-specific cleanup run as they do when deleting through the admin UI.

Authorizations:
BearerTokenAuth
path Parameters
public_id
required
string <uuid> (Public Id)

Responses

Bulk archive content items

Archive up to 100 content items in a single request. Each item is processed independently in its own savepoint; per-item failures do not abort the batch. Items already archived count as successes (idempotent).

Authorizations:
BearerTokenAuth
Request Body schema: application/json
required
required
Array of objects (Items) <= 100 items

The content items to operate on. Maximum of 100 items per request.

Responses

Request samples

Content type
application/json
{
  • "items": [
    ]
}

Response samples

Content type
application/json
{ }

Bulk unarchive content items

Restore up to 100 archived content items in a single request. Each item is processed independently in its own savepoint. Items that are not archived count as successes (idempotent).

Authorizations:
BearerTokenAuth
Request Body schema: application/json
required
required
Array of objects (Items) <= 100 items

The content items to operate on. Maximum of 100 items per request.

Responses

Request samples

Content type
application/json
{
  • "items": [
    ]
}

Response samples

Content type
application/json
{ }

Bulk Operations

Endpoints that operate on up to 100 resources in a single request. Per-item failures are isolated — a partial batch returns HTTP 207.

Bulk archive content items

Archive up to 100 content items in a single request. Each item is processed independently in its own savepoint; per-item failures do not abort the batch. Items already archived count as successes (idempotent).

Authorizations:
BearerTokenAuth
Request Body schema: application/json
required
required
Array of objects (Items) <= 100 items

The content items to operate on. Maximum of 100 items per request.

Responses

Request samples

Content type
application/json
{
  • "items": [
    ]
}

Response samples

Content type
application/json
{ }

Bulk unarchive content items

Restore up to 100 archived content items in a single request. Each item is processed independently in its own savepoint. Items that are not archived count as successes (idempotent).

Authorizations:
BearerTokenAuth
Request Body schema: application/json
required
required
Array of objects (Items) <= 100 items

The content items to operate on. Maximum of 100 items per request.

Responses

Request samples

Content type
application/json
{
  • "items": [
    ]
}

Response samples

Content type
application/json
{ }

Enrollments

Enrollments are event-specific registrations that track attendance status, attendance method (in-person or online), and check-in.

List enrollments

Retrieve a paginated list of event enrollments. Supports filtering by user, event, status, attendance method, and creation date range.

Authorizations:
BearerTokenAuth
query Parameters
User (string) or User (null) (User)

Filter by user public_id.

Event (string) or Event (null) (Event)

Filter by event public_id.

Status (string) or Status (null) (Status)

Filter by enrollment status.

Attendance Method (string) or Attendance Method (null) (Attendance Method)

Filter by attendance method.

Created Gte (string) or Created Gte (null) (Created Gte)

Filter enrollments created at or after this ISO-8601 timestamp.

Created Lte (string) or Created Lte (null) (Created Lte)

Filter enrollments created at or before this ISO-8601 timestamp.

page
integer (Page)
Default: 1
page_size
integer (Page Size)
Default: 25

Responses

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "meta": {
    }
}