Propel API v1.0.0
Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.
Welcome to the Propel API documentation.
Base URL:
Authentication
- HTTP Authentication, scheme: bearer
Bearer tokens are used for all access to the Propel API endpoints apart from the /auth endpoint which is publicly accessible and the /auth endpoint for login and authentication.
Auth
The /auth endpoints handle user authentication and password management.
Supports login with email/password, password reset requests, and password reset confirmation. These endpoints are publicly accessible and do not require authentication.
Create new login
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/auth/login \
-H 'Content-Type: application/json' \
-H 'Accept: application/json'
const inputBody = '{
"email": "test@test.com",
"password": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json'
};
fetch('https://api.propel.tools/v1/auth/login',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/auth/login', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
r = requests.post('https://api.propel.tools/v1/auth/login', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json'
}
result = RestClient.post 'https://api.propel.tools/v1/auth/login',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/auth/login", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/auth/login");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /auth/login
Login request
Body parameter
{
"email": "test@test.com",
"password": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | string | true | The user's email | |
password | body | string | true | The user's password |
Example responses
200 Response
{
"idToken": "02958d31-409a-4491-9105-479f48b3c5ca",
"idTokenExpiry": 0,
"name": "John Doe",
"role": "learner"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Login |
401 | Unauthorized | unauthorised - invalid login credentials or first login password required | None |
404 | Not Found | User not found | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Request password reset
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/auth/password-resets/request \
-H 'Content-Type: application/json'
const inputBody = '{
"email": "string"
}';
const headers = {
'Content-Type':'application/json'
};
fetch('https://api.propel.tools/v1/auth/password-resets/request',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/auth/password-resets/request', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json'
}
r = requests.post('https://api.propel.tools/v1/auth/password-resets/request', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json'
}
result = RestClient.post 'https://api.propel.tools/v1/auth/password-resets/request',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/auth/password-resets/request", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/auth/password-resets/request");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /auth/password-resets/request
Request a password reset code
Accepts an email. If the user is found, generates a reset code, stores the hashed code in the database, and sends an email with a reset link.
Body parameter
{
"email": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | string | true | The user's email |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | successful operation | None |
422 | Unprocessable Entity | Unprocessable entity - check error message | None |
Complete password reset
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/auth/password-resets/confirm \
-H 'Content-Type: application/json' \
-H 'Accept: application/json'
const inputBody = '{
"resetCode": "string",
"newPassword": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json'
};
fetch('https://api.propel.tools/v1/auth/password-resets/confirm',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/auth/password-resets/confirm', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
r = requests.post('https://api.propel.tools/v1/auth/password-resets/confirm', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json'
}
result = RestClient.post 'https://api.propel.tools/v1/auth/password-resets/confirm',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/auth/password-resets/confirm", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/auth/password-resets/confirm");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /auth/password-resets/confirm
Complete password reset using a reset code
Verifies the provided reset code, ensures it's valid and not expired, then updates the user's password. Clears the reset code upon success.
Body parameter
{
"resetCode": "string",
"newPassword": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
resetCode | body | string | true | The reset code sent to the user's email |
newPassword | body | string | true | The new password to set |
Example responses
200 Response
{
"idToken": "02958d31-409a-4491-9105-479f48b3c5ca",
"idTokenExpiry": 0,
"name": "John Doe",
"role": "learner"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Login |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Companies
The /companies endpoints manage company information and company-specific data.
Supports getting company details, company users, company programs, and company leaderboards. Company admins can view all users in their company and manage company-specific programs.
Get a list of companies
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/companies \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/companies',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/companies', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/companies', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/companies',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/companies", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/companies");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /companies
Gets a list of companies for this user
Example responses
200 Response
[
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"name": "Acme Corp",
"industry": "Retail"
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 200
Array of Company objects
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [Company] | false | none | Array of Company objects |
» uuid | string | false | none | A unique UUID for this company |
» name | string | false | none | The company name |
» industry | string | false | none | Industry for this company |
Create new company
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/companies \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"name": "string",
"industry": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/companies',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/companies', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/companies', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/companies',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/companies", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/companies");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /companies
Creates a new company.
Body parameter
{
"name": "string",
"industry": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
name | body | string | true | The name of the company |
industry | body | string | false | The industry of the company |
Example responses
201 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"name": "Acme Corp",
"industry": "Retail"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | successful operation | Company |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to create companies | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Get company cohorts
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/companies/{companyUUID}/cohorts \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/companies/{companyUUID}/cohorts',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/companies/{companyUUID}/cohorts', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/companies/{companyUUID}/cohorts', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/companies/{companyUUID}/cohorts',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/companies/{companyUUID}/cohorts", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/companies/{companyUUID}/cohorts");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /companies/{companyUUID}/cohorts
Gets all cohorts for a specific company
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
companyUUID | path | string | true | The company UUID |
Example responses
200 Response
[
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"startDate": "2025-01-01T00:00:00.000Z",
"endDate": "2025-12-31T00:00:00.000Z",
"cohortName": "Cohort 1",
"maxEnrollees": 100,
"totalEnrollees": 25,
"programVersion": {
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"versionNumber": 1,
"status": "live",
"Program": {
"uuid": "string",
"title": "string",
"description": "Learn the basics of leadership and management",
"level": "beginner",
"tags": "leadership,management,soft-skills"
}
}
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
400 | Bad Request | Bad request - invalid UUID format or path parameters | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to view this company | None |
404 | Not Found | company not found | None |
405 | Method Not Allowed | method not allowed | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 200
Array of CompanyCohort objects
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [CompanyCohort] | false | none | Array of CompanyCohort objects |
» uuid | string | false | none | A unique UUID for this cohort |
» startDate | string | false | none | Start date of the cohort |
» endDate | string | false | none | End date of the cohort |
» cohortName | string | false | none | Cohort name |
» maxEnrollees | integer | false | none | Maximum number of enrollees |
» totalEnrollees | integer | false | none | Current number of enrolled users |
» programVersion | object | false | none | Program version information |
»» uuid | string | false | none | A unique UUID for this program version |
»» versionNumber | integer | false | none | Version number |
»» status | string | false | none | Program version status |
»» Program | object | false | none | Program information |
»»» uuid | string | false | none | Program UUID |
»»» title | string | false | none | Program title |
»»» description | string | false | none | Program description |
»»» level | string | false | none | Program level |
»»» tags | string | false | none | Program tags |
Enumerated Values
Property | Value |
---|---|
status | draft |
status | comingSoon |
status | live |
status | retired |
level | beginner |
level | intermediate |
level | advanced |
Get company leaderboard
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/companies/{companyUUID}/leaderboard \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/companies/{companyUUID}/leaderboard',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/companies/{companyUUID}/leaderboard', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/companies/{companyUUID}/leaderboard', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/companies/{companyUUID}/leaderboard',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/companies/{companyUUID}/leaderboard", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/companies/{companyUUID}/leaderboard");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /companies/{companyUUID}/leaderboard
Gets the leaderboard for a specific company
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
companyUUID | path | string | true | The company UUID |
Example responses
200 Response
[
{
"program": {
"uuid": "string",
"title": "string"
},
"cohortName": "Cohort 1",
"cohortCreatedAt": "2019-08-24T14:15:22Z",
"entries": [
{
"rank": 0,
"user": {
"uuid": "string",
"name": "string"
},
"progressPercent": 0,
"haveCertificate": true
}
]
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
400 | Bad Request | Bad request - invalid UUID format or path parameters | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to view this company | None |
404 | Not Found | company not found | None |
405 | Method Not Allowed | method not allowed | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 200
Array of leaderboard entries
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [LeaderboardEntry] | false | none | Array of leaderboard entries |
» program | object | false | none | Program information |
»» uuid | string | false | none | Program UUID |
»» title | string | false | none | Program title |
» cohortName | string | false | none | Cohort name |
» cohortCreatedAt | string(date-time) | false | none | When the cohort was created |
» entries | [object] | false | none | Array of user entries in this cohort |
»» rank | integer | false | none | User's rank in the cohort |
»» user | object | false | none | User information |
»»» uuid | string | false | none | User UUID |
»»» name | string | false | none | User name |
»» progressPercent | number | false | none | Progress percentage |
»» haveCertificate | boolean | false | none | Whether user has completed the program |
Assign program version to company
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/companies/{companyUUID}/program-versions \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"programVersionUUID": "02958d31-409a-4491-9105-479f48b3c5ca",
"cohortName": "Cohort 1",
"maxEnrollees": 100,
"startDate": "2025-01-01T00:00:00.000Z",
"endDate": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/companies/{companyUUID}/program-versions',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/companies/{companyUUID}/program-versions', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/companies/{companyUUID}/program-versions', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/companies/{companyUUID}/program-versions',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/companies/{companyUUID}/program-versions", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/companies/{companyUUID}/program-versions");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /companies/{companyUUID}/program-versions
Assigns a program version to a specific company
Body parameter
{
"programVersionUUID": "02958d31-409a-4491-9105-479f48b3c5ca",
"cohortName": "Cohort 1",
"maxEnrollees": 100,
"startDate": "2025-01-01T00:00:00.000Z",
"endDate": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
companyUUID | path | string | true | The company UUID |
programVersionUUID | body | string | true | The UUID of the program version to assign |
cohortName | body | string | false | The name of the cohort |
maxEnrollees | body | integer | false | The maximum number of enrollees for this cohort |
startDate | body | string | false | The start date of the cohort |
endDate | body | string | false | The end date of the cohort |
Example responses
201 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"cohortName": "Cohort 1",
"maxEnrollees": 100,
"startDate": "2025-01-01T00:00:00.000Z",
"endDate": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Program version successfully assigned to company | CompanyProgramVersionCohort |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to assign program versions to this company | None |
404 | Not Found | not found - company or program version not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Update a company
Code samples
# You can also use wget
curl -X PUT https://api.propel.tools/v1/companies/{companyUUID} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"name": "string",
"industry": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/companies/{companyUUID}',
{
method: 'PUT',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PUT','https://api.propel.tools/v1/companies/{companyUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.put('https://api.propel.tools/v1/companies/{companyUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.put 'https://api.propel.tools/v1/companies/{companyUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PUT", "https://api.propel.tools/v1/companies/{companyUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/companies/{companyUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PUT");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
PUT /companies/{companyUUID}
Updates an existing company
Body parameter
{
"name": "string",
"industry": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
companyUUID | path | string | true | The unique UUID for this company |
name | body | string | false | The name of the company |
industry | body | string | false | The industry of the company |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"name": "Acme Corp",
"industry": "Retail"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Company |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to update this company | None |
404 | Not Found | not found - company not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Delete a company
Code samples
# You can also use wget
curl -X DELETE https://api.propel.tools/v1/companies/{companyUUID} \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/companies/{companyUUID}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api.propel.tools/v1/companies/{companyUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api.propel.tools/v1/companies/{companyUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api.propel.tools/v1/companies/{companyUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api.propel.tools/v1/companies/{companyUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/companies/{companyUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
DELETE /companies/{companyUUID}
Delete a company.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
companyUUID | path | string | true | The unique UUID for this company |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | successful operation | None |
400 | Bad Request | Bad request - invalid UUID format | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
404 | Not Found | company not found | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Update a company program version cohort
Code samples
# You can also use wget
curl -X PUT https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"cohortName": "string",
"maxEnrollees": 0,
"startDate": "string",
"endDate": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}',
{
method: 'PUT',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PUT','https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.put('https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.put 'https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PUT", "https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PUT");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
PUT /companies/{companyUUID}/program-versions/{programVersionUUID}
Updates an existing company program version cohort
Body parameter
{
"cohortName": "string",
"maxEnrollees": 0,
"startDate": "string",
"endDate": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
companyUUID | path | string | true | The unique UUID for this company |
programVersionUUID | path | string | true | The unique UUID for this program version |
cohortName | body | string | false | The name of the cohort |
maxEnrollees | body | integer | false | The maximum number of enrollees for this cohort |
startDate | body | string | false | The start date of the cohort |
endDate | body | string | false | The end date of the cohort |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"cohortName": "Cohort 1",
"maxEnrollees": 100,
"startDate": "2025-01-01T00:00:00.000Z",
"endDate": "string"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | CompanyProgramVersionCohort |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to update this company program version cohort | None |
404 | Not Found | not found - company or program version not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Remove program from company
Code samples
# You can also use wget
curl -X DELETE https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID} \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/companies/{companyUUID}/program-versions/{programVersionUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
DELETE /companies/{companyUUID}/program-versions/{programVersionUUID}
Removes a program from a specific company.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
companyUUID | path | string | true | The company UUID |
programVersionUUID | path | string | true | The program version UUID |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | successful operation | None |
400 | Bad Request | Bad request - invalid path parameters | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to remove program versions from this company | None |
404 | Not Found | company, program version, or assignment not found | None |
405 | Method Not Allowed | method not allowed | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Users
The /users endpoints manage user accounts and user data.
Supports creating new users, updating user information, deleting users, and bulk user uploads. Company admins can manage users within their company, while system admins can manage all users.
Get a list of users
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/users \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/users',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/users', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/users', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/users',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/users", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/users");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /users
Gets a list of users. If the user role is admin return all users. If the user role is companyAdmin return all users for the company. If user role is learner that just return the requesting user.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
include[] | query | array[string] | false | Array of attributes to include in the response |
Enumerated Values
Parameter | Value |
---|---|
include[] | Program.image |
include[] | Program.description |
Example responses
200 Response
[
{
"uuid": "string",
"name": "string",
"email": "user@example.com",
"role": "learner",
"isMe": true,
"Company": {
"uuid": "string",
"name": "string"
}
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to get users | None |
404 | Not Found | not found - user not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 200
Array of User objects
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [User] | false | none | Array of User objects |
» uuid | string | false | none | The unique UUID for this user |
» name | string | false | none | The name of the user |
string(email) | false | none | The email of the user | |
» role | string | false | none | The role of the user |
» isMe | boolean | false | none | Whether the user is the current user |
» Company | object | false | none | The company object |
»» uuid | string | false | none | The unique UUID for this company |
»» name | string | false | none | The name of the company |
Enumerated Values
Property | Value |
---|---|
role | learner |
role | companyAdmin |
role | admin |
Create new user
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/users \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"name": "string",
"role": "learner",
"email": "string",
"companyUUID": "string"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/users',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/users', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/users', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/users',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/users", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/users");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /users
Creates a new user.
Body parameter
{
"name": "string",
"role": "learner",
"email": "string",
"companyUUID": "string"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
name | body | string | true | The name of the user |
role | body | string | false | The role of the user. Admin users can set any role, companyAdmin users can only set companyAdmin or learner roles. |
body | string | true | The user's email | |
companyUUID | body | string | false | The company UUID. Required when admin users create companyAdmin or learner users. Not required when creating admin users. |
Enumerated Values
Parameter | Value |
---|---|
role | learner |
role | companyAdmin |
role | admin |
Example responses
201 Response
{
"uuid": "string",
"name": "string",
"email": "user@example.com",
"role": "learner",
"isMe": true,
"Company": {
"uuid": "string",
"name": "string"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | successful operation | User |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to upload users to this company | None |
404 | Not Found | company not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
409 | Conflict | conflict - email already in use | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Bulk upload users
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/users/bulk-upload \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"companyUUID": "string",
"users": [
{
"name": "string",
"email": "string"
}
]
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/users/bulk-upload',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/users/bulk-upload', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/users/bulk-upload', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/users/bulk-upload',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/users/bulk-upload", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/users/bulk-upload");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /users/bulk-upload
Bulk upload users to a company.
Body parameter
{
"companyUUID": "string",
"users": [
{
"name": "string",
"email": "string"
}
]
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
companyUUID | body | string | false | The company UUID. Required for admin users, not needed for companyAdmin users. |
users | body | [object] | true | Array of user objects to create (all users will be created as learners) |
» name | body | string | true | The name of the user |
body | string | true | The user's email address |
Example responses
201 Response
{
"created": [
{
"uuid": "string",
"name": "string",
"email": "user@example.com",
"role": "learner",
"isMe": true,
"Company": {
"uuid": "string",
"name": "string"
}
}
],
"errors": [
{
"email": "string",
"error": "string"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | successful operation | Inline |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to upload users to this company | None |
404 | Not Found | company not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
409 | Conflict | conflict - email already in use | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 201
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» created | [User] | false | none | Successfully created users (passwords not included in response) |
»» uuid | string | false | none | The unique UUID for this user |
»» name | string | false | none | The name of the user |
string(email) | false | none | The email of the user | |
»» role | string | false | none | The role of the user |
»» isMe | boolean | false | none | Whether the user is the current user |
»» Company | object | false | none | The company object |
»»» uuid | string | false | none | The unique UUID for this company |
»»» name | string | false | none | The name of the company |
» errors | [object] | false | none | Users that failed to create with error messages |
string | false | none | none | |
»» error | string | false | none | none |
Enumerated Values
Property | Value |
---|---|
role | learner |
role | companyAdmin |
role | admin |
Update a user
Code samples
# You can also use wget
curl -X PUT https://api.propel.tools/v1/users/{uuid} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"name": "string",
"email": "user@example.com",
"password": "stringst",
"role": "learner"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/users/{uuid}',
{
method: 'PUT',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PUT','https://api.propel.tools/v1/users/{uuid}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.put('https://api.propel.tools/v1/users/{uuid}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.put 'https://api.propel.tools/v1/users/{uuid}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PUT", "https://api.propel.tools/v1/users/{uuid}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/users/{uuid}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PUT");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
PUT /users/{uuid}
Updates an existing user
Body parameter
{
"name": "string",
"email": "user@example.com",
"password": "stringst",
"role": "learner"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
uuid | path | string | true | The unique UUID for this user |
name | body | string | false | The name of the user |
body | string(email) | false | The email of the user | |
password | body | string | false | The password of the user. Can only be set by the user. |
role | body | string | false | The role of the user. Admin users can set any role, companyAdmin users can only set companyAdmin or learner roles. |
Enumerated Values
Parameter | Value |
---|---|
role | learner |
role | companyAdmin |
role | admin |
Example responses
200 Response
{
"uuid": "string",
"name": "string",
"email": "user@example.com",
"role": "learner",
"isMe": true,
"Company": {
"uuid": "string",
"name": "string"
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | User |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
404 | Not Found | not found - user not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
409 | Conflict | conflict - email already in use | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Delete a user
Code samples
# You can also use wget
curl -X DELETE https://api.propel.tools/v1/users/{uuid} \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/users/{uuid}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api.propel.tools/v1/users/{uuid}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api.propel.tools/v1/users/{uuid}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api.propel.tools/v1/users/{uuid}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api.propel.tools/v1/users/{uuid}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/users/{uuid}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
DELETE /users/{uuid}
Delete a user.
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
uuid | path | string | true | The unique UUID for this user |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | successful operation | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
404 | Not Found | user not found | None |
Programs
The /programs endpoints manage learning programs and program versions.
Supports creating programs, getting program details, and managing program versions. Programs are the core learning content that users can enroll in.
Get programs
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/programs \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/programs',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/programs', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/programs', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/programs',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/programs", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/programs");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /programs
Gets a list of available programs
Example responses
200 Response
[
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"title": "Advanced Leadership",
"description": "This program is designed to help you become a leader in your organization.",
"image": "https://example.com/image.jpg",
"level": "beginner",
"tags": "leadership, management, training"
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to view this program | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 200
Array of Program objects
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [Program] | false | none | Array of Program objects |
» uuid | string | false | none | A unique UUID for this program |
» title | string | false | none | Program title |
» description | string | false | none | Program description |
» image | string | false | none | Program image URL |
» level | string | false | none | Program level |
» tags | string | false | none | Program tags |
Enumerated Values
Property | Value |
---|---|
level | beginner |
level | intermediate |
level | advanced |
Create program
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/programs \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"title": "Advanced Leadership Course",
"description": "Learn advanced leadership skills",
"image": "https://example.com/image.jpg",
"level": "intermediate",
"tags": "leadership,management"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/programs',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/programs', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/programs', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/programs',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/programs", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/programs");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /programs
Creates a new program
Body parameter
{
"title": "Advanced Leadership Course",
"description": "Learn advanced leadership skills",
"image": "https://example.com/image.jpg",
"level": "intermediate",
"tags": "leadership,management"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | ProgramCreate | true | none |
title | body | string | true | Program title |
description | body | string | true | Program description |
image | body | string | false | Program image URL |
level | body | string | false | Program difficulty level |
tags | body | string | false | Comma-separated tags |
Example responses
201 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"title": "Advanced Leadership",
"description": "This program is designed to help you become a leader in your organization.",
"image": "https://example.com/image.jpg",
"level": "beginner",
"tags": "leadership, management, training"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Program created successfully | Program |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Get program with versions
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/programs/{programUUID} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/programs/{programUUID}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/programs/{programUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/programs/{programUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/programs/{programUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/programs/{programUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/programs/{programUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /programs/{programUUID}
Get a program and its versions
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
programUUID | path | string | true | The program UUID |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"title": "Leadership Essentials",
"description": "Learn the basics of leadership and management",
"image": "https://example.com/image.png",
"level": "beginner",
"tags": "leadership,management,soft-skills",
"programVersions": [
{
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"versionNumber": 1,
"status": "live"
}
]
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | ProgramWithVersions |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - only admins can view programs | None |
404 | Not Found | not found - program not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Update program
Code samples
# You can also use wget
curl -X PATCH https://api.propel.tools/v1/programs/{programUUID} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"title": "Advanced Leadership",
"description": "This program is designed to help you become a leader in your organization.",
"image": "https://example.com/image.jpg",
"level": "beginner",
"tags": "leadership, management, training"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/programs/{programUUID}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api.propel.tools/v1/programs/{programUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api.propel.tools/v1/programs/{programUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api.propel.tools/v1/programs/{programUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api.propel.tools/v1/programs/{programUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/programs/{programUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
PATCH /programs/{programUUID}
Updates a program
Body parameter
{
"title": "Advanced Leadership",
"description": "This program is designed to help you become a leader in your organization.",
"image": "https://example.com/image.jpg",
"level": "beginner",
"tags": "leadership, management, training"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
programUUID | path | string | true | Program UUID |
body | body | ProgramUpdate | true | none |
title | body | string | false | Program title |
description | body | string | false | Program description |
image | body | string | false | Program image URL |
level | body | string | false | Program level |
tags | body | string | false | Program tags |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"title": "Advanced Leadership",
"description": "This program is designed to help you become a leader in your organization.",
"image": "https://example.com/image.jpg",
"level": "beginner",
"tags": "leadership, management, training"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Program updated successfully | Program |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
404 | Not Found | not found - program not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Delete program
Code samples
# You can also use wget
curl -X DELETE https://api.propel.tools/v1/programs/{programUUID} \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/programs/{programUUID}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api.propel.tools/v1/programs/{programUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api.propel.tools/v1/programs/{programUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api.propel.tools/v1/programs/{programUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api.propel.tools/v1/programs/{programUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/programs/{programUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
DELETE /programs/{programUUID}
Delete a program
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
programUUID | path | string | true | Program UUID |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Program deleted successfully | None |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
404 | Not Found | not found - program not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
Get programs coming soon
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/programs/status/coming-soon \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/programs/status/coming-soon',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/programs/status/coming-soon', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/programs/status/coming-soon', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/programs/status/coming-soon',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/programs/status/coming-soon", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/programs/status/coming-soon");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /programs/status/coming-soon
Get all programs with at least one version in 'comingSoon' status
Example responses
200 Response
[
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"title": "Leadership Essentials",
"description": "Learn the basics of leadership and management",
"image": "https://example.com/image.png",
"level": "beginner",
"tags": "leadership,management,soft-skills",
"programVersions": [
{
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"versionNumber": 1,
"status": "live"
}
]
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to view programs | None |
404 | Not Found | not found - program not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [ProgramWithVersions] | false | none | [Program with its versions] |
» uuid | string | false | none | Program UUID |
» title | string | false | none | Program title |
» description | string | false | none | Program description |
» image | string | false | none | Program image URL |
» level | string | false | none | Program level |
» tags | string | false | none | Program tags |
» programVersions | [object] | false | none | Array of program versions |
»» uuid | string | false | none | Program version UUID |
»» versionNumber | integer | false | none | Version number |
»» status | string | false | none | Program version status |
Enumerated Values
Property | Value |
---|---|
level | beginner |
level | intermediate |
level | advanced |
status | draft |
status | comingSoon |
status | live |
status | retired |
Get public programs
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/public-programs \
-H 'Accept: application/json'
const headers = {
'Accept':'application/json'
};
fetch('https://api.propel.tools/v1/public-programs',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/public-programs', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('https://api.propel.tools/v1/public-programs', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get 'https://api.propel.tools/v1/public-programs',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/public-programs", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/public-programs");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /public-programs
Get public programs
Returns public programs available to all users. This endpoint does not require authentication.
Example responses
200 Response
[
{
"title": "Working Smarter with Generative AI",
"description": "A practical training programme for busy professionals",
"image": "im12.png",
"level": "beginner",
"tags": "ai,productivity,automation"
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
400 | Bad Request | Invalid path parameters | None |
405 | Method Not Allowed | Method not allowed | None |
500 | Internal Server Error | Internal server error | None |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» title | string | true | none | Program title |
» description | string | true | none | Program description |
» image | string | true | none | Program image filename |
» level | string | true | none | Program difficulty level |
» tags | string | true | none | Comma-separated list of program tags |
Enumerated Values
Property | Value |
---|---|
level | beginner |
level | intermediate |
level | advanced |
Program Versions
The /program-versions endpoints manage different versions of learning programs.
Supports creating new program versions, updating existing versions, and retrieving version details. Program versions allow for content updates and improvements over time.
Get program version details
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/program-versions/{versionUUID} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/program-versions/{versionUUID}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/program-versions/{versionUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/program-versions/{versionUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/program-versions/{versionUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/program-versions/{versionUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/program-versions/{versionUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /program-versions/{versionUUID}
Gets details of a specific program version with modules and quizzes
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
versionUUID | path | string | true | Program Version UUID |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"versionNumber": 1,
"description": "First release of the advanced leadership course",
"status": "live"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | ProgramVersion |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to view program versions | None |
404 | Not Found | not found - program version not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Create program version
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/program-versions \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"programUUID": "02958d31-409a-4491-9105-479f48b3c5ca",
"versionNumber": 1,
"status": "draft"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/program-versions',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/program-versions', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/program-versions', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/program-versions',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/program-versions", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/program-versions");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /program-versions
Creates a new program version
Body parameter
{
"programUUID": "02958d31-409a-4491-9105-479f48b3c5ca",
"versionNumber": 1,
"status": "draft"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | ProgramVersionCreate | true | none |
programUUID | body | string | true | Program UUID |
versionNumber | body | integer | false | Version number |
status | body | string | false | Program version status |
Enumerated Values
Parameter | Value |
---|---|
status | draft |
status | comingSoon |
status | live |
status | retired |
Example responses
201 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"versionNumber": 1,
"description": "First release of the advanced leadership course",
"status": "live"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Program version created successfully | ProgramVersion |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
404 | Not Found | not found - program not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
409 | Conflict | conflict - version number already exists | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Update program version
Code samples
# You can also use wget
curl -X PATCH https://api.propel.tools/v1/program-versions/{programVersionUUID} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"description": "Updated description for the advanced leadership course",
"status": "live",
"versionNumber": 1
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/program-versions/{programVersionUUID}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api.propel.tools/v1/program-versions/{programVersionUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api.propel.tools/v1/program-versions/{programVersionUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api.propel.tools/v1/program-versions/{programVersionUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api.propel.tools/v1/program-versions/{programVersionUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/program-versions/{programVersionUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
PATCH /program-versions/{programVersionUUID}
Updates a program version (including publishing from draft to live)
Body parameter
{
"description": "Updated description for the advanced leadership course",
"status": "live",
"versionNumber": 1
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
programVersionUUID | path | string | true | Program Version UUID |
body | body | ProgramVersionUpdate | true | none |
description | body | string | false | Version description |
status | body | string | false | Program version status |
versionNumber | body | integer | false | Version number |
Enumerated Values
Parameter | Value |
---|---|
status | draft |
status | comingSoon |
status | live |
status | retired |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"versionNumber": 1,
"description": "First release of the advanced leadership course",
"status": "live"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Program version updated successfully | ProgramVersion |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
404 | Not Found | not found - program version not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Delete program version
Code samples
# You can also use wget
curl -X DELETE https://api.propel.tools/v1/program-versions/{programVersionUUID} \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/program-versions/{programVersionUUID}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api.propel.tools/v1/program-versions/{programVersionUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api.propel.tools/v1/program-versions/{programVersionUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api.propel.tools/v1/program-versions/{programVersionUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api.propel.tools/v1/program-versions/{programVersionUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/program-versions/{programVersionUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
DELETE /program-versions/{programVersionUUID}
Delete a program version
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
programVersionUUID | path | string | true | Program Version UUID |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Program version deleted successfully | None |
400 | Bad Request | Bad request - invalid UUID | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
404 | Not Found | Program version not found | None |
405 | Method Not Allowed | Method not allowed - DELETE only | None |
Delete program version modules
Code samples
# You can also use wget
curl -X DELETE https://api.propel.tools/v1/program-versions/{programVersionUUID}/modules \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/program-versions/{programVersionUUID}/modules',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api.propel.tools/v1/program-versions/{programVersionUUID}/modules', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api.propel.tools/v1/program-versions/{programVersionUUID}/modules', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api.propel.tools/v1/program-versions/{programVersionUUID}/modules',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api.propel.tools/v1/program-versions/{programVersionUUID}/modules", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/program-versions/{programVersionUUID}/modules");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
DELETE /program-versions/{programVersionUUID}/modules
Delete all modules for a program version
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
programVersionUUID | path | string | true | Program Version UUID |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Program version modules deleted successfully | None |
400 | Bad Request | Bad request - invalid UUID | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
404 | Not Found | Program version not found | None |
405 | Method Not Allowed | Method not allowed - DELETE only | None |
Modules
The /modules endpoints manage learning modules within program versions.
Supports creating new modules with content, ordering, and timing controls. Modules are the individual learning units that make up a program version.
Create new module
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/modules \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"type": "section",
"content": {},
"programVersionUUID": "a0f38c29-297c-4b1a-a4dd-d89e859d0194",
"orderIndex": 0,
"durationMinutes": 0
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/modules',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/modules', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/modules', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/modules',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/modules", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/modules");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /modules
Creates a new module.
Body parameter
{
"type": "section",
"content": {},
"programVersionUUID": "a0f38c29-297c-4b1a-a4dd-d89e859d0194",
"orderIndex": 0,
"durationMinutes": 0
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
type | body | string | true | The new type for the module |
content | body | object | true | The content of the module (JSON) |
programVersionUUID | body | string(uuid) | true | The UUID of the program version this module belongs to |
orderIndex | body | integer | false | The order of the module within the program version (optional) |
durationMinutes | body | integer | false | Estimated time to complete the module in minutes (optional) |
Enumerated Values
Parameter | Value |
---|---|
type | section |
type | text |
type | video |
Example responses
201 Response
{
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"type": "text",
"content": {
"sections": [
{
"title": "Introduction",
"text": "Welcome to the module"
}
]
},
"orderIndex": 1,
"durationMinutes": 30
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | successful operation | Module |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to create modules | None |
404 | Not Found | program version not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Update module
Code samples
# You can also use wget
curl -X PATCH https://api.propel.tools/v1/modules/{moduleUUID} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"type": "text",
"content": {},
"orderIndex": 0,
"durationMinutes": 0
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/modules/{moduleUUID}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api.propel.tools/v1/modules/{moduleUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api.propel.tools/v1/modules/{moduleUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api.propel.tools/v1/modules/{moduleUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api.propel.tools/v1/modules/{moduleUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/modules/{moduleUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
PATCH /modules/{moduleUUID}
Update a module by UUID
Body parameter
{
"type": "text",
"content": {},
"orderIndex": 0,
"durationMinutes": 0
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
moduleUUID | path | string(uuid) | true | UUID of the module to update |
type | body | string | false | The new type for the module |
content | body | object | false | The new JSON content for the module |
orderIndex | body | integer | false | The new order index for the module |
durationMinutes | body | integer | false | The new duration in minutes for the module |
Enumerated Values
Parameter | Value |
---|---|
type | text |
type | video |
Example responses
200 Response
{
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"type": "text",
"content": {
"sections": [
{
"title": "Introduction",
"text": "Welcome to the module"
}
]
},
"orderIndex": 1,
"durationMinutes": 30
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Module |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to update modules | None |
404 | Not Found | module not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Delete module
Code samples
# You can also use wget
curl -X DELETE https://api.propel.tools/v1/modules/{moduleUUID} \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/modules/{moduleUUID}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api.propel.tools/v1/modules/{moduleUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api.propel.tools/v1/modules/{moduleUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api.propel.tools/v1/modules/{moduleUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api.propel.tools/v1/modules/{moduleUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/modules/{moduleUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
DELETE /modules/{moduleUUID}
Delete a module
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
moduleUUID | path | string | true | Module UUID |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Module deleted successfully | None |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
404 | Not Found | not found - module not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Quizzes
The /quizzes endpoints manage quizzes within programs and learning modules.
Supports creating new quizzes with questions, ordering, and timing controls. Quizzes are assessment tools within learning modules.
Create new quiz
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/quizzes \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"content": {
"title": "Module 1 Assessment",
"instructions": "Answer all questions to complete this assessment"
},
"retryCount": 0,
"orderIndex": 0,
"moduleUUID": "c1a50997-68ed-425c-9966-ae6a87765103"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/quizzes',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/quizzes', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/quizzes', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/quizzes',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/quizzes", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/quizzes");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /quizzes
Creates a new quiz.
Body parameter
{
"content": {
"title": "Module 1 Assessment",
"instructions": "Answer all questions to complete this assessment"
},
"retryCount": 0,
"orderIndex": 0,
"moduleUUID": "c1a50997-68ed-425c-9966-ae6a87765103"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
content | body | object | true | The quiz content |
retryCount | body | integer | false | Number of times users can retry this quiz (optional, default 0) |
orderIndex | body | integer | false | The order index for this quiz (optional, default next number) |
moduleUUID | body | string(uuid) | true | UUID of the module this quiz is associated with |
Example responses
201 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"content": {},
"retryCount": 3,
"orderIndex": 1
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | successful operation | Quiz |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to create quizzes | None |
404 | Not Found | not found - module not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Update quiz
Code samples
# You can also use wget
curl -X PATCH https://api.propel.tools/v1/quizzes/{quizUUID} \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"content": {},
"retryCount": 0,
"orderIndex": 0
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/quizzes/{quizUUID}',
{
method: 'PATCH',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('PATCH','https://api.propel.tools/v1/quizzes/{quizUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.patch('https://api.propel.tools/v1/quizzes/{quizUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.patch 'https://api.propel.tools/v1/quizzes/{quizUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("PATCH", "https://api.propel.tools/v1/quizzes/{quizUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/quizzes/{quizUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("PATCH");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
PATCH /quizzes/{quizUUID}
Updates an existing quiz.
Body parameter
{
"content": {},
"retryCount": 0,
"orderIndex": 0
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
quizUUID | path | string(uuid) | true | UUID of the quiz to update |
content | body | object | false | The quiz content |
retryCount | body | integer | false | Number of times users can retry this quiz |
orderIndex | body | integer | false | The order index for this quiz |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"content": {},
"retryCount": 3,
"orderIndex": 1
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Quiz |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to update quizzes | None |
404 | Not Found | not found - quiz not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Delete quiz
Code samples
# You can also use wget
curl -X DELETE https://api.propel.tools/v1/quizzes/{quizUUID} \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/quizzes/{quizUUID}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api.propel.tools/v1/quizzes/{quizUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api.propel.tools/v1/quizzes/{quizUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api.propel.tools/v1/quizzes/{quizUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api.propel.tools/v1/quizzes/{quizUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/quizzes/{quizUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
DELETE /quizzes/{quizUUID}
Delete a quiz
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
quizUUID | path | string | true | Quiz UUID |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Quiz deleted successfully | None |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
404 | Not Found | not found - quiz not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
Enrollments
The /enrollments endpoints manage user enrollments in learning programs.
Supports creating enrollments, tracking progress, and managing enrollment status. Enrollments represent a user's participation in a specific program version.
Get user enrollments
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/enrollments \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/enrollments',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/enrollments', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/enrollments', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/enrollments',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/enrollments", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/enrollments");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /enrollments
Gets all enrollments for the authenticated user
Example responses
200 Response
[
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"enrolledAt": "2024-01-15T10:30:00.000Z",
"status": "notStarted",
"progressPercent": 0
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 200
Array of Enrollment objects
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [Enrollment] | false | none | Array of Enrollment objects |
» uuid | string | false | none | A unique UUID for this enrollment |
» enrolledAt | string(date-time) | false | none | When the user was enrolled |
» status | string | false | none | Enrollment status |
» progressPercent | number | false | none | Progress percentage (0-100) |
Create enrollment
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/enrollments \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"userUUID": "02958d31-409a-4491-9105-479f48b3c5ca",
"companyProgramVersionCohortUUID": "02958d31-409a-4491-9105-479f48b3c5ca"
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/enrollments',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/enrollments', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/enrollments', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/enrollments',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/enrollments", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/enrollments");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /enrollments
Enroll a user in a program version
Body parameter
{
"userUUID": "02958d31-409a-4491-9105-479f48b3c5ca",
"companyProgramVersionCohortUUID": "02958d31-409a-4491-9105-479f48b3c5ca"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | EnrollmentCreate | true | none |
userUUID | body | string | false | User UUID to enroll. Optional if user is learner and is enrolling themselves |
companyProgramVersionCohortUUID | body | string | true | Company program version cohort UUID to enroll in |
Example responses
201 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"enrolledAt": "2024-01-15T10:30:00.000Z",
"status": "notStarted",
"progressPercent": 0
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
201 | Created | Enrollment created successfully | Enrollment |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
404 | Not Found | not found - user or program version not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
409 | Conflict | conflict - user already enrolled in this program version | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Get enrollment
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/enrollments/{enrollmentUUID} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/enrollments/{enrollmentUUID}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/enrollments/{enrollmentUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/enrollments/{enrollmentUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/enrollments/{enrollmentUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/enrollments/{enrollmentUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/enrollments/{enrollmentUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /enrollments/{enrollmentUUID}
Gets enrollment with summary of modules
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
enrollmentUUID | path | string | true | Enrollment UUID |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"enrolledAt": "2024-01-15T10:30:00.000Z",
"status": "notStarted",
"progressPercent": 0
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Enrollment |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
404 | Not Found | not found - enrollment not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Delete enrollment
Code samples
# You can also use wget
curl -X DELETE https://api.propel.tools/v1/enrollments/{enrollmentUUID} \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/enrollments/{enrollmentUUID}',
{
method: 'DELETE',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('DELETE','https://api.propel.tools/v1/enrollments/{enrollmentUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Authorization': 'Bearer {access-token}'
}
r = requests.delete('https://api.propel.tools/v1/enrollments/{enrollmentUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.delete 'https://api.propel.tools/v1/enrollments/{enrollmentUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("DELETE", "https://api.propel.tools/v1/enrollments/{enrollmentUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/enrollments/{enrollmentUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("DELETE");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
DELETE /enrollments/{enrollmentUUID}
Unenroll a user from a program version
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
enrollmentUUID | path | string | true | Enrollment UUID |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | Enrollment deleted successfully | None |
400 | Bad Request | bad request - invalid UUID | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - insufficient permissions | None |
404 | Not Found | not found - enrollment not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
Enrollment Modules
The /enrollment-modules endpoints manage learning modules within enrollments.
Supports creating new modules with content, ordering, and timing controls. Modules are the individual learning units that make up an enrollment.
Get enrollment module
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID} \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /enrollment-modules/{enrollmentModuleUUID}
Gets enrollment module
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
enrollmentModuleUUID | path | string | true | Enrollment module UUID |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"type": "text",
"content": {
"title": "Introduction to AI",
"dateTime": "2024-01-15T10:30:00Z"
},
"orderIndex": 1,
"durationMinutes": 30,
"completedAt": "2024-01-15T10:30:00.000Z"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | EnrollmentModule |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
404 | Not Found | enrollment module not found | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Complete enrollment module
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}/complete \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}/complete',
{
method: 'POST',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}/complete', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}/complete', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}/complete',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}/complete", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/enrollment-modules/{enrollmentModuleUUID}/complete");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /enrollment-modules/{enrollmentModuleUUID}/complete
Mark a module as completed for an enrollment
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
enrollmentModuleUUID | path | string | true | Enrollment module UUID |
Example responses
200 Response
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"type": "text",
"content": {
"title": "Introduction to AI",
"dateTime": "2024-01-15T10:30:00Z"
},
"orderIndex": 1,
"durationMinutes": 30,
"completedAt": "2024-01-15T10:30:00.000Z"
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Module marked as completed successfully | EnrollmentModule |
400 | Bad Request | Bad request - invalid parameters | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - user not authorized to update this enrollment module | None |
404 | Not Found | not found - enrollment module not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
409 | Conflict | Module already completed | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Enrollment Quizzes
The /enrollment-quizzes endpoints manage quizzes within enrollments and learning modules.
Supports creating new quizzes with questions, ordering, and timing controls. Quizzes are assessment tools within learning modules.
Submit enrollment quizzes
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/enrollment-quizzes/submit \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const inputBody = '{
"quizAnswers": [
{
"enrollmentQuizUUID": "string",
"userAnswer": "string",
"isCorrect": true,
"score": 100
}
]
}';
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/enrollment-quizzes/submit',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/enrollment-quizzes/submit', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.post('https://api.propel.tools/v1/enrollment-quizzes/submit', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.post 'https://api.propel.tools/v1/enrollment-quizzes/submit',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/enrollment-quizzes/submit", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/enrollment-quizzes/submit");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /enrollment-quizzes/submit
Submit multiple quiz answers
Body parameter
{
"quizAnswers": [
{
"enrollmentQuizUUID": "string",
"userAnswer": "string",
"isCorrect": true,
"score": 100
}
]
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
quizAnswers | body | [object] | false | none |
» enrollmentQuizUUID | body | string | false | none |
» userAnswer | body | string | false | none |
» isCorrect | body | boolean | false | none |
» score | body | number | false | none |
Example responses
200 Response
{
"success": true
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Quizzes submitted successfully | Inline |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | Forbidden - user not authorized to update this enrollment quiz | None |
404 | Not Found | not found - enrollment quiz not found | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
409 | Conflict | Quiz already completed or too many attempts | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» success | boolean | false | none | none |
Certificates
The /certificates endpoints manage user certificates for completed enrollments.
Supports getting certificate URLs for the authenticated user. Certificates are issued when a user completes a program version.
Get user certificates
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/certificates \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/certificates',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/certificates', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/certificates', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/certificates',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/certificates", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/certificates");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /certificates
Gets all certificates for the authenticated user
Example responses
200 Response
[
{
"certificateUrl": "string",
"certificateIssuedAt": "string",
"cohort": {
"uuid": "string",
"cohortName": "string",
"programVersion": {
"uuid": "string",
"versionNumber": 0,
"status": "string",
"Program": {
"uuid": "string",
"title": "string",
"level": "string",
"tags": "string"
}
}
}
}
]
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
403 | Forbidden | forbidden - user not authorized to view certificates | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
422 | Unprocessable Entity | unprocessable entity - check error message | None |
Response Schema
Status Code 200
Array of Certificate objects
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
anonymous | [Certificate] | false | none | Array of Certificate objects |
» certificateUrl | string | false | none | URL of the certificate |
» certificateIssuedAt | string | false | none | Date and time the certificate was issued |
» cohort | object | false | none | Cohort information |
»» uuid | string | false | none | UUID of the cohort |
»» cohortName | string | false | none | Name of the cohort |
»» programVersion | object | false | none | Program version information |
»»» uuid | string | false | none | UUID of the program version |
»»» versionNumber | integer | false | none | Version number |
»»» status | string | false | none | Status of the program version |
»»» Program | object | false | none | Program information |
»»»» uuid | string | false | none | UUID of the program |
»»»» title | string | false | none | Title of the program |
»»»» level | string | false | none | Level of the program |
»»»» tags | string | false | none | Tags of the program |
Stats
The /public-stats endpoint returns summary data and statistics about the usage of the Propel system. The /stats endpoint returns statistics about the usage of the Propel system for authenticated users.
This endpoint does not require authentication as it is publicly accessible and used on the public-facing website.
The endpoint only supports GET requests.
Get statistics
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/stats \
-H 'Accept: application/json' \
-H 'Authorization: Bearer {access-token}'
const headers = {
'Accept':'application/json',
'Authorization':'Bearer {access-token}'
};
fetch('https://api.propel.tools/v1/stats',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/stats', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json',
'Authorization': 'Bearer {access-token}'
}
r = requests.get('https://api.propel.tools/v1/stats', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json',
'Authorization' => 'Bearer {access-token}'
}
result = RestClient.get 'https://api.propel.tools/v1/stats',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
"Authorization": []string{"Bearer {access-token}"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/stats", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/stats");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /stats
Get platform usage statistics
Returns comprehensive statistics about platform usage including users, companies, programs, enrollments, and completion rates
Example responses
200 Response
{
"users": {
"total": 0,
"byRole": {
"admin": 0,
"companyAdmin": 0,
"learner": 0
}
},
"companies": {
"total": 0,
"active": 0
},
"programs": {
"total": 0,
"versions": 0,
"live": 0
},
"enrollments": {
"total": 0,
"active": 0,
"completed": 0,
"completionRate": 0.1
},
"modules": {
"total": 0,
"completed": 0
},
"quizzes": {
"total": 0,
"attempts": 0,
"averageScore": 0.1
},
"recentActivity": {
"enrollmentsLast30Days": 0,
"completionsLast30Days": 0,
"activeUsersLast30Days": 0
}
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
405 | Method Not Allowed | Method not allowed | None |
500 | Internal Server Error | Internal server error | None |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» users | object | false | none | none |
»» total | integer | false | none | Total number of users |
»» byRole | object | false | none | none |
»»» admin | integer | false | none | none |
»»» companyAdmin | integer | false | none | none |
»»» learner | integer | false | none | none |
» companies | object | false | none | none |
»» total | integer | false | none | Total number of companies |
»» active | integer | false | none | Companies with active users |
» programs | object | false | none | none |
»» total | integer | false | none | Total number of programs |
»» versions | integer | false | none | Total number of program versions |
»» live | integer | false | none | Number of live program versions |
» enrollments | object | false | none | none |
»» total | integer | false | none | Total number of enrollments |
»» active | integer | false | none | Active enrollments (not completed) |
»» completed | integer | false | none | Completed enrollments |
»» completionRate | number(float) | false | none | Overall completion rate as percentage |
» modules | object | false | none | none |
»» total | integer | false | none | Total number of modules |
»» completed | integer | false | none | Total module completions across all enrollments |
» quizzes | object | false | none | none |
»» total | integer | false | none | Total number of quizzes |
»» attempts | integer | false | none | Total quiz attempts |
»» averageScore | number(float) | false | none | Average quiz score across all attempts |
» recentActivity | object | false | none | none |
»» enrollmentsLast30Days | integer | false | none | New enrollments in the last 30 days |
»» completionsLast30Days | integer | false | none | Completions in the last 30 days |
»» activeUsersLast30Days | integer | false | none | Users with activity in the last 30 days |
Get public stats
Code samples
# You can also use wget
curl -X GET https://api.propel.tools/v1/public-stats \
-H 'Accept: application/json'
const headers = {
'Accept':'application/json'
};
fetch('https://api.propel.tools/v1/public-stats',
{
method: 'GET',
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Accept' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('GET','https://api.propel.tools/v1/public-stats', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Accept': 'application/json'
}
r = requests.get('https://api.propel.tools/v1/public-stats', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Accept' => 'application/json'
}
result = RestClient.get 'https://api.propel.tools/v1/public-stats',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Accept": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("GET", "https://api.propel.tools/v1/public-stats", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/public-stats");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
GET /public-stats
Get public platform metrics
Returns public metrics - completion rate, total learners, modules completed, and new enrollments in the past 60 days.
Example responses
200 Response
{
"completionRate": 0.1,
"totalLearners": 0,
"modulesCompleted": 0,
"newEnrollmentsLast90Days": 0
}
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | successful operation | Inline |
405 | Method Not Allowed | Method not allowed | None |
500 | Internal Server Error | Internal server error | None |
Response Schema
Status Code 200
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
» completionRate | number(float) | false | none | Overall enrollment completion rate as a percentage |
» totalLearners | integer | false | none | Total number of users with role 'learner' |
» modulesCompleted | integer | false | none | Total number of completed modules |
» newEnrollmentsLast90Days | integer | false | none | Number of new enrollments in the last 90 days |
Telemetry
Create new telemetry event
Code samples
# You can also use wget
curl -X POST https://api.propel.tools/v1/telemetry \
-H 'Content-Type: application/json'
const inputBody = '{
"timeZone": "Europe/London",
"locale": "en-GB",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}';
const headers = {
'Content-Type':'application/json'
};
fetch('https://api.propel.tools/v1/telemetry',
{
method: 'POST',
body: inputBody,
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
);
$client = new \GuzzleHttp\Client();
// Define array of request body.
$request_body = array();
try {
$response = $client->request('POST','https://api.propel.tools/v1/telemetry', array(
'headers' => $headers,
'json' => $request_body,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
headers = {
'Content-Type': 'application/json'
}
r = requests.post('https://api.propel.tools/v1/telemetry', headers = headers)
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json'
}
result = RestClient.post 'https://api.propel.tools/v1/telemetry',
params: {
}, headers: headers
p JSON.parse(result)
package main
import (
"bytes"
"net/http"
)
func main() {
headers := map[string][]string{
"Content-Type": []string{"application/json"},
}
data := bytes.NewBuffer([]byte{jsonReq})
req, err := http.NewRequest("POST", "https://api.propel.tools/v1/telemetry", data)
req.Header = headers
client := &http.Client{}
resp, err := client.Do(req)
// ...
}
URL obj = new URL("https://api.propel.tools/v1/telemetry");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(response.toString());
POST /telemetry
Creates a new telemetry event.
Body parameter
{
"timeZone": "Europe/London",
"locale": "en-GB",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
}
Parameters
Name | In | Type | Required | Description |
---|---|---|---|---|
timeZone | body | string | true | The user's time zone |
locale | body | string | true | The user's locale |
userAgent | body | string | false | The user's user agent |
Responses
Status | Meaning | Description | Schema |
---|---|---|---|
204 | No Content | successful operation | None |
400 | Bad Request | bad request - invalid request body | None |
401 | Unauthorized | unauthorised - invalid Authorisation token | None |
405 | Method Not Allowed | method not allowed - invalid request method | None |
Schemas
Login
{
"idToken": "02958d31-409a-4491-9105-479f48b3c5ca",
"idTokenExpiry": 0,
"name": "John Doe",
"role": "learner"
}
Login information
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
idToken | string | false | none | A unique idToken for this user login |
idTokenExpiry | integer | false | none | The idToken expiry as a timestamp in seconds |
name | string | false | none | The user's name |
role | string | false | none | The user's role |
Enumerated Values
Property | Value |
---|---|
role | learner |
role | companyAdmin |
role | admin |
Company
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"name": "Acme Corp",
"industry": "Retail"
}
Company information. Returns the company.
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | A unique UUID for this company |
name | string | false | none | The company name |
industry | string | false | none | Industry for this company |
LeaderboardEntry
{
"program": {
"uuid": "string",
"title": "string"
},
"cohortName": "Cohort 1",
"cohortCreatedAt": "2019-08-24T14:15:22Z",
"entries": [
{
"rank": 0,
"user": {
"uuid": "string",
"name": "string"
},
"progressPercent": 0,
"haveCertificate": true
}
]
}
Leaderboard entry for a cohort
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
program | object | false | none | Program information |
» uuid | string | false | none | Program UUID |
» title | string | false | none | Program title |
cohortName | string | false | none | Cohort name |
cohortCreatedAt | string(date-time) | false | none | When the cohort was created |
entries | [object] | false | none | Array of user entries in this cohort |
» rank | integer | false | none | User's rank in the cohort |
» user | object | false | none | User information |
»» uuid | string | false | none | User UUID |
»» name | string | false | none | User name |
» progressPercent | number | false | none | Progress percentage |
» haveCertificate | boolean | false | none | Whether user has completed the program |
CompanyCohort
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"startDate": "2025-01-01T00:00:00.000Z",
"endDate": "2025-12-31T00:00:00.000Z",
"cohortName": "Cohort 1",
"maxEnrollees": 100,
"totalEnrollees": 25,
"programVersion": {
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"versionNumber": 1,
"status": "live",
"Program": {
"uuid": "string",
"title": "string",
"description": "Learn the basics of leadership and management",
"level": "beginner",
"tags": "leadership,management,soft-skills"
}
}
}
Company cohort information
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | A unique UUID for this cohort |
startDate | string | false | none | Start date of the cohort |
endDate | string | false | none | End date of the cohort |
cohortName | string | false | none | Cohort name |
maxEnrollees | integer | false | none | Maximum number of enrollees |
totalEnrollees | integer | false | none | Current number of enrolled users |
programVersion | object | false | none | Program version information |
» uuid | string | false | none | A unique UUID for this program version |
» versionNumber | integer | false | none | Version number |
» status | string | false | none | Program version status |
» Program | object | false | none | Program information |
»» uuid | string | false | none | Program UUID |
»» title | string | false | none | Program title |
»» description | string | false | none | Program description |
»» level | string | false | none | Program level |
»» tags | string | false | none | Program tags |
Enumerated Values
Property | Value |
---|---|
status | draft |
status | comingSoon |
status | live |
status | retired |
level | beginner |
level | intermediate |
level | advanced |
CompanyProgramVersionCohort
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"cohortName": "Cohort 1",
"maxEnrollees": 100,
"startDate": "2025-01-01T00:00:00.000Z",
"endDate": "string"
}
Company program version cohort information
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | A unique UUID for this cohort |
cohortName | string | false | none | The name of the cohort |
maxEnrollees | integer | false | none | The maximum number of enrollees for this cohort |
startDate | string | false | none | The start date of the cohort |
endDate | string | false | none | The end date of the cohort |
User
{
"uuid": "string",
"name": "string",
"email": "user@example.com",
"role": "learner",
"isMe": true,
"Company": {
"uuid": "string",
"name": "string"
}
}
A user object
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | The unique UUID for this user |
name | string | false | none | The name of the user |
string(email) | false | none | The email of the user | |
role | string | false | none | The role of the user |
isMe | boolean | false | none | Whether the user is the current user |
Company | object | false | none | The company object |
» uuid | string | false | none | The unique UUID for this company |
» name | string | false | none | The name of the company |
Enumerated Values
Property | Value |
---|---|
role | learner |
role | companyAdmin |
role | admin |
Program
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"title": "Advanced Leadership",
"description": "This program is designed to help you become a leader in your organization.",
"image": "https://example.com/image.jpg",
"level": "beginner",
"tags": "leadership, management, training"
}
Program information
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | A unique UUID for this program |
title | string | false | none | Program title |
description | string | false | none | Program description |
image | string | false | none | Program image URL |
level | string | false | none | Program level |
tags | string | false | none | Program tags |
Enumerated Values
Property | Value |
---|---|
level | beginner |
level | intermediate |
level | advanced |
ProgramWithVersions
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"title": "Leadership Essentials",
"description": "Learn the basics of leadership and management",
"image": "https://example.com/image.png",
"level": "beginner",
"tags": "leadership,management,soft-skills",
"programVersions": [
{
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"versionNumber": 1,
"status": "live"
}
]
}
Program with its versions
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | Program UUID |
title | string | false | none | Program title |
description | string | false | none | Program description |
image | string | false | none | Program image URL |
level | string | false | none | Program level |
tags | string | false | none | Program tags |
programVersions | [object] | false | none | Array of program versions |
» uuid | string | false | none | Program version UUID |
» versionNumber | integer | false | none | Version number |
» status | string | false | none | Program version status |
Enumerated Values
Property | Value |
---|---|
level | beginner |
level | intermediate |
level | advanced |
status | draft |
status | comingSoon |
status | live |
status | retired |
ProgramCreate
{
"title": "Advanced Leadership Course",
"description": "Learn advanced leadership skills",
"image": "https://example.com/image.jpg",
"level": "intermediate",
"tags": "leadership,management"
}
Program creation request
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
title | string | true | none | Program title |
description | string | true | none | Program description |
image | string | false | none | Program image URL |
level | string | false | none | Program difficulty level |
tags | string | false | none | Comma-separated tags |
ProgramUpdate
{
"title": "Advanced Leadership",
"description": "This program is designed to help you become a leader in your organization.",
"image": "https://example.com/image.jpg",
"level": "beginner",
"tags": "leadership, management, training"
}
Program update request
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
title | string | false | none | Program title |
description | string | false | none | Program description |
image | string | false | none | Program image URL |
level | string | false | none | Program level |
tags | string | false | none | Program tags |
Module
{
"uuid": "123e4567-e89b-12d3-a456-426614174000",
"type": "text",
"content": {
"sections": [
{
"title": "Introduction",
"text": "Welcome to the module"
}
]
},
"orderIndex": 1,
"durationMinutes": 30
}
Module information
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | A unique UUID for this module |
type | string | false | none | The type of module content |
content | object | false | none | JSON content for the module |
orderIndex | integer | false | none | The order of the module in the program |
durationMinutes | integer | false | none | Estimated duration in minutes |
Enumerated Values
Property | Value |
---|---|
type | text |
type | video |
Quiz
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"content": {},
"retryCount": 3,
"orderIndex": 1
}
Quiz information
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | A unique UUID for this quiz |
content | object | false | none | The quiz content (questions and answers) |
retryCount | integer | false | none | Number of times users can retry this quiz |
orderIndex | integer | false | none | The order index for this quiz |
ProgramVersion
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"versionNumber": 1,
"description": "First release of the advanced leadership course",
"status": "live"
}
Program version information
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | A unique UUID for this program version |
versionNumber | integer | false | none | Version number |
description | string | false | none | Version description |
status | string | false | none | Program version status |
Enumerated Values
Property | Value |
---|---|
status | draft |
status | comingSoon |
status | live |
status | retired |
ProgramVersionCreate
{
"programUUID": "02958d31-409a-4491-9105-479f48b3c5ca",
"versionNumber": 1,
"status": "draft"
}
Program version creation request
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
programUUID | string | true | none | Program UUID |
versionNumber | integer | false | none | Version number |
status | string | false | none | Program version status |
Enumerated Values
Property | Value |
---|---|
status | draft |
status | comingSoon |
status | live |
status | retired |
ProgramVersionUpdate
{
"description": "Updated description for the advanced leadership course",
"status": "live",
"versionNumber": 1
}
Program version update request
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
description | string | false | none | Version description |
status | string | false | none | Program version status |
versionNumber | integer | false | none | Version number |
Enumerated Values
Property | Value |
---|---|
status | draft |
status | comingSoon |
status | live |
status | retired |
Enrollment
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"enrolledAt": "2024-01-15T10:30:00.000Z",
"status": "notStarted",
"progressPercent": 0
}
Enrollment information
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | A unique UUID for this enrollment |
enrolledAt | string(date-time) | false | none | When the user was enrolled |
status | string | false | none | Enrollment status |
progressPercent | number | false | none | Progress percentage (0-100) |
EnrollmentCreate
{
"userUUID": "02958d31-409a-4491-9105-479f48b3c5ca",
"companyProgramVersionCohortUUID": "02958d31-409a-4491-9105-479f48b3c5ca"
}
Enrollment creation request
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
userUUID | string | false | none | User UUID to enroll. Optional if user is learner and is enrolling themselves |
companyProgramVersionCohortUUID | string | true | none | Company program version cohort UUID to enroll in |
EnrollmentModule
{
"uuid": "02958d31-409a-4491-9105-479f48b3c5ca",
"type": "text",
"content": {
"title": "Introduction to AI",
"dateTime": "2024-01-15T10:30:00Z"
},
"orderIndex": 1,
"durationMinutes": 30,
"completedAt": "2024-01-15T10:30:00.000Z"
}
Enrollment module information
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
uuid | string | false | none | A unique UUID for this enrollment module |
type | string | false | none | Module type |
content | object | false | none | JSON content for the module (filtered to only include title and dateTime if they exist) |
orderIndex | integer | false | none | Order index for this module |
durationMinutes | integer¦null | false | none | Duration in minutes (null if not set) |
completedAt | string(date-time)¦null | false | none | When the module was completed (null if not completed) |
Enumerated Values
Property | Value |
---|---|
type | section |
type | text |
type | video |
Certificate
{
"certificateUrl": "string",
"certificateIssuedAt": "string",
"cohort": {
"uuid": "string",
"cohortName": "string",
"programVersion": {
"uuid": "string",
"versionNumber": 0,
"status": "string",
"Program": {
"uuid": "string",
"title": "string",
"level": "string",
"tags": "string"
}
}
}
}
Certificate object
Properties
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
certificateUrl | string | false | none | URL of the certificate |
certificateIssuedAt | string | false | none | Date and time the certificate was issued |
cohort | object | false | none | Cohort information |
» uuid | string | false | none | UUID of the cohort |
» cohortName | string | false | none | Name of the cohort |
» programVersion | object | false | none | Program version information |
»» uuid | string | false | none | UUID of the program version |
»» versionNumber | integer | false | none | Version number |
»» status | string | false | none | Status of the program version |
»» Program | object | false | none | Program information |
»»» uuid | string | false | none | UUID of the program |
»»» title | string | false | none | Title of the program |
»»» level | string | false | none | Level of the program |
»»» tags | string | false | none | Tags of the program |