openapi: 3.0.3
info:
title: Teachfloor
description: ''
version: 1.0.0
servers:
-
url: 'https://api.teachfloor.com'
paths:
'/v0/activities/{id}':
get:
summary: 'Retrieve an Activity'
description: "Retrieves the details of an existing activity in your organization based on the provided unique activity ID. The response includes comprehensive information about the activity, such as its score, timestamps, associated element details, and related metadata.\n
If the activity is performed by an individual, the member key contains the details of the member who completed the activity.\n
If the activity is performed by a group, the members key provides a list of all members who participated in the activity.\n
The meta object contains additional details and metadata about the activity's completion status. It provides context on the outcome and participant of the activity."
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n\"error\": null,\n\"payload\": {\n \"id\": \"KwJ8VgrmlAp4PBnM\",\n \"object\": \"activity\",\n \"timestamp\" : \"2022-11-27T13:52:02.000000Z\",\n \"status\": \"PASSED\",\n \"passed\": true,\n \"score\": 100,\n \"completed_by\": \"6K8vojJn1xe14abL\",\n \"member\": {\n \"id\": \"6K8vojJn1xe14abL\",\n \"object\": \"member\",\n \"first_name\": \"Adalberto\",\n \"last_name\": \"Bruen\",\n \"full_name\": \"Adalberto Bruen\",\n \"avatar\": null,\n \"email\": \"iva52@example.org\",\n \"is_email_verified\": true,\n \"last_seen\": \"2024-11-27T13:51:52.000000Z\"\n },\n \"context\": {\n \"id\": \"QB8nmEJjqdbLA2K5\",\n \"object\": \"element\",\n \"created_at\": \"2024-11-26T11:37:16.000000Z\",\n \"name\": \"Multiple Choice Quiz\",\n \"cover\": null,\n \"type\": \"QUIZ\",\n \"position\": 3,\n \"course\": \"B4peAvmZ1L9OY3Xr\",\n \"module\": \"no0aApWNyRMD68rv\",\n \"metadata\": {}\n }\n}"
tags:
- Activities
parameters:
-
in: path
name: id
description: 'The ID of the requested activity.'
example: p5v87ERWKR3dkjyD
required: true
schema:
type: string
/v0/activities:
get:
summary: 'List all Activities'
description: "Returns a list of activities within your organization. The activities are sorted by their creation date, with the most recently created activities appearing first. Each activity in the list includes information such as the score, dates, element data and more.\n
If the activity is performed by an individual, the member key contains the details of the member who completed the activity.\n
If the activity is performed by a group, the members key provides a list of all members who participated in the activity."
parameters:
-
in: query
name: course
description: 'The unique ID to filter activities by course'
example: B4peAvmZ1L9OY3Xr
required: false
schema:
type: string
description: 'The unique ID to filter activities by course'
example: B4peAvmZ1L9OY3Xr
-
in: query
name: module
description: 'The unique ID to filter activities by module'
example: no0aApWNyRMD68rv
required: false
schema:
type: string
description: 'The unique ID to filter activities by module'
example: no0aApWNyRMD68rv
-
in: query
name: element
description: 'The unique ID to filter activities by element'
example: QB8nmEJjqdbLA2K5
required: false
schema:
type: string
description: 'The unique ID to filter activities by element'
example: QB8nmEJjqdbLA2K5
-
in: query
name: member
description: 'The unique ID to filter activities by member'
example: 6K8vojJn1xe14abL
required: false
schema:
type: string
description: 'The unique ID to filter activities by member'
example: 6K8vojJn1xe14abL
-
in: query
name: page
description: 'A cursor for pagination across multiple pages of results.'
example: 2
required: false
schema:
type: integer
description: 'A cursor for pagination across multiple pages of results.'
example: 2
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n\"error\": null,\n\"payload\": {\n \"data\": [\n {\n \"id\": \"KwJ8VgrmlAp4PBnM\",\n \"object\": \"activity\",\n \"timestamp\" : \"2022-11-27T13:52:02.000000Z\",\n \"status\": \"PASSED\",\n \"passed\": true,\n \"score\": 100,\n \"completed_by\": \"6K8vojJn1xe14abL\",\n \"member\": {\n \"id\": \"6K8vojJn1xe14abL\",\n \"object\": \"member\",\n \"first_name\": \"Adalberto\",\n \"last_name\": \"Bruen\",\n \"full_name\": \"Adalberto Bruen\",\n \"avatar\": null,\n \"email\": \"iva52@example.org\",\n \"is_email_verified\": true,\n \"last_seen\": \"2024-11-27T13:51:52.000000Z\"\n },\n \"context\": {\n \"id\": \"QB8nmEJjqdbLA2K5\",\n \"object\": \"element\",\n \"created_at\": \"2024-11-26T11:37:16.000000Z\",\n \"name\": \"Multiple Choice Quiz\",\n \"cover\": null,\n \"type\": \"QUIZ\",\n \"position\": 3,\n \"course\": \"B4peAvmZ1L9OY3Xr\",\n \"module\": \"no0aApWNyRMD68rv\",\n \"metadata\": {}\n }\n },\n {...},\n {...},\n ],\n \"pagination\": {\n \"total\": 3,\n \"count\": 3,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 1\n }\n}"
tags:
- Activities
/v0/courses/search:
get:
summary: 'Search Courses'
description: 'Search for existing courses in your organization. You can search by course name. The search is case-insensitive and supports partial matches.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"p5v87ERWKR3dkjyD\",\n \"object\": \"course\",\n \"name\": \"Ultimate Marketing Course\",\n \"status\": \"PUBLISHED\",\n \"created_at\": \"2022-02-03T16:06:42.000000Z\",\n \"cover\": null,\n \"availability\": \"CONTINUOUS\",\n \"visibility\": \"PRIVATE\",\n \"start_date\": null,\n \"end_date\": null,\n \"currency\": \"eur\",\n \"price\": null,\n \"url\": null,\n \"public_url\": null,\n \"join_url\": null,\n \"metadata\": {},\n \"custom_fields\": {\n \"field_1\": {\n \"key\": \"field_1\",\n \"object\": \"custom-field\",\n \"created_at\": \"2024-07-30T16:05:47.000000Z\",\n \"name\": \"Multiple Field Question\",\n \"description\": null,\n \"type\": \"MULTIPLE_OPTIONS\",\n \"options\": [\n \"Option A\",\n \"Option B\",\n \"Option C\"\n ],\n \"required\": false\n }\n }\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 5,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 1\n }\n }\n}"
tags:
- Courses
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
q:
type: string
description: 'The search query to filter courses by name.'
example: Marketing
required:
- q
'/v0/courses/{id}':
get:
summary: 'Retrieve a Course'
description: 'Retrieves the details of an existing course in your organization based on the provided unique course ID. Returns a comprehensive information about the course, including its name, availability, status, dates, and more.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: p5v87ERWKR3dkjyD
object: course
name: 'Ultimate Marketing Course'
status: PUBLISHED
created_at: '2022-02-03T16:06:42.000000Z'
cover: null
availability: CONTINUOUS
visibility: PRIVATE
start_date: null
end_date: null
currency: eur
price: null
content: null
url: null
public_url: null
join_url: null
metadata: { }
custom_fields:
field_1:
key: field_1
object: custom-field
created_at: '2024-07-30T16:05:47.000000Z'
name: 'Multiple Field Question'
description: null
type: MULTIPLE_OPTIONS
options:
- 'Option A'
- 'Option B'
- 'Option C'
required: false
properties:
error:
type: string
example: null
payload:
type: object
example:
id: p5v87ERWKR3dkjyD
object: course
name: 'Ultimate Marketing Course'
status: PUBLISHED
created_at: '2022-02-03T16:06:42.000000Z'
cover: null
availability: CONTINUOUS
visibility: PRIVATE
start_date: null
end_date: null
currency: eur
price: null
content: null
url: null
public_url: null
join_url: null
metadata: { }
custom_fields:
field_1:
key: field_1
object: custom-field
created_at: '2024-07-30T16:05:47.000000Z'
name: 'Multiple Field Question'
description: null
type: MULTIPLE_OPTIONS
options:
- 'Option A'
- 'Option B'
- 'Option C'
required: false
tags:
- Courses
post:
summary: 'Update a Course'
description: 'Updates the details of an existing course in your organization based on the provided unique course ID. Any parameters not provided will be left unchanged. Returns the updated course details upon successful update.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: p5v87ERWKR3dkjyD
object: course
name: 'Ultimate Marketing Course'
status: PUBLISHED
created_at: '2022-02-03T16:06:42.000000Z'
cover: null
availability: CONTINUOUS
visibility: PRIVATE
start_date: null
end_date: null
currency: eur
price: null
content: "# Introduction\nWelcome to the **Ultimate Marketing Course**."
url: null
public_url: null
join_url: null
metadata: { }
custom_fields:
field_1:
key: field_1
object: custom-field
created_at: '2024-07-30T16:05:47.000000Z'
name: 'Multiple Field Question'
description: null
type: MULTIPLE_OPTIONS
options:
- 'Option A'
- 'Option B'
- 'Option C'
required: false
properties:
error:
type: string
example: null
payload:
type: object
example:
id: p5v87ERWKR3dkjyD
object: course
name: 'Ultimate Marketing Course'
status: PUBLISHED
created_at: '2022-02-03T16:06:42.000000Z'
cover: null
availability: CONTINUOUS
visibility: PRIVATE
start_date: null
end_date: null
currency: eur
price: null
content: "# Introduction\nWelcome to the **Ultimate Marketing Course**."
url: null
public_url: null
join_url: null
metadata: { }
custom_fields:
field_1:
key: field_1
object: custom-field
created_at: '2024-07-30T16:05:47.000000Z'
name: 'Multiple Field Question'
description: null
type: MULTIPLE_OPTIONS
options:
- 'Option A'
- 'Option B'
- 'Option C'
required: false
tags:
- Courses
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The course name. Must not be greater than 255 characters.'
example: 'Ultimate Marketing Course'
content:
type: string
description: 'The course content in markdown format. Supports headings, bold, italic, strikethrough, highlights, inline code, code blocks, blockquotes, lists, tables, images, links, and math (LaTeX).'
example: '# Introduction\nWelcome to the **Ultimate Marketing Course**.'
availability:
type: string
description: 'The course availability. Must be one of: CONTINUOUS, SCHEDULED. Must be one of CONTINUOUS or SCHEDULED.'
example: CONTINUOUS
start_date:
type: string
description: 'If the course availability is set to SCHEDULED, this defines the course schedule start. Specify the date in `YYYY-MM-DD` format. This field is required when availability is SCHEDULED. Must be a valid date.'
example: '2023-07-12'
end_date:
type: string
description: 'If the course availability is set to SCHEDULED, this defines the course schedule end. Specify the date in `YYYY-MM-DD` format. This field is required when availability is SCHEDULED or date. Must be a date after or equal to start_date.'
example: '2023-07-26'
visibility:
type: string
description: 'The course visibility inside your organization. A course with PUBLIC visibility is shown to all the members of your organization. A course with PRIVATE visibility is shown only to the members of the course but is hidden by the other members of your organization. Must be one of PUBLIC or PRIVATE.'
example: PRIVATE
metadata:
type: string
description: 'Metadata is an attribute that lets you store more information, structured as key-value pairs, for your own use and reference.
You can specify up to 50 keys, with key names up to 40 characters long and values up to 500 characters long. Keys and values are stored as strings and can contain any characters with one exception: you can''t use square brackets ([ and ]) in keys.'
example:
category: marketing
delete:
summary: 'Delete a Course'
description: 'Deletes a course in your organization. Returns an object with a deleted parameter upon successful deletion.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"id\": \"p5v87ERWKR3dkjyD\",\n \"object\": \"course\",\n \"deleted\": true,\n }\n}"
tags:
- Courses
parameters:
-
in: path
name: id
description: 'The ID of the requested course.'
example: p5v87ERWKR3dkjyD
required: true
schema:
type: string
/v0/courses:
get:
summary: 'List all Courses'
description: 'Returns a list of courses within your organization. The courses are sorted by their creation date, with the most recently created courses appearing first. Each course in the list includes information such as the course name, availability, status, dates, and more.'
parameters:
-
in: query
name: page
description: 'A cursor for pagination across multiple pages of results.'
example: 2
required: false
schema:
type: integer
description: 'A cursor for pagination across multiple pages of results.'
example: 2
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"p5v87ERWKR3dkjyD\",\n \"object\": \"course\",\n \"name\": \"Ultimate Marketing Course\",\n \"status\": \"PUBLISHED\",\n \"created_at\": \"2022-02-03T16:06:42.000000Z\",\n \"cover\": null,\n \"availability\": \"CONTINUOUS\",\n \"visibility\": \"PRIVATE\",\n \"start_date\": null,\n \"end_date\": null,\n \"currency\": \"eur\",\n \"price\": null,\n \"url\": null,\n \"public_url\": null,\n \"join_url\": null,\n \"metadata\": {},\n \"custom_fields\": {\n \"field_1\": {\n \"key\": \"field_1\",\n \"object\": \"custom-field\",\n \"created_at\": \"2024-07-30T16:05:47.000000Z\",\n \"name\": \"Multiple Field Question\",\n \"description\": null,\n \"type\": \"MULTIPLE_OPTIONS\",\n \"options\": [\n \"Option A\",\n \"Option B\",\n \"Option C\"\n ],\n \"required\": false\n }\n }\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 15,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 2\n }\n }\n}"
tags:
- Courses
post:
summary: 'Create a Course'
description: 'Creates a course in your organization. Returns the created course details upon successful creation.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: p5v87ERWKR3dkjyD
object: course
name: 'Ultimate Marketing Course'
status: PUBLISHED
created_at: '2022-02-03T16:06:42.000000Z'
cover: null
availability: CONTINUOUS
visibility: PRIVATE
start_date: null
end_date: null
currency: eur
price: null
content: "# Introduction\nWelcome to the **Ultimate Marketing Course**."
url: null
public_url: null
join_url: null
metadata: { }
custom_fields:
field_1:
key: field_1
object: custom-field
created_at: '2024-07-30T16:05:47.000000Z'
name: 'Multiple Field Question'
description: null
type: MULTIPLE_OPTIONS
options:
- 'Option A'
- 'Option B'
- 'Option C'
required: false
properties:
error:
type: string
example: null
payload:
type: object
example:
id: p5v87ERWKR3dkjyD
object: course
name: 'Ultimate Marketing Course'
status: PUBLISHED
created_at: '2022-02-03T16:06:42.000000Z'
cover: null
availability: CONTINUOUS
visibility: PRIVATE
start_date: null
end_date: null
currency: eur
price: null
content: "# Introduction\nWelcome to the **Ultimate Marketing Course**."
url: null
public_url: null
join_url: null
metadata: { }
custom_fields:
field_1:
key: field_1
object: custom-field
created_at: '2024-07-30T16:05:47.000000Z'
name: 'Multiple Field Question'
description: null
type: MULTIPLE_OPTIONS
options:
- 'Option A'
- 'Option B'
- 'Option C'
required: false
tags:
- Courses
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The course name. Must not be greater than 255 characters.'
example: 'Ultimate Marketing Course'
content:
type: string
description: 'The course content in markdown format. Supports headings, bold, italic, strikethrough, highlights, inline code, code blocks, blockquotes, lists, tables, images, links, and math (LaTeX).'
example: '# Introduction\nWelcome to the **Ultimate Marketing Course**.'
availability:
type: string
description: 'The course availability. Must be one of: CONTINUOUS, SCHEDULED. Must be one of CONTINUOUS or SCHEDULED.'
example: CONTINUOUS
start_date:
type: string
description: 'If the course availability is set to SCHEDULED, this defines the course schedule start. Specify the date in `YYYY-MM-DD` format. This field is required when availability is SCHEDULED. Must be a valid date.'
example: '2023-07-12'
end_date:
type: string
description: 'If the course availability is set to SCHEDULED, this defines the course schedule end. Specify the date in `YYYY-MM-DD` format. This field is required when availability is SCHEDULED or date. Must be a date after or equal to start_date.'
example: '2023-07-26'
visibility:
type: string
description: 'The course visibility inside your organization. A course with PUBLIC visibility is shown to all the members of your organization. A course with PRIVATE visibility is shown only to the members of the course but is hidden by the other members of your organization. Must be one of PUBLIC or PRIVATE.'
example: PRIVATE
metadata:
type: string
description: 'Metadata is an attribute that lets you store more information, structured as key-value pairs, for your own use and reference.
You can specify up to 50 keys, with key names up to 40 characters long and values up to 500 characters long. Keys and values are stored as strings and can contain any characters with one exception: you can''t use square brackets ([ and ]) in keys.'
example:
category: marketing
'/v0/courses/{id}/join':
post:
summary: 'Join a Course'
description: 'Joins a member in one of your courses.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload: null
properties:
error:
type: string
example: null
payload:
type: string
example: null
tags:
- Courses
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
member:
type: string
description: 'The unique ID of the member who is being added to the course.'
example: e7W6kP8wvjd3GRBz
role:
type: string
description: 'The role to assign to the member inside the course. If not set the member will be enrolled to the course as a customer. To assign an instructor or assiatant to the course use `lecturer` or `assistant`. Must be one of customer, lecturer, or assistant.'
example: customer
required:
- member
parameters:
-
in: path
name: id
description: 'The ID of the course to enroll.'
example: p5v87ERWKR3dkjyD
required: true
schema:
type: string
'/v0/courses/{id}/revoke':
post:
summary: 'Revoke Course Access'
description: 'Revokes a member access to a course.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload: null
properties:
error:
type: string
example: null
payload:
type: string
example: null
tags:
- Courses
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
member:
type: string
description: 'The ID of the member to revoke access to the course.'
example: e7W6kP8wvjd3GRBz
required:
- member
parameters:
-
in: path
name: id
description: 'The ID of the course from which the member should be revoked.'
example: p5v87ERWKR3dkjyD
required: true
schema:
type: string
'/v0/courses/{id}/members':
get:
summary: 'List all Course Members'
description: 'Returns a list of members within the course.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"6jO9XN7mZEVpvxqo\",\n \"object\": \"course_member\",\n \"joined_at\": \"2024-01-22T12:56:04.000000Z\",\n \"member\": {\n \"id\": \"e7W6kP8wvjd3GRBz\",\n \"object\": \"member\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"full_name\": \"John Doe\",\n \"avatar\": null,\n \"email\": null,\n \"is_email_verified\": false,\n \"last_seen\": \"2024-01-22T12:56:04.000000Z\"\n },\n \"course\": {\n \"id\": \"p5v87ERWKR3dkjyD\",\n \"object\": \"course\",\n \"name\": \"Ultimate Marketing Course\",\n \"status\": \"PUBLISHED\",\n \"created_at\": \"2022-02-03T16:06:42.000000Z\",\n \"cover\": null,\n \"availability\": \"CONTINUOUS\",\n \"visibility\": \"PRIVATE\",\n \"start_date\": null,\n \"end_date\": null,\n \"currency\": \"eur\",\n \"price\": null,\n \"url\": null,\n \"public_url\": null,\n \"join_url\": null,\n \"metadata\": {},\n \"custom_fields\": {\n \"field_1\": {\n \"key\": \"field_1\",\n \"object\": \"custom-field\",\n \"created_at\": \"2024-07-30T16:05:47.000000Z\",\n \"name\": \"Multiple Field Question\",\n \"description\": null,\n \"type\": \"MULTIPLE_OPTIONS\",\n \"options\": [\n \"Option A\",\n \"Option B\",\n \"Option C\"\n ],\n \"required\": false\n }\n }\n },\n \"custom_fields\": {\n \"field_1\": [\n \"Option A\",\n \"Option B\"\n ]\n }\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 15,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 2\n }\n }\n}"
tags:
- Courses
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
include_test_user:
type: boolean
description: 'Include test users to the results if set to true.'
example: false
parameters:
-
in: path
name: id
description: 'The ID of the course from which the members should be retrieved.'
example: p5v87ERWKR3dkjyD
required: true
schema:
type: string
'/v0/courses/{id}/modules':
get:
summary: 'List all Course Modules'
description: 'Returns a list of modules within the course.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"LZ6dN0DGgBD3QjxB\",\n \"object\": \"module\",\n \"created_at\": \"2024-01-22T12:55:11.000000Z\",\n \"name\": \"Lesson #1\",\n \"type\": \"LESSON\",\n \"availability\": \"CONTINUOUS\",\n \"position\": 0,\n \"course\": \"B4peAvmZ1L9OY3Xr\",\n \"metadata\": {}\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 15,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 2\n }\n }\n}"
tags:
- Courses
parameters:
-
in: path
name: id
description: 'The ID of the course from which the modules should be retrieved.'
example: LZ6dN0DGgBD3QjxB
required: true
schema:
type: string
'/v0/courses/{id}/elements':
get:
summary: 'List all Course Elements'
description: 'Returns a list of elements within the course.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"WYxKj5OlrekVAGr7\",\n \"object\": \"element\",\n \"created_at\": \"2024-01-22T12:55:11.000000Z\",\n \"name\": \"Introduction\",\n \"cover\": null,\n \"type\": \"CONTENT\",\n \"position\": 0,\n \"module\": \"LZ6dN0DGgBD3QjxB\",\n \"metadata\": {},\n \"properties\": {}\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 15,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 2\n }\n }\n}"
tags:
- Courses
parameters:
-
in: path
name: id
description: 'The ID of the course from which the elements should be retrieved.'
example: WYxKj5OlrekVAGr7
required: true
schema:
type: string
'/v0/courses/{id}/members/{member_id}':
get:
summary: 'Retrieve a Course Member'
description: 'Retrieves the details of a specific member in a course, including their progress data.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: 6jO9XN7mZEVpvxqo
object: course_member
joined_at: '2024-01-22T12:56:04.000000Z'
member:
id: e7W6kP8wvjd3GRBz
object: member
first_name: John
last_name: Doe
full_name: 'John Doe'
avatar: null
email: john@example.com
is_email_verified: true
last_seen: '2024-01-22T12:56:04.000000Z'
course:
id: p5v87ERWKR3dkjyD
object: course
name: 'Ultimate Marketing Course'
custom_fields: { }
progress:
is_completed: false
completion_percentage: 65
completed_elements_count: 8
total_elements_count: 12
completed_modules_count: 3
total_modules_count: 5
started_at: '2024-01-22T12:56:04.000000Z'
completed_at: null
properties:
error:
type: string
example: null
payload:
type: object
example:
id: 6jO9XN7mZEVpvxqo
object: course_member
joined_at: '2024-01-22T12:56:04.000000Z'
member:
id: e7W6kP8wvjd3GRBz
object: member
first_name: John
last_name: Doe
full_name: 'John Doe'
avatar: null
email: john@example.com
is_email_verified: true
last_seen: '2024-01-22T12:56:04.000000Z'
course:
id: p5v87ERWKR3dkjyD
object: course
name: 'Ultimate Marketing Course'
custom_fields: { }
progress:
is_completed: false
completion_percentage: 65
completed_elements_count: 8
total_elements_count: 12
completed_modules_count: 3
total_modules_count: 5
started_at: '2024-01-22T12:56:04.000000Z'
completed_at: null
tags:
- Courses
parameters:
-
in: path
name: id
description: 'The ID of the course.'
example: p5v87ERWKR3dkjyD
required: true
schema:
type: string
-
in: path
name: member_id
description: 'The ID of the member.'
example: e7W6kP8wvjd3GRBz
required: true
schema:
type: string
'/v0/elements/{id}/activities':
get:
summary: 'List all activites'
description: 'Returns a list of activites related to the element.
If the activity is performed by an individual, the member key contains the details of the member who completed the activity.
If the activity is performed by a group, the members key provides a list of all members who participated in the activity.'
parameters:
-
in: query
name: member
description: 'The unique ID of the member to filter activities for.'
example: 6K8vojJn1xe14abL
required: false
schema:
type: string
description: 'The unique ID of the member to filter activities for.'
example: 6K8vojJn1xe14abL
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n\"error\": null,\n\"payload\": {\n \"data\": [\n {\n \"id\": \"KwJ8VgrmlAp4PBnM\",\n \"object\": \"activity\",\n \"timestamp\" : \"2022-11-27T13:52:02.000000Z\",\n \"status\": \"PASSED\",\n \"passed\": true,\n \"score\": 100,\n \"completed_by\": \"6K8vojJn1xe14abL\",\n \"member\": {\n \"id\": \"6K8vojJn1xe14abL\",\n \"object\": \"member\",\n \"first_name\": \"Adalberto\",\n \"last_name\": \"Bruen\",\n \"full_name\": \"Adalberto Bruen\",\n \"avatar\": null,\n \"email\": \"iva52@example.org\",\n \"is_email_verified\": true,\n \"last_seen\": \"2024-11-27T13:51:52.000000Z\"\n },\n \"context\": {\n \"id\": \"QB8nmEJjqdbLA2K5\",\n \"object\": \"element\",\n \"created_at\": \"2024-11-26T11:37:16.000000Z\",\n \"name\": \"Multiple Choice Quiz\",\n \"cover\": null,\n \"type\": \"QUIZ\",\n \"content\": null,\n \"position\": 3,\n \"course\": \"B4peAvmZ1L9OY3Xr\",\n \"module\": \"no0aApWNyRMD68rv\",\n \"metadata\": {},\n \"properties\": {\n \"passing_score\": 70,\n \"completion_trigger\": \"on_pass\"\n }\n },\n },\n {...},\n {...},\n ],\n \"pagination\": {\n \"total\": 3,\n \"count\": 3,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 1\n }\n}"
tags:
- Elements
parameters:
-
in: path
name: id
description: 'The ID of the element to retrieve an activities.'
example: e7W6kP8wvjd3GRBz
required: true
schema:
type: string
/v0/elements:
post:
summary: 'Create element'
description: 'Creates an element in the specified module. Returns the created element details upon successful creation.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
data:
id: QB8nmEJjqdbLA2K5
object: element
created_at: '2024-11-26T11:37:16.000000Z'
name: 'Multiple Choice Quiz'
cover: null
type: QUIZ
content: null
position: 3
course: B4peAvmZ1L9OY3Xr
module: no0aApWNyRMD68rv
metadata: { }
properties:
passing_score: 70
completion_trigger: on_pass
properties:
error:
type: string
example: null
payload:
type: object
example:
data:
id: QB8nmEJjqdbLA2K5
object: element
created_at: '2024-11-26T11:37:16.000000Z'
name: 'Multiple Choice Quiz'
cover: null
type: QUIZ
content: null
position: 3
course: B4peAvmZ1L9OY3Xr
module: no0aApWNyRMD68rv
metadata: { }
properties:
passing_score: 70
completion_trigger: on_pass
tags:
- Elements
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The element name. Must not be greater than 255 characters.'
example: 'First knowledge'
content:
type: string
description: 'The element content in markdown format. Supports headings, bold, italic, strikethrough, highlights, inline code, code blocks, blockquotes, lists, tables, images, links, and math (LaTeX).'
example: '# Element Introduction\nWelcome to the **first element**.'
module:
type: string
description: 'The module id of the element.'
example: no0aApWNyRMD68rv
position:
type: integer
description: 'The 0-indexed position of the element within its module. If omitted, the element is appended at the end. Values beyond the last sibling index are clamped to the last position. Siblings are re-ordered automatically. Must be at least 0.'
example: 0
type:
type: string
description: 'The element type. Must be one of: CONTENT, VIDEO, ZOOM_MEETING, MEETING_LINK, QUIZ, SUBMISSION, GROUP_SUBMISSION, EMBED, SURVEY, SCORM, CERTIFICATE, TAG, DATACAMP, SELF_REVIEW, PEER_REVIEW, FEEDBACK_REFLECTION, INSTRUCTOR_REVIEW, INSTRUCTOR_DISCUSSION, AI_REVIEW, CHECKLIST, DISCUSSION, FILE, GROUP_FORMATION, FORM, SCORE, GROUP_PEER_REVIEW, GROUP_FEEDBACK_REFLECTION, MICROSOFT_TEAMS_MEETING.'
example: QUIZ
metadata:
type: string
description: 'Metadata is an attribute that lets you store more information, structured as key-value pairs, for your own use and reference.
You can specify up to 50 keys, with key names up to 40 characters long and values up to 500 characters long. Keys and values are stored as strings and can contain any characters with one exception: you can''t use square brackets ([ and ]) in keys.'
example:
category: marketing
properties:
type: string
description: 'Type-specific properties for the element. The accepted keys depend on the element type. Unknown keys will be rejected with a validation error.
Supported element types and their properties:
VIDEO
• video_url (string) — The video URL. Supports Vimeo, YouTube, and direct video URLs.
• video_type (string) — The video source type. Must be set to URL when updating the video_url. Must be one of: URL, SOURCE.
QUIZ
• passing_score (integer) — The minimum passing score (0-100).
• completion_trigger (string) — When the quiz should be marked as complete. Must be one of: on_pass, on_submit.
• questions (array) — The quiz questions. Full replacement — the entire questions array is replaced on update. Include existing question/answer IDs to preserve links to student responses. Omit IDs to auto-generate new ones.
Questions
The questions property accepts an array of question objects. The entire questions array is replaced on every update (full replacement, not merge).
Important — Question and Answer IDs:
Each question and answer has an id field. These IDs link to student responses, activity records, and grades. When updating questions:
• Include the id to preserve an existing question/answer and maintain links to student data.
• Omit the id to create a new question/answer with an auto-generated ID.
• Questions/answers not included in the array will be removed.
• If you change or omit an existing ID, the link to student responses for that question/answer will be broken.
Question object:
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• text (string, required) — The question text.
• shuffle (boolean, optional) — Whether to shuffle answer order. Default: false.
• require_all_correct (boolean, optional) — Require all correct answers selected (multi-choice). Default: false.
• answers (array, required) — Array of answer objects.
Answer object:
• id (string, optional) — Existing answer ID to preserve. Omit for new answers.
• text (string, required) — The answer text.
• is_correct (boolean, required) — Whether this is a correct answer.
EMBED
• embed (string) — The embed code.
FILE
• file_url (string) — The file URL.
SUBMISSION
• questions (array) — The submission questions. Full replacement on update. Each question defines which response types (text, file) are accepted.
Questions
The questions property accepts an array of question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question defines which response types (text, file) are accepted.
Question object:
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• text (string, required) — The question text.
• accept_text (boolean, optional) — Whether text responses are accepted. Default: true.
• text_required (boolean, optional) — Whether text response is required. Default: false.
• accept_file (boolean, optional) — Whether file uploads are accepted. Default: false.
• file_required (boolean, optional) — Whether file upload is required. Default: false.
• file_multiple (boolean, optional) — Whether multiple files can be uploaded. Default: false.
GROUP_SUBMISSION
• questions (array) — The submission questions. Full replacement on update. Each question defines which response types (text, file) are accepted.
Questions
The questions property accepts an array of question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question defines which response types (text, file) are accepted.
Question object:
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• text (string, required) — The question text.
• accept_text (boolean, optional) — Whether text responses are accepted. Default: true.
• text_required (boolean, optional) — Whether text response is required. Default: false.
• accept_file (boolean, optional) — Whether file uploads are accepted. Default: false.
• file_required (boolean, optional) — Whether file upload is required. Default: false.
• file_multiple (boolean, optional) — Whether multiple files can be uploaded. Default: false.
SURVEY
• questions (array) — The survey questions. Full replacement on update. Each question has a text and a list of options participants can choose from.
Questions
The questions property accepts an array of survey (poll-style) questions. The entire questions array is replaced on every update (full replacement, not merge). Each question has a text and a list of answer options participants can choose from. There are no correct answers and no scoring.
Question object:
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• text (string, required) — The question text.
• options (array, required) — Answer options (at least 2).
Option object:
• id (string, optional) — Existing option ID to preserve.
• text (string, required) — The option text.
FORM
• questions (array) — The form questions. Full replacement — the entire questions array is replaced on update. Each question has a type that determines its structure.
Questions
The questions property accepts an array of question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, NUMBER_SCALE, MULTIPLE_CHOICE, STACK_RANK, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT type additional fields:
• min_words (integer, optional) — Minimum word count. Default: 1.
NUMBER_SCALE type additional fields:
• range_min (integer, optional) — Scale minimum value. Default: 1.
• range_max (integer, optional) — Scale maximum value. Default: 10.
MULTIPLE_CHOICE / STACK_RANK type additional fields:
• options (array, required) — Array of option objects.
Option object:
• id (string, optional) — Existing option ID to preserve.
• text (string, required) — The option text.
MEETING_LINK
• meeting_url (string) — The meeting URL.
• start_date (string) — The meeting start date (ISO 8601 format).
• end_date (string) — The meeting end date (ISO 8601 format).
ZOOM_MEETING
• start_date (string) — The meeting start date (ISO 8601 format).
• end_date (string) — The meeting end date (ISO 8601 format).
• meeting_reports (boolean) — Whether attendance tracking is enabled.
MICROSOFT_TEAMS_MEETING
• start_date (string) — The meeting start date (ISO 8601 format).
• end_date (string) — The meeting end date (ISO 8601 format).
• meeting_reports (boolean) — Whether attendance tracking is enabled.
DISCUSSION
• restrict_posts_to (string) — Who can create top-level posts. "everyone" allows learners and lecturers to post; "lecturers" restricts top-level posts to lecturers only (learners can still comment on existing posts). Must be one of: everyone, lecturers.
• completion_rules (object) — Rules that determine when the discussion is marked complete for a learner. Operator joins multiple rules. Each rule has a type (POST or COMMENT) and a count. Each rule type can appear at most once.
SCORM
• scorm_url (string) — The URL of the uploaded SCORM package file.
• scorm_user_identifier (string) — The identifier used to track learners. Must be one of: user_id, user_email.
GROUP_FORMATION
• min_members (integer) — Minimum number of members per group. Must be a positive integer.
• max_members (integer) — Maximum number of members per group. Must be a positive integer and greater than or equal to "min_members".
• restrict_group_creation_to (string) — Who can create groups within this element. "everyone" allows learners and lecturers to create groups; "lecturers" restricts group creation to lecturers only. Must be one of: everyone, lecturers.
• group_threads_enabled (boolean) — Whether each group has its own discussion thread for internal communication. When enabled, group members can post and reply within a thread scoped to their group.
CHECKLIST
• questions (array) — The checklist items. Full replacement on update. Each item is a simple { id?, text } object.
Questions
The questions property accepts an array of checklist items. The entire items array is replaced on every update (full replacement, not merge). Each item is a simple object with a text field.
Item object:
• id (string, optional) — Existing item ID to preserve. Omit for new items.
• text (string, required) — The checklist item text.
SCORE
• passing_score (integer) — The score (as a percentage, 0–100) a learner must reach to pass this element. Compared against the learner''s computed average using "passing_score_comparator".
• passing_score_comparator (string) — How the learner''s computed average is compared against "passing_score". Example: "greater_than_or_equal" with passing_score=70 means a learner passes when their average is at least 70. Must be one of: greater_than, greater_than_or_equal, equal_to, less_than, less_than_or_equal.
• incomplete_inputs_handling (string) — How inputs the learner has not yet completed contribute to the weighted average. "ignore" drops them from the denominator (no effect); "score_as_zero" counts them as 0 with full weight (drags the average down). Must be one of: ignore, score_as_zero.
• inputs (array) — The source elements that contribute to the weighted average. Full replacement on every update — the entire array supersedes the previous set. See the SCORE inputs schema for the input object structure. Each input''s weight must be a positive integer; zero or fractional weights are rejected.
Inputs
The inputs property accepts an array of input objects that contribute to the weighted average. The entire inputs array is replaced on every update (full replacement, not merge). Each input references a source element in the same course, optionally graded by a review element''s rubric (quality-based scoring), with a weight in the average.
Input object:
• element (string, required) — Hash ID of the source element being graded. Must belong to the same course as the SCORE element.
• weight (integer, optional) — Weight in the weighted average. Must be a positive integer greater than 0. Default: 1. Zero or fractional weights are rejected.
• scored_via (string, optional) — Hash ID of a review element whose rubric grades the source (quality-based scoring). The valid pairings are restricted because only certain source types support being graded via a review element:
• If element is a SUBMISSION, scored_via must be a PEER_REVIEW, AI_REVIEW, or INSTRUCTOR_REVIEW.
• If element is a PEER_REVIEW, scored_via must be a FEEDBACK_REFLECTION.
• For any other source type, scored_via is not allowed and will be rejected.
PEER_REVIEW
• source (object) — The submission element being reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
SELF_REVIEW
• source (object) — The submission element being self-reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a SUBMISSION element in the same course.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
INSTRUCTOR_REVIEW
• source (object) — The submission element being reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a SUBMISSION or GROUP_SUBMISSION element in the same course.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION or GROUP_SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
INSTRUCTOR_DISCUSSION
• source (object) — The submission element being discussed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a SUBMISSION or GROUP_SUBMISSION element in the same course.
Source
The source property references the submission element being discussed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION or GROUP_SUBMISSION and must belong to the same course.
AI_REVIEW
• source (object) — The submission element being reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a SUBMISSION element in the same course.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
FEEDBACK_REFLECTION
• source (object) — The peer review element this reflection is linked to. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a PEER_REVIEW element in the same course.
• questions (array) — The reflection questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the peer review element this reflection is linked to. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type PEER_REVIEW and must belong to the same course.
Questions
The questions property accepts an array of reflection question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
GROUP_PEER_REVIEW
• source (object) — The group submission element being reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type GROUP_SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
GROUP_FEEDBACK_REFLECTION
• source (object) — The group peer review element this reflection is linked to. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a GROUP_PEER_REVIEW element in the same course.
• questions (array) — The reflection questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the peer review element this reflection is linked to. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type GROUP_PEER_REVIEW and must belong to the same course.
Questions
The questions property accepts an array of reflection question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
CERTIFICATE
• certificate_title (string) — The certificate title.
• certificate_description (string) — The certificate description.
• certificate_course_name (string) — The course name displayed on the certificate.
• certificate_issued_by (string) — The issuer name displayed on the certificate.
.'
example:
video_url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'
required:
- module
get:
summary: 'List all Elements'
description: 'Returns a list of elements within your organization. The elements are sorted by their creation date, with the most recently created elements appearing first.'
parameters:
-
in: query
name: page
description: 'A cursor for pagination across multiple pages of results.'
example: 2
required: false
schema:
type: integer
description: 'A cursor for pagination across multiple pages of results.'
example: 2
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"QB8nmEJjqdbLA2K5\",\n \"object\": \"element\",\n \"created_at\": \"2024-11-26T11:37:16.000000Z\",\n \"name\": \"Multiple Choice Quiz\",\n \"cover\": null,\n \"type\": \"QUIZ\",\n \"content\": null,\n \"position\": 3,\n \"course\": \"B4peAvmZ1L9OY3Xr\",\n \"module\": \"no0aApWNyRMD68rv\",\n \"metadata\": {},\n \"properties\": {}\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 15,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 2\n }\n }\n}"
tags:
- Elements
'/v0/elements/{id}':
post:
summary: 'Update element'
description: 'Updates the details of an existing element in your organization based on the provided unique element ID. Any parameters not provided will be left unchanged. Returns the updated element details upon successful update.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
data:
id: QB8nmEJjqdbLA2K5
object: element
created_at: '2024-11-26T11:37:16.000000Z'
name: 'Multiple Choice Quiz'
cover: null
type: QUIZ
content: null
position: 3
course: B4peAvmZ1L9OY3Xr
module: no0aApWNyRMD68rv
metadata: { }
properties:
passing_score: 80
completion_trigger: on_pass
properties:
error:
type: string
example: null
payload:
type: object
example:
data:
id: QB8nmEJjqdbLA2K5
object: element
created_at: '2024-11-26T11:37:16.000000Z'
name: 'Multiple Choice Quiz'
cover: null
type: QUIZ
content: null
position: 3
course: B4peAvmZ1L9OY3Xr
module: no0aApWNyRMD68rv
metadata: { }
properties:
passing_score: 80
completion_trigger: on_pass
tags:
- Elements
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The element name. Must not be greater than 255 characters.'
example: 'Introduction to Marketing'
content:
type: string
description: 'The element content in markdown format. Supports headings, bold, italic, strikethrough, highlights, inline code, code blocks, blockquotes, lists, tables, images, links, and math (LaTeX).'
example: '# Element Introduction\nWelcome to the **first element**.'
position:
type: integer
description: 'The 0-indexed position of the element within its module. Siblings are re-ordered automatically. Values beyond the last sibling index are clamped to the last position. Must be at least 0.'
example: 2
metadata:
type: string
description: 'Metadata is an attribute that lets you store more information, structured as key-value pairs, for your own use and reference.
You can specify up to 50 keys, with key names up to 40 characters long and values up to 500 characters long. Keys and values are stored as strings and can contain any characters with one exception: you can''t use square brackets ([ and ]) in keys.'
example:
category: marketing
properties:
type: string
description: 'Type-specific properties for the element. The accepted keys depend on the element type. Unknown keys will be rejected with a validation error.
Supported element types and their properties:
VIDEO
• video_url (string) — The video URL. Supports Vimeo, YouTube, and direct video URLs.
• video_type (string) — The video source type. Must be set to URL when updating the video_url. Must be one of: URL, SOURCE.
QUIZ
• passing_score (integer) — The minimum passing score (0-100).
• completion_trigger (string) — When the quiz should be marked as complete. Must be one of: on_pass, on_submit.
• questions (array) — The quiz questions. Full replacement — the entire questions array is replaced on update. Include existing question/answer IDs to preserve links to student responses. Omit IDs to auto-generate new ones.
Questions
The questions property accepts an array of question objects. The entire questions array is replaced on every update (full replacement, not merge).
Important — Question and Answer IDs:
Each question and answer has an id field. These IDs link to student responses, activity records, and grades. When updating questions:
• Include the id to preserve an existing question/answer and maintain links to student data.
• Omit the id to create a new question/answer with an auto-generated ID.
• Questions/answers not included in the array will be removed.
• If you change or omit an existing ID, the link to student responses for that question/answer will be broken.
Question object:
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• text (string, required) — The question text.
• shuffle (boolean, optional) — Whether to shuffle answer order. Default: false.
• require_all_correct (boolean, optional) — Require all correct answers selected (multi-choice). Default: false.
• answers (array, required) — Array of answer objects.
Answer object:
• id (string, optional) — Existing answer ID to preserve. Omit for new answers.
• text (string, required) — The answer text.
• is_correct (boolean, required) — Whether this is a correct answer.
EMBED
• embed (string) — The embed code.
FILE
• file_url (string) — The file URL.
SUBMISSION
• questions (array) — The submission questions. Full replacement on update. Each question defines which response types (text, file) are accepted.
Questions
The questions property accepts an array of question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question defines which response types (text, file) are accepted.
Question object:
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• text (string, required) — The question text.
• accept_text (boolean, optional) — Whether text responses are accepted. Default: true.
• text_required (boolean, optional) — Whether text response is required. Default: false.
• accept_file (boolean, optional) — Whether file uploads are accepted. Default: false.
• file_required (boolean, optional) — Whether file upload is required. Default: false.
• file_multiple (boolean, optional) — Whether multiple files can be uploaded. Default: false.
GROUP_SUBMISSION
• questions (array) — The submission questions. Full replacement on update. Each question defines which response types (text, file) are accepted.
Questions
The questions property accepts an array of question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question defines which response types (text, file) are accepted.
Question object:
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• text (string, required) — The question text.
• accept_text (boolean, optional) — Whether text responses are accepted. Default: true.
• text_required (boolean, optional) — Whether text response is required. Default: false.
• accept_file (boolean, optional) — Whether file uploads are accepted. Default: false.
• file_required (boolean, optional) — Whether file upload is required. Default: false.
• file_multiple (boolean, optional) — Whether multiple files can be uploaded. Default: false.
SURVEY
• questions (array) — The survey questions. Full replacement on update. Each question has a text and a list of options participants can choose from.
Questions
The questions property accepts an array of survey (poll-style) questions. The entire questions array is replaced on every update (full replacement, not merge). Each question has a text and a list of answer options participants can choose from. There are no correct answers and no scoring.
Question object:
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• text (string, required) — The question text.
• options (array, required) — Answer options (at least 2).
Option object:
• id (string, optional) — Existing option ID to preserve.
• text (string, required) — The option text.
FORM
• questions (array) — The form questions. Full replacement — the entire questions array is replaced on update. Each question has a type that determines its structure.
Questions
The questions property accepts an array of question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, NUMBER_SCALE, MULTIPLE_CHOICE, STACK_RANK, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve. Omit for new questions.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT type additional fields:
• min_words (integer, optional) — Minimum word count. Default: 1.
NUMBER_SCALE type additional fields:
• range_min (integer, optional) — Scale minimum value. Default: 1.
• range_max (integer, optional) — Scale maximum value. Default: 10.
MULTIPLE_CHOICE / STACK_RANK type additional fields:
• options (array, required) — Array of option objects.
Option object:
• id (string, optional) — Existing option ID to preserve.
• text (string, required) — The option text.
MEETING_LINK
• meeting_url (string) — The meeting URL.
• start_date (string) — The meeting start date (ISO 8601 format).
• end_date (string) — The meeting end date (ISO 8601 format).
ZOOM_MEETING
• start_date (string) — The meeting start date (ISO 8601 format).
• end_date (string) — The meeting end date (ISO 8601 format).
• meeting_reports (boolean) — Whether attendance tracking is enabled.
MICROSOFT_TEAMS_MEETING
• start_date (string) — The meeting start date (ISO 8601 format).
• end_date (string) — The meeting end date (ISO 8601 format).
• meeting_reports (boolean) — Whether attendance tracking is enabled.
DISCUSSION
• restrict_posts_to (string) — Who can create top-level posts. "everyone" allows learners and lecturers to post; "lecturers" restricts top-level posts to lecturers only (learners can still comment on existing posts). Must be one of: everyone, lecturers.
• completion_rules (object) — Rules that determine when the discussion is marked complete for a learner. Operator joins multiple rules. Each rule has a type (POST or COMMENT) and a count. Each rule type can appear at most once.
SCORM
• scorm_url (string) — The URL of the uploaded SCORM package file.
• scorm_user_identifier (string) — The identifier used to track learners. Must be one of: user_id, user_email.
GROUP_FORMATION
• min_members (integer) — Minimum number of members per group. Must be a positive integer.
• max_members (integer) — Maximum number of members per group. Must be a positive integer and greater than or equal to "min_members".
• restrict_group_creation_to (string) — Who can create groups within this element. "everyone" allows learners and lecturers to create groups; "lecturers" restricts group creation to lecturers only. Must be one of: everyone, lecturers.
• group_threads_enabled (boolean) — Whether each group has its own discussion thread for internal communication. When enabled, group members can post and reply within a thread scoped to their group.
CHECKLIST
• questions (array) — The checklist items. Full replacement on update. Each item is a simple { id?, text } object.
Questions
The questions property accepts an array of checklist items. The entire items array is replaced on every update (full replacement, not merge). Each item is a simple object with a text field.
Item object:
• id (string, optional) — Existing item ID to preserve. Omit for new items.
• text (string, required) — The checklist item text.
SCORE
• passing_score (integer) — The score (as a percentage, 0–100) a learner must reach to pass this element. Compared against the learner''s computed average using "passing_score_comparator".
• passing_score_comparator (string) — How the learner''s computed average is compared against "passing_score". Example: "greater_than_or_equal" with passing_score=70 means a learner passes when their average is at least 70. Must be one of: greater_than, greater_than_or_equal, equal_to, less_than, less_than_or_equal.
• incomplete_inputs_handling (string) — How inputs the learner has not yet completed contribute to the weighted average. "ignore" drops them from the denominator (no effect); "score_as_zero" counts them as 0 with full weight (drags the average down). Must be one of: ignore, score_as_zero.
• inputs (array) — The source elements that contribute to the weighted average. Full replacement on every update — the entire array supersedes the previous set. See the SCORE inputs schema for the input object structure. Each input''s weight must be a positive integer; zero or fractional weights are rejected.
Inputs
The inputs property accepts an array of input objects that contribute to the weighted average. The entire inputs array is replaced on every update (full replacement, not merge). Each input references a source element in the same course, optionally graded by a review element''s rubric (quality-based scoring), with a weight in the average.
Input object:
• element (string, required) — Hash ID of the source element being graded. Must belong to the same course as the SCORE element.
• weight (integer, optional) — Weight in the weighted average. Must be a positive integer greater than 0. Default: 1. Zero or fractional weights are rejected.
• scored_via (string, optional) — Hash ID of a review element whose rubric grades the source (quality-based scoring). The valid pairings are restricted because only certain source types support being graded via a review element:
• If element is a SUBMISSION, scored_via must be a PEER_REVIEW, AI_REVIEW, or INSTRUCTOR_REVIEW.
• If element is a PEER_REVIEW, scored_via must be a FEEDBACK_REFLECTION.
• For any other source type, scored_via is not allowed and will be rejected.
PEER_REVIEW
• source (object) — The submission element being reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
SELF_REVIEW
• source (object) — The submission element being self-reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a SUBMISSION element in the same course.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
INSTRUCTOR_REVIEW
• source (object) — The submission element being reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a SUBMISSION or GROUP_SUBMISSION element in the same course.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION or GROUP_SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
INSTRUCTOR_DISCUSSION
• source (object) — The submission element being discussed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a SUBMISSION or GROUP_SUBMISSION element in the same course.
Source
The source property references the submission element being discussed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION or GROUP_SUBMISSION and must belong to the same course.
AI_REVIEW
• source (object) — The submission element being reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a SUBMISSION element in the same course.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
FEEDBACK_REFLECTION
• source (object) — The peer review element this reflection is linked to. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a PEER_REVIEW element in the same course.
• questions (array) — The reflection questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the peer review element this reflection is linked to. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type PEER_REVIEW and must belong to the same course.
Questions
The questions property accepts an array of reflection question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
GROUP_PEER_REVIEW
• source (object) — The group submission element being reviewed. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear.
• questions (array) — The review rubric questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the submission element being reviewed. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type GROUP_SUBMISSION and must belong to the same course.
Questions
The questions property accepts an array of review rubric question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
GROUP_FEEDBACK_REFLECTION
• source (object) — The group peer review element this reflection is linked to. On read returns { type, id, name }. On write pass { id: "element_id" } or null to clear. Must be a GROUP_PEER_REVIEW element in the same course.
• questions (array) — The reflection questions. Full replacement on update. Types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX.
Source
The source property references the peer review element this reflection is linked to. On read it returns an object with type, id, and name. On write, pass { "id": "element_id" }, or null to clear. The referenced element must be of type GROUP_PEER_REVIEW and must belong to the same course.
Questions
The questions property accepts an array of reflection question objects. The entire questions array is replaced on every update (full replacement, not merge). Each question has a type that determines its structure.
Question types: TEXT, TEXT_SCALE, NUMBER_SCALE, YES_NO, INFO_BOX
Common fields (all types):
• id (string, optional) — Existing question ID to preserve.
• type (string, required) — The question type.
• text (string, required) — The question text.
• optional (boolean, optional) — Whether the question is optional. Default: false.
TEXT: min_words (integer)
NUMBER_SCALE: range_min (integer), range_max (integer)
TEXT_SCALE: options (array of { text }) — ordered from lowest to highest score.
YES_NO: yes_text (string), no_text (string)
INFO_BOX: no additional fields
CERTIFICATE
• certificate_title (string) — The certificate title.
• certificate_description (string) — The certificate description.
• certificate_course_name (string) — The course name displayed on the certificate.
• certificate_issued_by (string) — The issuer name displayed on the certificate.
.'
example:
passing_score: 80
get:
summary: 'Retrieve an Element'
description: 'Retrieves the details of an existing element in your organization based on the provided unique element ID. Returns comprehensive information about the element, including its name, type, content, position, and type-specific properties.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
data:
id: QB8nmEJjqdbLA2K5
object: element
created_at: '2024-11-26T11:37:16.000000Z'
name: 'Multiple Choice Quiz'
cover: null
type: QUIZ
content: null
position: 3
course: B4peAvmZ1L9OY3Xr
module: no0aApWNyRMD68rv
metadata: { }
properties:
passing_score: 70
completion_trigger: on_pass
properties:
error:
type: string
example: null
payload:
type: object
example:
data:
id: QB8nmEJjqdbLA2K5
object: element
created_at: '2024-11-26T11:37:16.000000Z'
name: 'Multiple Choice Quiz'
cover: null
type: QUIZ
content: null
position: 3
course: B4peAvmZ1L9OY3Xr
module: no0aApWNyRMD68rv
metadata: { }
properties:
passing_score: 70
completion_trigger: on_pass
tags:
- Elements
delete:
summary: 'Delete an Element'
description: 'Deletes an existing element in your organization. Returns an object with a deleted parameter upon successful deletion.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: QB8nmEJjqdbLA2K5
object: element
deleted: true
properties:
error:
type: string
example: null
payload:
type: object
example:
id: QB8nmEJjqdbLA2K5
object: element
deleted: true
tags:
- Elements
parameters:
-
in: path
name: id
description: 'The ID of the requested element to update.'
example: p5v87ERWKR3dkjyD
required: true
schema:
type: string
/v0/elements/search:
get:
summary: 'Search Elements'
description: 'Search for existing elements in your organization. You can search by element name. The search is case-insensitive and supports partial matches.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"QB8nmEJjqdbLA2K5\",\n \"object\": \"element\",\n \"created_at\": \"2024-11-26T11:37:16.000000Z\",\n \"name\": \"Multiple Choice Quiz\",\n \"cover\": null,\n \"type\": \"QUIZ\",\n \"content\": null,\n \"position\": 3,\n \"course\": \"B4peAvmZ1L9OY3Xr\",\n \"module\": \"no0aApWNyRMD68rv\",\n \"metadata\": {},\n \"properties\": {}\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 3,\n \"count\": 3,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 1\n }\n }\n}"
tags:
- Elements
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
q:
type: string
description: 'The search query to filter elements by name.'
example: Quiz
type:
type: string
description: 'Must be one of CONTENT, VIDEO, ZOOM_MEETING, MEETING_LINK, QUIZ, SUBMISSION, GROUP_SUBMISSION, EMBED, SURVEY, SCORM, CERTIFICATE, TAG, DATACAMP, SELF_REVIEW, PEER_REVIEW, FEEDBACK_REFLECTION, INSTRUCTOR_REVIEW, INSTRUCTOR_DISCUSSION, AI_REVIEW, CHECKLIST, DISCUSSION, FILE, GROUP_FORMATION, FORM, SCORE, GROUP_PEER_REVIEW, GROUP_FEEDBACK_REFLECTION, or MICROSOFT_TEAMS_MEETING.'
example: FILE
required:
- q
/v0/members/search:
get:
summary: 'Search Members'
description: 'Search for existing members in your organization. You can search by first name, last name or email. The search is case-insensitive and supports partial matches.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"e7W6kP8wvjd3GRBz\",\n \"object\": \"member\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"full_name\": \"John Doe\",\n \"avatar\": null,\n \"email\": null,\n \"is_email_verified\": false,\n \"last_seen\": \"2024-01-22T12:56:04.000000Z\"\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 5,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 1\n }\n }\n}"
tags:
- Members
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
q:
type: string
description: 'The search query to filter members by first name, last name or email.'
example: John
include_test_user:
type: boolean
description: 'Include test users to the search results if set to true.'
example: true
required:
- q
'/v0/members/{id}':
get:
summary: 'Retrieve a Member'
description: 'Retrieves the details of an existing member in your organization based on the provided unique member ID. Returns a comprehensive information about the member, including their first name, last name, email, and profile image.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: e7W6kP8wvjd3GRBz
object: member
first_name: John
last_name: Doe
full_name: 'John Doe'
avatar: null
email: null
is_email_verified: false
last_seen: '2024-01-22T12:56:04.000000Z'
properties:
error:
type: string
example: null
payload:
type: object
example:
id: e7W6kP8wvjd3GRBz
object: member
first_name: John
last_name: Doe
full_name: 'John Doe'
avatar: null
email: null
is_email_verified: false
last_seen: '2024-01-22T12:56:04.000000Z'
tags:
- Members
post:
summary: 'Update a Member'
description: 'Updates the details of an existing member in your organization based on the provided unique member ID. Any parameters not provided will be left unchanged. Returns the updated member details upon successful update.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: e7W6kP8wvjd3GRBz
object: member
first_name: John
last_name: Doe
full_name: 'John Doe'
avatar: null
email: john.doe@example.com
is_email_verified: false
last_seen: '2024-01-22T12:56:04.000000Z'
properties:
error:
type: string
example: null
payload:
type: object
example:
id: e7W6kP8wvjd3GRBz
object: member
first_name: John
last_name: Doe
full_name: 'John Doe'
avatar: null
email: john.doe@example.com
is_email_verified: false
last_seen: '2024-01-22T12:56:04.000000Z'
tags:
- Members
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: 'The member email address.'
example: john.doe@example.com
password:
type: string
description: 'The member''s password. Must be at least 8 characters. Must have at least one uppercase and one lowercase letter. Must have at least one number. Must have at least one symbol.'
example: doNotU5e_thiSPassw0rd
first_name:
type: string
description: 'The member first name.'
example: John
last_name:
type: string
description: 'The member last name.'
example: Doe
avatar:
type: string
description: 'The member profile picture URL.'
example: 'https://example.com/avatar.png'
parameters:
-
in: path
name: id
description: 'The ID of the requested member.'
example: e7W6kP8wvjd3GRBz
required: true
schema:
type: string
/v0/members:
get:
summary: 'List all Members'
description: 'Retrieves a paginated list of members in your organization. This API endpoint allows you to retrieve detailed information about each member, including their name, email, and other relevant details.'
parameters:
-
in: query
name: page
description: 'A cursor for pagination across multiple pages of results.'
example: 2
required: false
schema:
type: integer
description: 'A cursor for pagination across multiple pages of results.'
example: 2
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"e7W6kP8wvjd3GRBz\",\n \"object\": \"member\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"full_name\": \"John Doe\",\n \"avatar\": null,\n \"email\": null,\n \"is_email_verified\": false,\n \"last_seen\": \"2024-01-22T12:56:04.000000Z\"\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 152,\n \"count\": 10,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 16\n }\n }\n}"
tags:
- Members
post:
summary: 'Create a Member'
description: 'Create a member in your organization.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: e7W6kP8wvjd3GRBz
object: member
first_name: John
last_name: Doe
full_name: 'John Doe'
avatar: null
email: john.doe@example.com
is_email_verified: false
last_seen: '2024-01-22T12:56:04.000000Z'
properties:
error:
type: string
example: null
payload:
type: object
example:
id: e7W6kP8wvjd3GRBz
object: member
first_name: John
last_name: Doe
full_name: 'John Doe'
avatar: null
email: john.doe@example.com
is_email_verified: false
last_seen: '2024-01-22T12:56:04.000000Z'
tags:
- Members
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: 'The member''s email. Must be a valid email address.'
example: john.doe@example.com
password:
type: string
description: 'The member''s password. Must be at least 8 characters. Must have at least one uppercase and one lowercase letter. Must have at least one number. Must have at least one symbol.'
example: doNotU5e_thiSPassw0rd
first_name:
type: string
description: 'The member''s first name.'
example: John
last_name:
type: string
description: 'The member''s last name.'
example: Doe
role:
type: string
description: 'The member''s role. It must be "owner", "admin", "lecturer", "assistant" or "customer".'
example: lecturer
avatar:
type: string
description: 'The member''s profile picture. Must be a valid URL. Must not be greater than 255 characters.'
example: 'https://example.com/avatar.png'
required:
- email
- password
- first_name
- last_name
- role
'/v0/members/{id}/courses':
get:
summary: 'List all Member Courses'
description: 'Returns a list of courses the member belongs to.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"6jO9XN7mZEVpvxqo\",\n \"object\": \"course_member\",\n \"joined_at\": \"2024-01-22T12:56:04.000000Z\",\n \"member\": {\n \"id\": \"e7W6kP8wvjd3GRBz\",\n \"object\": \"member\",\n \"first_name\": \"John\",\n \"last_name\": \"Doe\",\n \"full_name\": \"John Doe\",\n \"avatar\": null,\n \"email\": null,\n \"is_email_verified\": false,\n \"last_seen\": \"2024-01-22T12:56:04.000000Z\"\n },\n \"course\": {\n \"id\": \"p5v87ERWKR3dkjyD\",\n \"object\": \"course\",\n \"name\": \"Ultimate Marketing Course\",\n \"created_at\": \"2022-02-03T16:06:42.000000Z\",\n \"cover\": null,\n \"availability\": \"CONTINUOUS\",\n \"visibility\": \"PRIVATE\",\n \"start_date\": null,\n \"end_date\": null,\n \"currency\": \"eur\",\n \"price\": null,\n \"url\": null,\n \"public_url\": null,\n \"join_url\": null,\n \"metadata\": {}\n },\n \"custom_fields\": {\n \"field_1\": {\n \"key\": \"field_1\",\n \"object\": \"custom-field\",\n \"created_at\": \"2024-07-30T16:05:47.000000Z\",\n \"name\": \"Multiple Field Question\",\n \"description\": null,\n \"type\": \"MULTIPLE_OPTIONS\",\n \"options\": [\n \"Option A\",\n \"Option B\",\n \"Option C\"\n ],\n \"required\": false\n }\n }\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 15,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 2\n }\n }\n}"
tags:
- Members
parameters:
-
in: path
name: id
description: 'The ID of the member which the courses should be retrieveds.'
example: e7W6kP8wvjd3GRBz
required: true
schema:
type: string
/v0/modules:
post:
summary: 'Create a module'
description: 'Create a module in the specified course. Returns the created module details upon successful creation.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: e7W6kP8wvjd3GRBz
object: module
created_at: '2024-01-22T12:56:04.000000Z'
name: 'Example module'
type: LESSON
availability: SCHEDULED
start_date: '2025-02-20T00:00:00.000000Z'
end_date: '2025-02-21T00:00:00.000000Z'
content: null
position: 1
course: p5v87ERWKR3dkjyD
metadata: { }
properties:
error:
type: string
example: null
payload:
type: object
example:
id: e7W6kP8wvjd3GRBz
object: module
created_at: '2024-01-22T12:56:04.000000Z'
name: 'Example module'
type: LESSON
availability: SCHEDULED
start_date: '2025-02-20T00:00:00.000000Z'
end_date: '2025-02-21T00:00:00.000000Z'
content: null
position: 1
course: p5v87ERWKR3dkjyD
metadata: { }
tags:
- Modules
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The module name. Must not be greater than 255 characters.'
example: 'First knowledge'
content:
type: string
description: 'The module content in markdown format. Supports headings, bold, italic, strikethrough, highlights, inline code, code blocks, blockquotes, lists, tables, images, links, and math (LaTeX).'
example: '# Module Introduction\nWelcome to the **first module**.'
course:
type: string
description: 'The course id of the module.'
example: qw0aApAGyRKL69rw
availability:
type: string
description: 'Defines the availability of the module. Can be one of the following values: "CONTINUOUS" for an ongoing module or "SCHEDULED" for a module with specific start and end dates. Must be one of CONTINUOUS or SCHEDULED.'
example: CONTINUOUS
start_date:
type: string
description: 'The start date of the module. The date should be in ISO 8601 format (e.g., "2025-02-17T00:00:00Z"). This field is required if the availability is "SCHEDULED". This field is required when availability is SCHEDULED. Must be a valid date.'
example: '2025-02-17T00:00:00Z'
end_date:
type: string
description: 'The end date of the module. The date should be in ISO 8601 format (e.g., "2025-03-18T00:00:00Z"). This field is required if the availability is "SCHEDULED" and must be after the start date. This field is required when availability is SCHEDULED or date. Must be a date after or equal to start_date.'
example: '2025-03-17T00:00:00Z'
position:
type: integer
description: 'The 0-indexed position of the module within its course. If omitted, the module is appended at the end. Values beyond the last sibling index are clamped to the last position. Siblings are re-ordered automatically. Must be at least 0.'
example: 0
metadata:
type: string
description: 'Metadata is an attribute that lets you store more information, structured as key-value pairs, for your own use and reference.
You can specify up to 50 keys, with key names up to 40 characters long and values up to 500 characters long. Keys and values are stored as strings and can contain any characters with one exception: you can''t use square brackets ([ and ]) in keys.'
example:
category: marketing
required:
- course
get:
summary: 'List all Modules'
description: 'Returns a list of modules within your organization. The modules are sorted by their creation date, with the most recently created modules appearing first.'
parameters:
-
in: query
name: page
description: 'A cursor for pagination across multiple pages of results.'
example: 2
required: false
schema:
type: integer
description: 'A cursor for pagination across multiple pages of results.'
example: 2
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"e7W6kP8wvjd3GRBz\",\n \"object\": \"module\",\n \"created_at\": \"2024-01-22T12:56:04.000000Z\",\n \"name\": \"Example module\",\n \"type\": \"LESSON\",\n \"availability\": \"SCHEDULED\",\n \"start_date\": \"2025-02-20T00:00:00.000000Z\",\n \"end_date\": \"2025-02-21T00:00:00.000000Z\",\n \"content\": null,\n \"position\": 1,\n \"course\": \"p5v87ERWKR3dkjyD\",\n \"metadata\": {}\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 15,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 2\n }\n }\n}"
tags:
- Modules
'/v0/modules/{id}':
post:
summary: 'Update a module'
description: 'Updates the details of an existing module based on the provided unique module ID. Any parameters not provided will be left unchanged. Returns the updated module details upon successful update.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: e7W6kP8wvjd3GRBz
object: module
created_at: '2024-01-22T12:56:04.000000Z'
name: 'Example module'
type: LESSON
availability: SCHEDULED
start_date: '2025-02-20T00:00:00.000000Z'
end_date: '2025-02-21T00:00:00.000000Z'
content: null
position: 1
course: p5v87ERWKR3dkjyD
metadata: { }
properties:
error:
type: string
example: null
payload:
type: object
example:
id: e7W6kP8wvjd3GRBz
object: module
created_at: '2024-01-22T12:56:04.000000Z'
name: 'Example module'
type: LESSON
availability: SCHEDULED
start_date: '2025-02-20T00:00:00.000000Z'
end_date: '2025-02-21T00:00:00.000000Z'
content: null
position: 1
course: p5v87ERWKR3dkjyD
metadata: { }
tags:
- Modules
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'The module name. Must not be greater than 255 characters.'
example: 'First knowledge'
content:
type: string
description: 'The module content in markdown format. Supports headings, bold, italic, strikethrough, highlights, inline code, code blocks, blockquotes, lists, tables, images, links, and math (LaTeX).'
example: '# Module Introduction\nWelcome to the **first module**.'
availability:
type: string
description: 'Defines the availability of the module. Can be one of the following values: "CONTINUOUS" for an ongoing module or "SCHEDULED" for a module with specific start and end dates. Must be one of CONTINUOUS or SCHEDULED.'
example: CONTINUOUS
start_date:
type: string
description: 'The start date of the module. The date should be in ISO 8601 format (e.g., "2025-02-17T00:00:00Z"). This field is required if the availability is "SCHEDULED". This field is required when availability is SCHEDULED. Must be a valid date.'
example: '2025-02-17T00:00:00Z'
end_date:
type: string
description: 'The end date of the module. The date should be in ISO 8601 format (e.g., "2025-03-18T00:00:00Z"). This field is required if the availability is "SCHEDULED" and must be after the start date. This field is required when availability is SCHEDULED or date. Must be a date after or equal to start_date.'
example: '2025-03-17T00:00:00Z'
position:
type: integer
description: 'The 0-indexed position of the module within its course. Siblings are re-ordered automatically. Values beyond the last sibling index are clamped to the last position. Must be at least 0.'
example: 2
metadata:
type: string
description: 'Metadata is an attribute that lets you store more information, structured as key-value pairs, for your own use and reference.
You can specify up to 50 keys, with key names up to 40 characters long and values up to 500 characters long. Keys and values are stored as strings and can contain any characters with one exception: you can''t use square brackets ([ and ]) in keys.'
example:
category: marketing
get:
summary: 'Retrieve a Module'
description: 'Retrieves the details of an existing module in your organization based on the provided unique module ID. Returns comprehensive information about the module, including its name, type, availability, position, and dates.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
data:
id: e7W6kP8wvjd3GRBz
object: module
created_at: '2024-01-22T12:56:04.000000Z'
name: 'Example module'
type: LESSON
availability: SCHEDULED
start_date: '2025-02-20T00:00:00.000000Z'
end_date: '2025-02-21T00:00:00.000000Z'
content: null
position: 1
course: p5v87ERWKR3dkjyD
metadata: { }
properties:
error:
type: string
example: null
payload:
type: object
example:
data:
id: e7W6kP8wvjd3GRBz
object: module
created_at: '2024-01-22T12:56:04.000000Z'
name: 'Example module'
type: LESSON
availability: SCHEDULED
start_date: '2025-02-20T00:00:00.000000Z'
end_date: '2025-02-21T00:00:00.000000Z'
content: null
position: 1
course: p5v87ERWKR3dkjyD
metadata: { }
tags:
- Modules
delete:
summary: 'Delete a Module'
description: 'Deletes an existing module in your organization. Returns an object with a deleted parameter upon successful deletion.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: e7W6kP8wvjd3GRBz
object: module
deleted: true
properties:
error:
type: string
example: null
payload:
type: object
example:
id: e7W6kP8wvjd3GRBz
object: module
deleted: true
tags:
- Modules
parameters:
-
in: path
name: id
description: 'The ID of the requested module to update.'
example: p5v87ERWKR3dkjyD
required: true
schema:
type: string
/v0/modules/search:
get:
summary: 'Search Modules'
description: 'Search for existing modules in your organization. You can search by module name. The search is case-insensitive and supports partial matches.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"e7W6kP8wvjd3GRBz\",\n \"object\": \"module\",\n \"created_at\": \"2024-01-22T12:56:04.000000Z\",\n \"name\": \"Introduction to Marketing\",\n \"type\": \"LESSON\",\n \"availability\": \"CONTINUOUS\",\n \"start_date\": null,\n \"end_date\": null,\n \"content\": null,\n \"position\": 0,\n \"course\": \"p5v87ERWKR3dkjyD\",\n \"metadata\": {}\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 3,\n \"count\": 3,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 1\n }\n }\n}"
tags:
- Modules
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
q:
type: string
description: 'The search query to filter modules by name.'
example: Introduction
required:
- q
'/v0/modules/{id}/elements':
get:
summary: 'List Module Elements'
description: 'Returns a list of elements within the specified module.'
parameters:
-
in: query
name: page
description: 'A cursor for pagination across multiple pages of results.'
example: 2
required: false
schema:
type: integer
description: 'A cursor for pagination across multiple pages of results.'
example: 2
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: "{\n \"error\": null,\n \"payload\": {\n \"data\": [\n {\n \"id\": \"QB8nmEJjqdbLA2K5\",\n \"object\": \"element\",\n \"created_at\": \"2024-11-26T11:37:16.000000Z\",\n \"name\": \"Multiple Choice Quiz\",\n \"cover\": null,\n \"type\": \"QUIZ\",\n \"content\": null,\n \"position\": 3,\n \"course\": \"B4peAvmZ1L9OY3Xr\",\n \"module\": \"e7W6kP8wvjd3GRBz\",\n \"metadata\": {},\n \"properties\": {}\n },\n {...},\n {...}\n ],\n \"pagination\": {\n \"total\": 5,\n \"count\": 5,\n \"per_page\": 10,\n \"current_page\": 1,\n \"total_pages\": 1\n }\n }\n}"
tags:
- Modules
parameters:
-
in: path
name: id
description: 'The ID of the module.'
example: e7W6kP8wvjd3GRBz
required: true
schema:
type: string
/v0/revoke:
post:
summary: 'Revoke Organization Access'
description: 'Revoke a member access from organization.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload: null
properties:
error:
type: string
example: null
payload:
type: string
example: null
tags:
- Organization
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
member:
type: string
description: 'The ID of the member to revoke access to the organization.'
example: e7W6kP8wvjd3GRBz
required:
- member
/v0/invites:
post:
summary: 'Invite Member'
description: 'Invite a member to join the organization or course.'
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: application/json
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
id: R8dXqkpL1BaJl92y
object: invite
token: PgvInCUzTnNuTYpYWb2c
url: null
full_name: 'John Doe'
role: customer
discount_percentage: 0
course: null
skip_email: false
properties:
error:
type: string
example: null
payload:
type: object
example:
id: R8dXqkpL1BaJl92y
object: invite
token: PgvInCUzTnNuTYpYWb2c
url: null
full_name: 'John Doe'
role: customer
discount_percentage: 0
course: null
skip_email: false
tags:
- Organization
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: 'The member''s emails to whom will sent an invitation. Must be a valid email address.'
example: john.doe@example.com
full_name:
type: string
description: 'The member''s full name.'
example: 'John Doe'
role:
type: string
description: 'The member''s role. Default to "customer". Must be one of customer, lecturer, admin, or owner.'
example: customer
discount_percentage:
type: integer
description: 'Must be between 0 and 100.'
example: 95
course:
type: string
description: 'If set, the ID of the course the member will be invited to.'
example: e7W6kP8wvjd3GRBz
skip_email:
type: boolean
description: 'If set to true, an email notification will be skipped.'
example: false
required:
- email
/v0/uploads:
post:
summary: 'Upload a file'
description: "Uploads a file to your organization's storage. Returns the public URL of the uploaded file.\nThe returned URL can be used to set element properties such as video_url, scorm_url, file, or avatar."
parameters:
-
in: header
name: Authorization
description: ''
example: 'Bearer {YOUR_API_KEY}'
schema:
type: string
-
in: header
name: Content-Type
description: ''
example: multipart/form-data
schema:
type: string
-
in: header
name: Accept
description: ''
example: application/json
schema:
type: string
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
error: null
payload:
url: 'https://cdn.teachfloor.com/public/123/my-document-1712345678.pdf'
name: my-document.pdf
mime_type: application/pdf
size: 204800
properties:
error:
type: string
example: null
payload:
type: object
example:
url: 'https://cdn.teachfloor.com/public/123/my-document-1712345678.pdf'
name: my-document.pdf
mime_type: application/pdf
size: 204800
tags:
- Uploads
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: 'The file to upload. Supports images (jpg, jpeg, png, webp, svg, gif), documents (pdf, doc, docx, xls, xlsx, ppt, pptx, csv, txt), audio (mp3, wav, ogg), video (mp4, webm, mov), archives (zip), and SCORM packages. Max 100MB. Must be a file. Must not be greater than 102400 kilobytes.'
required:
- file
tags:
-
name: Activities
description: ''
-
name: Courses
description: ''
-
name: Elements
description: ''
-
name: Members
description: ''
-
name: Modules
description: ''
-
name: Organization
description: ''
-
name: Uploads
description: ''
components:
securitySchemes:
default:
type: http
scheme: bearer
description: ''
security:
-
default: []