Check the progress of your collaborators in Academia's courses and learning paths from your own systems: reporting, internal dashboards, LMS/HRIS.
See the detail of which sections each collaborator completed, their quiz results, and whether they are up to date, expired, or about to expire.
Base URL: all endpoints live under the prefix {{base_url}}/api/companies/v1.
To get the production host (
base_url), contact your Whalemate representative or write to us through the support chat.
Authentication: header X-API-KEY.
X-API-KEY: tu_api_key_de_empresa
Generate or check your key from Configuración → Integraciones → Claves API card → Claves Activas. Detail in Claves API: cómo generarlas, usarlas y revocarlas.
The company is automatically resolved from the API Key: you don't send company_id, and each request operates only on the collaborator enrollments of your company.
Header | Value | Required |
|---|---|---|
| Your company API Key | ✅ Yes |
|
| ✅ Yes |
Important: unlike the Employees API, the text filters of these two endpoints are an exact match, not partial
LIKE. Any of them also accept an array of values to make an OR between several (filter[department][]=Finanzas&filter[department][]=IT).
GET {{base_url}}/api/companies/v1/course-inscriptions
Paginated: returns at most per_page enrollments per request, wrapped in data/links/meta.
Param | Type | Description |
|---|---|---|
| string or array | Exact name(s) of the collaborator |
| string or array | Exact last name(s) |
| string or array | Exact email(s) |
| string or array | Exact department(s) |
| string or array | Exact country/countries |
| integer or array | Group ID(s) (not the name) |
| integer or array | Course ID(s) |
| date (YYYY-MM-DD) |
|
| date (YYYY-MM-DD) |
|
| date (YYYY-MM-DD) |
|
| date (YYYY-MM-DD) |
|
| integer | Default |
| integer | Default |
Example Request:
GET {{base_url}}/api/companies/v1/course-inscriptions?filter[department]=Finanzas&filter[from_due_date]=2026-01-01&per_page=20
Response (200 OK):
{
"data": [
{
"victim_name": "Juan Pérez",
"victim_department": "Finanzas",
"course_title": "Phishing 101",
"start_date": "01/03/2026",
"due_date": "31/03/2026",
"status": "Completed",
"victim_email": "[email protected]",
"groups": ["Finanzas"],
"victim_country": "Argentina",
"events": [
{
"title": "Introducción",
"section_type": "video",
"completed_at": "2026-03-05 10:15:00",
"result": null,
"status": null
},
{
"title": "Quiz final",
"section_type": "quiz",
"completed_at": "2026-03-05 10:22:00",
"result": 8,
"status": "approved"
}
]
}
],
"links": { "first": "...", "last": "...", "prev": null, "next": "..." },
"meta": { "current_page": 1, "per_page": 20, "total": 134, "last_page": 7 }
}
status: Pending, About to expire (within the 30 days prior to expiration), Expired, Completed or Deleted (collaborator removed). start_date/due_date in d/m/Y format.
events: mix of completed sections and quiz results, sorted by completed_at ascending. For a normal section, result and status come as null; for a quiz, result is the numeric grade and status is approved (grade > 5) or disapproved.
GET {{base_url}}/api/companies/v1/learning-path-inscriptions
Same format as Course enrollments, but for learning paths (sets of courses).
Param | Type | Description |
|---|---|---|
| string or array | Exact name(s) of the collaborator |
| string or array | Exact last name(s) |
| string or array | Exact email(s) |
| string or array | Exact department(s) |
| string or array | Exact country/countries |
| integer or array | Group ID(s) |
| string | Exact title of the learning path (not ID, not partial match) |
| date (YYYY-MM-DD) | Range on |
| date (YYYY-MM-DD) | Range on |
| integer | Default |
| integer | Default |
Response (200 OK):
{
"data": [
{
"victim_name": "Juan Pérez",
"victim_department": "Finanzas",
"learning_path_title": "Onboarding de Seguridad",
"start_date": "01/03/2026",
"due_date": "30/04/2026",
"status": "Pending",
"victim_email": "[email protected]",
"groups": ["Finanzas"],
"victim_country": "Argentina",
"courses": [
{
"title": "Phishing 101",
"events": [
{
"title": "Introducción",
"section_type": "video",
"completed_at": "2026-03-05 10:15:00",
"result": null,
"status": null
}
]
},
{
"title": "Contraseñas seguras",
"events": []
}
]
}
],
"links": { "first": "...", "last": "...", "prev": null, "next": "..." },
"meta": { "current_page": 1, "per_page": 20, "total": 40, "last_page": 2 }
}
status here can only be Pending, Expired, Completed or Deleted, learning paths don't have the About to expire status.
courses: one object for each course that makes up the path, with its own events (same format as in Course enrollments). A course without activity yet comes with events: [].
Code | Cause | Body |
|---|---|---|
| Missing |
|
| Nonexistent/revoked API Key |
|
curl -X GET "https://api.whalemate.io/api/companies/v1/course-inscriptions?filter[department]=Finanzas&per_page=20" \
-H "X-API-KEY: tu_api_key_aqui" -H "Accept: application/json"
I sent filter[department]=Fin expecting it to bring back "Finanzas" and it brought nothing. These filters are an exact match, not partial. You have to send the complete value exactly as it is stored (filter[department]=Finanzas).
Is filter[teams] the name of the group? No, it's the numeric id of the group. You can check it from the platform.
Does filter[learning_path] accept the path's ID? No, it expects the exact title of the learning path.
Can I filter by several values at once? Yes, most text/ID filters accept an array (filter[country][]=Argentina&filter[country][]=Chile).
Is it paginated? Yes, 20 per page by default (meta.per_page), adjustable with ?per_page= and navigable with ?page=.
Where do I get my API Key? In Configuración → Integraciones → Claves API card → Claves Activas.
Do you have feedback or want to request improvements? Let us know at roadmap.whalemate.com/roadmap