NAV
Curl JavaScript PHP Python Ruby Go Java

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

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
email 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
email 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
» email 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.
email 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
» email 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
»» email 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
»» email 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
email 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
email 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