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.
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.
https://www.caregiverlist.comContent-Type: application/json on POST and PUT requestsfirst_name, course_id)2023-01-15T00:00:00)| Method | Endpoint | Description |
|---|---|---|
| GET | /api/users | List 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/users | Create 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}/password | Set the user's password. Body: { "new_password": "..." } |
| PUT | /api/users/{user_id}/enrollments | Enroll 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_enroll | Queue 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_reset | Email a password reset link to the user. |
| GET | /api/users/stats | Account statistics: enrollment passes purchased, used, remaining, and user count. |
{
"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
}
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/courses | Course library available to your provider, including sections. |
| GET | /api/courses/{course_id} | Single course details, credit hours, renewal info, and sections. |
Replace YOUR_API_KEY with the GUID from API Settings. Samples use production URL https://www.caregiverlist.com.
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
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
| Status | Meaning |
|---|---|
200 | Success. Response body contains the requested resource or confirmation. |
400 | Bad request - validation error, insufficient enrollment passes, or business rule violation. Body includes { "error": "message" }. |
401 | Missing or invalid API key. |
404 | User 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.