Caregiver Training API

Programmatically manage caregivers, enrollments, and your course library

The Caregiverlist REST API lets provider accounts create and manage caregiver users, enroll them in Caregiver Training University courses, retrieve exam results, and browse the course library. All requests are JSON over HTTPS and authenticated with a provider API key.

Interactive API reference: Explore every endpoint, request schema, and response model in our Swagger UI. Authorize with your API key GUID to send live requests from the browser.
Open Swagger Reference Get Your API Key
On this page

Authentication

Every API request must include your provider API key in the Authorization header using the Bearer scheme. You can find your key on the API Settings page in the provider portal.

Authorization: Bearer YOUR-API-KEY-GUID

Requests without a valid key receive 401 Unauthorized. Keys are tied to your provider account and only expose data for your organization.

Base URL & conventions

User endpoints

MethodEndpointDescription
GET/api/usersList users linked to your account. Query: include_inactive, custom_id.
GET/api/users/{user_id}Full user profile with enrollments, section progress, and exam results.
POST/api/usersCreate a user. Optionally enroll in courses on creation.
DELETE/api/users/{user_id}Remove a user from your provider account (not allowed if they have enrollments).
PUT/api/users/{user_id}/passwordSet the user's password. Body: { "new_password": "..." }
PUT/api/users/{user_id}/enrollmentsEnroll or unenroll in a course. Body: course_id, enroll, optional due_date.
DELETE/api/users/{user_id}/enrollments/{course_id}Unenroll from a course (blocked if exam already completed).
POST/api/users/bulk_enrollQueue bulk user creation/enrollment. Returns job_id.
GET/api/users/bulk_enroll/{job_id}Poll bulk job status and per-user results.
POST/api/users/{user_id}/send_password_resetEmail a password reset link to the user.
GET/api/users/statsAccount statistics: enrollment passes purchased, used, remaining, and user count.

Create user request body

{
  "first_name": "Jane",
  "last_name": "Smith",
  "email_address": "jane.smith@example.com",
  "hire_date": "2024-03-01T00:00:00",
  "custom_id": "EMP-1042",
  "enroll_course_ids": [101, 202],
  "reassign_if_exists": false,
  "skip_email": false
}

Course endpoints

MethodEndpointDescription
GET/api/coursesCourse library available to your provider, including sections.
GET/api/courses/{course_id}Single course details, credit hours, renewal info, and sections.

Code samples

Replace YOUR_API_KEY with the GUID from API Settings. Samples use production URL https://www.caregiverlist.com.

List users

curl -X GET "https://www.caregiverlist.com/api/users" \
  -H "Authorization: Bearer YOUR_API_KEY"
const response = await fetch("https://www.caregiverlist.com/api/users", {
  headers: { "Authorization": "Bearer YOUR_API_KEY" }
});
const users = await response.json();
console.log(users);
import requests

response = requests.get(
    "https://www.caregiverlist.com/api/users",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    timeout=30,
)
response.raise_for_status()
users = response.json()
print(users)
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "YOUR_API_KEY");

var response = await client.GetAsync("https://www.caregiverlist.com/api/users");
response.EnsureSuccessStatusCode();
var json = await response.Content.ReadAsStringAsync();
Console.WriteLine(json);
HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://www.caregiverlist.com/api/users"))
    .header("Authorization", "Bearer YOUR_API_KEY")
    .GET()
    .build();

HttpResponse<String> response = HttpClient.newHttpClient()
    .send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$ch = curl_init("https://www.caregiverlist.com/api/users");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer YOUR_API_KEY"],
]);
$body = curl_exec($ch);
curl_close($ch);
echo $body;
require "net/http"
require "json"

uri = URI("https://www.caregiverlist.com/api/users")
request = Net::HTTP::Get.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }
puts response.body
req, _ := http.NewRequest("GET", "https://www.caregiverlist.com/api/users", nil)
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")

resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
$headers = @{ Authorization = "Bearer YOUR_API_KEY" }
Invoke-RestMethod -Uri "https://www.caregiverlist.com/api/users" -Headers $headers -Method Get

Create user

curl -X POST "https://www.caregiverlist.com/api/users" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Jane",
    "last_name": "Smith",
    "email_address": "jane.smith@example.com",
    "hire_date": "2024-03-01T00:00:00",
    "enroll_course_ids": [101]
  }'
const response = await fetch("https://www.caregiverlist.com/api/users", {
  method: "POST",
  headers: {
    "Authorization": "Bearer YOUR_API_KEY",
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    first_name: "Jane",
    last_name: "Smith",
    email_address: "jane.smith@example.com",
    hire_date: "2024-03-01T00:00:00",
    enroll_course_ids: [101]
  })
});
const user = await response.json();
console.log(user);
import requests

payload = {
    "first_name": "Jane",
    "last_name": "Smith",
    "email_address": "jane.smith@example.com",
    "hire_date": "2024-03-01T00:00:00",
    "enroll_course_ids": [101],
}

response = requests.post(
    "https://www.caregiverlist.com/api/users",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json=payload,
    timeout=30,
)
response.raise_for_status()
print(response.json())
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "YOUR_API_KEY");

var payload = new {
    first_name = "Jane",
    last_name = "Smith",
    email_address = "jane.smith@example.com",
    hire_date = "2024-03-01T00:00:00",
    enroll_course_ids = new[] { 101 }
};
var content = new StringContent(
    System.Text.Json.JsonSerializer.Serialize(payload),
    System.Text.Encoding.UTF8,
    "application/json");

var response = await client.PostAsync("https://www.caregiverlist.com/api/users", content);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
String json = """
            {"first_name":"Jane","last_name":"Smith","email_address":"jane.smith@example.com","hire_date":"2024-03-01T00:00:00","enroll_course_ids":[101]}
            """;

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://www.caregiverlist.com/api/users"))
    .header("Authorization", "Bearer YOUR_API_KEY")
    .header("Content-Type", "application/json")
    .POST(HttpRequest.BodyPublishers.ofString(json))
    .build();

HttpResponse<String> response = HttpClient.newHttpClient()
    .send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
$payload = json_encode([
    "first_name" => "Jane",
    "last_name" => "Smith",
    "email_address" => "jane.smith@example.com",
    "hire_date" => "2024-03-01T00:00:00",
    "enroll_course_ids" => [101],
]);

$ch = curl_init("https://www.caregiverlist.com/api/users");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        "Authorization: Bearer YOUR_API_KEY",
        "Content-Type: application/json",
    ],
    CURLOPT_POSTFIELDS => $payload,
]);
$body = curl_exec($ch);
curl_close($ch);
echo $body;
require "net/http"
require "json"

uri = URI("https://www.caregiverlist.com/api/users")
request = Net::HTTP::Post.new(uri)
request["Authorization"] = "Bearer YOUR_API_KEY"
request["Content-Type"] = "application/json"
request.body = {
  first_name: "Jane",
  last_name: "Smith",
  email_address: "jane.smith@example.com",
  hire_date: "2024-03-01T00:00:00",
  enroll_course_ids: [101]
}.to_json

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(request) }
puts response.body
payload := []byte(`{"first_name":"Jane","last_name":"Smith","email_address":"jane.smith@example.com","hire_date":"2024-03-01T00:00:00","enroll_course_ids":[101]}`)
req, _ := http.NewRequest("POST", "https://www.caregiverlist.com/api/users", bytes.NewReader(payload))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")

resp, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
$headers = @{
  Authorization = "Bearer YOUR_API_KEY"
  "Content-Type" = "application/json"
}
$body = @{
  first_name = "Jane"
  last_name = "Smith"
  email_address = "jane.smith@example.com"
  hire_date = "2024-03-01T00:00:00"
  enroll_course_ids = @(101)
} | ConvertTo-Json

Invoke-RestMethod -Uri "https://www.caregiverlist.com/api/users" -Headers $headers -Method Post -Body $body

Errors & status codes

StatusMeaning
200Success. Response body contains the requested resource or confirmation.
400Bad request - validation error, insufficient enrollment passes, or business rule violation. Body includes { "error": "message" }.
401Missing or invalid API key.
404User or bulk job not found, or not linked to your provider account.

See the Swagger reference for full response schemas including UserModel, UserListModel, CourseModel, and error payloads.

Ready to explore every field and try requests interactively?
Open Swagger API Reference