Consultar el progreso de tus colaboradores en los cursos y rutas de aprendizaje de Academia desde tus propios sistemas: reporting, dashboards internos, LMS/HRIS.
Ver el detalle de qué secciones completó cada colaborador, sus resultados de quiz, y si está al día, vencido o por vencer.
Base URL: todos los endpoints viven bajo el prefijo {{base_url}}/api/companies/v1.
Para obtener el host de producción (
base_url), contacta a tu representante de Whalemate o escríbenos a través del chat de soporte.
Autenticación: header X-API-KEY.
X-API-KEY: tu_api_key_de_empresa
Genera o consulta tu clave desde Configuración → Integraciones → tarjeta Claves API → Claves Activas. Detalle en Claves API: cómo generarlas, usarlas y revocarlas.
La compañía se resuelve automáticamente a partir de la API Key: no envías company_id, y cada request opera únicamente sobre las inscripciones de colaboradores de tu compañía.
Header | Valor | Obligatorio |
|---|---|---|
| Tu API Key de empresa | ✅ Sí |
|
| ✅ Sí |
Importante: a diferencia de la API de Empleados, los filtros de texto de estos dos endpoints son de coincidencia exacta, no
LIKEparcial. Cualquiera de ellos acepta también un array de valores para hacer un OR entre varios (filter[department][]=Finanzas&filter[department][]=IT).
GET {{base_url}}/api/companies/v1/course-inscriptions
Paginado: devuelve como máximo per_page inscripciones por request, envueltas en data/links/meta.
Param | Tipo | Descripción |
|---|---|---|
| string o array | Nombre(s) exacto(s) del colaborador |
| string o array | Apellido(s) exacto(s) |
| string o array | Email(s) exacto(s) |
| string o array | Departamento(s) exacto(s) |
| string o array | País(es) exacto(s) |
| integer o array | ID(s) de grupo (no el nombre) |
| integer o array | ID(s) de curso |
| fecha (YYYY-MM-DD) |
|
| fecha (YYYY-MM-DD) |
|
| fecha (YYYY-MM-DD) |
|
| fecha (YYYY-MM-DD) |
|
| integer | Default |
| integer | Default |
Ejemplo Request:
GET {{base_url}}/api/companies/v1/course-inscriptions?filter[department]=Finanzas&filter[from_due_date]=2026-01-01&per_page=20
Respuesta (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 (dentro de los 30 días previos al vencimiento), Expired, Completed o Deleted (colaborador dado de baja). start_date/due_date en formato d/m/Y.
events: mezcla de secciones completadas y resultados de quiz, ordenados por completed_at ascendente. Para una sección normal, result y status vienen en null; para un quiz, result es la nota numérica y status es approved (nota > 5) o disapproved.
GET {{base_url}}/api/companies/v1/learning-path-inscriptions
Mismo formato que Inscripciones a cursos, pero sobre rutas de aprendizaje (conjuntos de cursos).
Param | Tipo | Descripción |
|---|---|---|
| string o array | Nombre(s) exacto(s) del colaborador |
| string o array | Apellido(s) exacto(s) |
| string o array | Email(s) exacto(s) |
| string o array | Departamento(s) exacto(s) |
| string o array | País(es) exacto(s) |
| integer o array | ID(s) de grupo |
| string | Título exacto de la ruta de aprendizaje (no ID, no coincidencia parcial) |
| fecha (YYYY-MM-DD) | Rango sobre |
| fecha (YYYY-MM-DD) | Rango sobre |
| integer | Default |
| integer | Default |
Respuesta (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 aquí solo puede ser Pending, Expired, Completed o Deleted — las rutas de aprendizaje no tienen el estado About to expire.
courses: un objeto por cada curso que compone la ruta, con sus propios events (mismo formato que en Inscripciones a cursos). Un curso sin actividad todavía viene con events: [].
Código | Causa | Body |
|---|---|---|
| Falta |
|
| API Key inexistente/revocada |
|
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"
Envié filter[department]=Fin esperando que traiga "Finanzas" y no trajo nada. Estos filtros son de coincidencia exacta, no parcial. Tenés que enviar el valor completo tal cual está guardado (filter[department]=Finanzas).
¿filter[teams] es el nombre del grupo? No, es el id numérico del grupo. Podés consultarlo desde la plataforma.
¿filter[learning_path] acepta el ID de la ruta? No, espera el título exacto de la ruta de aprendizaje.
¿Puedo filtrar por varios valores a la vez? Sí, la mayoría de los filtros de texto/ID aceptan un array (filter[country][]=Argentina&filter[country][]=Chile).
¿Viene paginado? Sí, 20 por página por defecto (meta.per_page), ajustable con ?per_page= y navegable con ?page=.
¿Dónde consigo mi API Key? En Configuración → Integraciones → tarjeta Claves API → Claves Activas.
¿Tienes feedback o quieres solicitar mejoras? Háznoslo saber en roadmap.whalemate.com/roadmap