API REST para integración con sistemas externos (SAP, ERP, etc.)
Todas las peticiones requieren HTTP Basic Auth con las mismas credenciales que se usan para acceder al panel de Gesbon.
owner_id = master, así que un sub-usuario ve exactamente las mismas empresas y grupos que su master.
403 Forbidden.
# Con curl curl -u "[email protected]:contraseña" https://api.gesbon.es/v1/bonificada/trabajadores?ejercicio=2026&empresa_id=123 # O con header explícito (Base64 de "email:password") curl -H "Authorization: Basic ZW1haWxAZW1wcmVzYS5jb206Y29udHJhc2XDsWE=" https://api.gesbon.es/v1/...
https://api.gesbon.es/v1/{perfil}/{recurso}
| Perfil | Descripción |
|---|---|
bonificada | Formación bonificada por FUNDAE |
organizadora | Entidad organizadora |
grupo_empresas | Grupo de empresas |
| Parámetro | Tipo | Descripción |
|---|---|---|
ejercicio | integer | OBLIGATORIO. Año fiscal (ej: 2026). Se pasa como query param: ?ejercicio=2026 |
empresa_id | integer | OBLIGATORIO. ID de la empresa en Gesbon. Se pasa como query param o en el body JSON. |
GET /v1/{perfil}/empresas?ejercicio={año} para listar tus empresas y obtener sus IDs.
/v1/{perfil}/trabajadores?ejercicio={año}&empresa_id={id}
Lista los trabajadores de una empresa. Soporta paginación y búsqueda.
| Parámetro | Tipo | Default | Descripción |
|---|---|---|---|
page | integer | 1 | Página |
limit | integer | 100 | Resultados por página (máx 500) |
search | string | - | Busca en NIF, nombre, apellidos, NISS, email |
{
"data": [
{
"id": 12345,
"empresa_id": 5196,
"ejercicio": 2026,
"tipo_documento": "NIF",
"documento": "12345678Z",
"nombre": "Juan",
"primer_apellido": "García",
"segundo_apellido": "López",
"genero": "Hombre",
"fecha_nacimiento": "15/03/1990",
"niss": "281234567890",
"cuenta_cotizacion": "28123456789",
"email": "[email protected]",
"telefono": "600123456",
"salario_bruto_anual": "30000",
"horas_convenio": "1800",
"nivel_estudios": 4,
"categoria_profesional": 5,
"grupo_cotizacion": 5,
"discapacidad": 0,
"victima_terrorismo": 0,
"violencia_genero": 0,
"fijo_discontinuo": 0,
"creado": 1710720000
}
],
"pagination": { "page": 1, "limit": 100, "total": 47, "pages": 1 }
}
/v1/{perfil}/trabajadores/{id}?ejercicio={año}
Obtiene un trabajador por su ID.
/v1/{perfil}/trabajadores?ejercicio={año}
Crea un nuevo trabajador o actualiza uno existente (upsert).
"action": "created" → Se creó un nuevo trabajador (HTTP 201)
"action": "updated" → Se actualizó uno existente (HTTP 200)
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
empresa_id | integer | Sí | ID de la empresa en Gesbon |
tipo_documento | string | Sí | NIF, NIE, o Pasaporte |
documento | string | Sí | NIF/NIE/Pasaporte. Se valida checksum para NIF y NIE. |
nombre | string | Sí | Nombre del trabajador |
primer_apellido | string | Sí | Primer apellido |
segundo_apellido | string | Sí | Segundo apellido |
genero | string | No | Hombre o Mujer |
fecha_nacimiento | string | No | Formato dd/mm/yyyy. Edad mínima: 16 años. |
niss | string | No | Número de Seguridad Social (12 dígitos, se valida checksum) |
cuenta_cotizacion | string | No | Código de cuenta de cotización |
email | string | No | Email del trabajador (se valida formato) |
telefono | string | No | Teléfono |
salario_bruto_anual | string | No | Salario bruto anual en euros |
horas_convenio | string | No | Horas anuales de convenio |
nivel_estudios | integer | No | Nivel de estudios (código numérico 0-10) |
categoria_profesional | integer | No | Categoría profesional (código numérico) |
grupo_cotizacion | integer | No | Grupo de cotización TGSS |
discapacidad | integer | No | 0 o 1 |
victima_terrorismo | integer | No | 0 o 1 |
violencia_genero | integer | No | 0 o 1 |
fijo_discontinuo | integer | No | 0 o 1 |
curl -X POST \ -u "[email protected]:password" \ -H "Content-Type: application/json" \ -d '{ "empresa_id": 5196, "tipo_documento": "NIF", "documento": "12345678Z", "nombre": "Juan", "primer_apellido": "García", "segundo_apellido": "López", "genero": "Hombre", "fecha_nacimiento": "15/03/1990", "niss": "281234567890", "email": "[email protected]", "salario_bruto_anual": "30000", "horas_convenio": "1800" }' \ "https://api.gesbon.es/v1/bonificada/trabajadores?ejercicio=2026"
{
"data": { /* objeto trabajador completo */ },
"action": "created",
"message": "Trabajador created successfully."
}
{
"data": { /* objeto trabajador actualizado */ },
"action": "updated",
"message": "Trabajador with NIF '12345678Z' already existed and was updated (upsert)."
}
/v1/{perfil}/trabajadores/{id}?ejercicio={año}
Actualiza un trabajador existente por su ID. Solo se actualizan los campos enviados.
curl -X PUT \ -u "[email protected]:password" \ -H "Content-Type: application/json" \ -d '{ "empresa_id": 5196, "email": "[email protected]", "telefono": "600999888" }' \ "https://api.gesbon.es/v1/bonificada/trabajadores/12345?ejercicio=2026"
/v1/{perfil}/trabajadores/{id}?ejercicio={año}&empresa_id={id}
Elimina un trabajador. También elimina sus asignaciones como participante en grupos formativos y como formador interno.
/v1/{perfil}/empresas?ejercicio={año}
Lista todas las empresas del usuario. No requiere empresa_id.
| Parámetro | Tipo | Descripción |
|---|---|---|
search | string | Busca en NIF, nombre fiscal, nombre comercial |
{
"data": [
{
"id": 5196,
"ejercicio": 2026,
"nif": "B12345678",
"nombre_fiscal": "Empresa Ejemplo S.L.",
"nombre_comercial": "Ejemplo",
"representante_legal": "Juan García",
"direccion": "Calle Mayor 1",
"codigo_postal": "28001",
"provincia": "Madrid",
"poblacion": "Madrid",
"telefono": "910000000",
"email": "[email protected]",
"expediente": "EX-2026-001",
"cuenta_cotizacion": "28123456789",
"credito_asignado": 15000.00,
"plantilla_media": 50
}
],
"total": 3,
"filters": { "ejercicio": 2026, "search": null }
}
organizadora y grupo_empresas: agrupacion, cabecera, credito_dispuesto, credito_disponible, cnae, pyme.
/v1/{perfil}/empresas/{id}?ejercicio={año}
Obtiene una empresa por su ID.
/v1/{perfil}/acciones_formativas?ejercicio={año}&empresa_id={id}
Lista las acciones formativas de una empresa.
/v1/{perfil}/acciones_formativas/{id}?ejercicio={año}
Obtiene una acción formativa por su ID.
/v1/{perfil}/acciones_formativas?ejercicio={año}
Crea una nueva acción formativa o actualiza una existente (upsert por codigo + empresa_id + ejercicio).
codigo para la misma empresa y ejercicio, la API actualiza sus datos en lugar de crear una nueva.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
empresa_id | integer | Sí | ID de la empresa en Gesbon |
codigo | string | Sí | Código de la acción formativa (máx 4 caracteres) |
denominacion | string | Sí | Nombre de la acción formativa |
tipo | string | No | Propia o Parcial (default: Propia) |
grupo | string | No | Grupo de la acción |
modalidad | string | No | Presencial, Teleformación o Mixta |
horas_presencial | number | No | Horas presenciales (obligatorio si modalidad es Presencial o Mixta) |
horas_teleformacion | number | No | Horas teleformación (obligatorio si modalidad es Teleformación o Mixta) |
cif | string | No | CIF del centro de formación |
razon_social | string | No | Razón social del centro de formación |
url | string | No | URL de teleformación |
nivel_formacion | string | No | Nivel de formación |
objetivos | string | No | Objetivos de la acción |
contenidos_fundae | string | No | Contenidos para FUNDAE |
contenidos_documentacion | string | No | Contenidos para documentación |
organizadora y grupo_empresas: id_agrupacion, area_profesional.
Presencial, se requiere horas_presencial. Si es Teleformación, se requiere horas_teleformacion. Si es Mixta, se requieren ambos campos.
/v1/{perfil}/acciones_formativas/{id}?ejercicio={año}
Actualiza una acción formativa existente por su ID. Solo se actualizan los campos enviados.
/v1/{perfil}/acciones_formativas/{id}?ejercicio={año}&empresa_id={id}
Elimina una acción formativa.
/v1/{perfil}/grupos_formativos?ejercicio={año}&empresa_id={id}
Lista los grupos formativos de una empresa. Opcionalmente filtra por accion_formativa_id.
| Parámetro | Tipo | Descripción |
|---|---|---|
accion_formativa_id | integer | Filtra grupos por acción formativa |
/v1/{perfil}/grupos_formativos/{id}?ejercicio={año}
Obtiene un grupo formativo por su ID.
/v1/{perfil}/grupos_formativos?ejercicio={año}
Crea un nuevo grupo formativo o actualiza uno existente (upsert por codigo + accion_formativa_id + empresa_id + ejercicio).
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
empresa_id | integer | Sí | ID de la empresa en Gesbon |
accion_formativa_id | integer | Sí | ID de la acción formativa a la que pertenece |
codigo | string | Sí | Código del grupo |
denominacion | string | Sí | Nombre del grupo |
numero_participantes | integer | No | Número de participantes (máx 30 presencial / 80 teleformación) |
fecha_inicio | string | No | Fecha de inicio (dd/mm/yyyy). Debe ser anterior o igual a fecha_fin. |
fecha_fin | string | No | Fecha de fin (dd/mm/yyyy) |
persona_contacto | string | No | Persona de contacto |
telefono | string | No | Teléfono de contacto |
costes_directos | number | No | Costes directos |
costes_indirectos | number | No | Costes indirectos |
costes_salariales | number | No | Costes salariales |
finalizado | integer | No | 0 o 1 |
bonificada: horas_jornada_laboral (integer)
organizadora / grupo_empresas: id_agrupacion, costes_organizacion
/v1/{perfil}/grupos_formativos/{id}?ejercicio={año}
Actualiza un grupo formativo existente por su ID. Solo se actualizan los campos enviados.
/v1/{perfil}/grupos_formativos/{id}?ejercicio={año}&empresa_id={id}
Elimina un grupo formativo.
/v1/{perfil}/grupos_formativos/{id}/asignar_documentos?ejercicio={año}
Asigna automáticamente los documentos firmables a todos los participantes del grupo según su modalidad y los flags de aula virtual / bimodal. La generación física del PDF y la asignación se hacen en cadena (sin placeholders). Esta misma lógica se ejecuta automáticamente cuando un usuario pulsa "Notificada" en la interfaz de Gesbon.
{ "dry_run": false }
| Parámetro | Tipo | Descripción |
|---|---|---|
dry_run | boolean | Por defecto true: devuelve el plan sin tocar datos. Pasar false para ejecutar la asignación. |
Documentos base — siempre, en cualquier modalidad:
recibicertificado (variante certificado_mixta cuando modalidad = Mixta)evaluacionReglas adicionales según modalidad y checks del grupo:
| Modalidad | Aula virtual rellena | Bimodal | Documento extra |
|---|---|---|---|
| Teleformación | — | — | (ninguno) |
| Presencial / Mixta | NO | NO | control_asistencia |
| Presencial / Mixta | SÍ | NO | declaracion_responsable_fundae |
| Presencial / Mixta | — | SÍ | declaracion_responsable_fundae + control_asistencia |
diploma para Presencial/Teleformación y diploma_mixta para Mixta.
{
"data": {
"grupo_formativo_id": 123,
"grupo_formativo_codigo": "G001",
"modalidad": "Presencial",
"tipos_documento": ["recibi", "certificado", "evaluacion", "control_asistencia"],
"participantes_count": 8,
"plan": [
{ "id_grupos_formativos_participantes": 5001, "id_usuario_participante": 200, "tipo_documento": "recibi" },
"..."
],
"plan_size": 32,
"dry_run": false,
"inserted": 32,
"skipped_existing": 0
},
"message": "Asignación ejecutada: 32 nuevos registros, 0 saltados..."
}
certificado y certificado_mixta) y las salta. Llamarlo dos veces sobre el mismo grupo no duplica nada.
grupos_formativos_envio_documental. La copia física del archivo PDF se completa cuando el usuario abre la pestaña Documentación del grupo en la interfaz web — exactamente como antes.
/v1/{perfil}/participantes?ejercicio={año}&empresa_id={id}
Lista los participantes de una empresa. Opcionalmente filtra por grupo_formativo_id.
| Parámetro | Tipo | Descripción |
|---|---|---|
grupo_formativo_id | integer | Filtra participantes por grupo formativo |
{
"data": [
{
"id": 789,
"grupo_formativo_id": 456,
"grupo_formativo_codigo": "G01",
"trabajador_id": 12345,
"trabajador_documento": "12345678Z",
"trabajador_nombre": "Juan García López",
"evaluacion_positiva": 1,
"minimo_horas": 1,
"ejercicio": 2026
}
],
"total": 15,
"filters": { "ejercicio": 2026, "empresa_id": 5196, "grupo_formativo_id": null }
}
/v1/{perfil}/participantes/{id}?ejercicio={año}&empresa_id={id}
Obtiene un participante por su ID.
/v1/{perfil}/participantes?ejercicio={año}&empresa_id={id}
Asigna un trabajador a un grupo formativo como participante.
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
trabajador_id | integer | Sí | ID del trabajador en Gesbon |
grupo_formativo_id | integer | Sí | ID del grupo formativo |
evaluacion_positiva | integer | No | 0 o 1 (default: 0) |
minimo_horas | integer | No | 0 o 1 (default: 1) |
/v1/{perfil}/participantes/{id}?ejercicio={año}&empresa_id={id}
Actualiza los campos evaluación y horas de un participante.
/v1/{perfil}/participantes/{id}?ejercicio={año}&empresa_id={id}
Elimina un participante de un grupo formativo.
| Código | Significado | Ejemplo |
|---|---|---|
| 400 | Bad Request | Falta parámetro obligatorio (ejercicio, empresa_id) |
| 401 | Unauthorized | Credenciales incorrectas o no proporcionadas |
| 403 | Forbidden | No tienes acceso a esa empresa/ejercicio, o la cuenta master tiene la prueba caducada / pago pendiente |
| 404 | Not Found | Recurso no encontrado o sub-ruta no soportada |
| 405 | Method Not Allowed | Método HTTP no permitido en ese endpoint (ej: POST en empresas, que solo acepta GET) |
| 409 | Conflict | NIF ya registrado como formador (no se puede usar como trabajador) |
| 422 | Validation Error | NIF inválido, email mal formateado, edad insuficiente, etc. |
| 500 | Server Error | Error interno de base de datos |
{
"error": true,
"message": "Validation failed",
"details": [
"Invalid NIF/NIE: '1234'. Checksum does not match.",
"Field 'nombre' is required."
]
}
La API ofrece los siguientes recursos para integración completa:
| Recurso | Descripción | Métodos |
|---|---|---|
empresas | Consultar empresas y obtener IDs | GET |
trabajadores | Gestión de trabajadores | GET, POST, PUT, DELETE |
acciones_formativas | Gestión de acciones formativas | GET, POST, PUT, DELETE |
grupos_formativos | Gestión de grupos formativos | GET, POST, PUT, DELETE |
grupos_formativos/{id}/asignar_documentos | Asignación automática de documentos firmables a participantes según modalidad | POST |
participantes | Asignar trabajadores a grupos | GET, POST, PUT, DELETE |
https://api.gesbon.es/v1/{perfil}/{recurso}?ejercicio=2026application/jsonhttps://api.gesbon.es/v1/{perfil}/{recurso}?ejercicio=2026/empresas/participantes