Gesbon API v1

API REST para integración con sistemas externos (SAP, ERP, etc.)

Autenticación

Todas las peticiones requieren HTTP Basic Auth con las mismas credenciales que se usan para acceder al panel de Gesbon.

Sub-usuarios admitidos: Tanto los usuarios master como los sub-usuarios creados desde un master pueden autenticarse en la API. El sub-usuario hereda el estado de la cuenta del master (prueba / pago) y opera sobre los mismos datos: las consultas filtran por owner_id = master, así que un sub-usuario ve exactamente las mismas empresas y grupos que su master.

Si la cuenta master tiene la prueba caducada o el pago mensual pendiente (a partir del día 15), tanto el master como sus sub-usuarios reciben 403 Forbidden.

Ejemplo

# 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/...
SAP: En SAP PI/PO o SAP CPI, configura el endpoint con autenticación tipo "Basic" e introduce el email y contraseña del usuario Gesbon.
URL Base y Parámetros Obligatorios

https://api.gesbon.es/v1/{perfil}/{recurso}

Perfiles disponibles

PerfilDescripción
bonificadaFormación bonificada por FUNDAE
organizadoraEntidad organizadora
grupo_empresasGrupo de empresas

Parámetros obligatorios en TODAS las peticiones

ParámetroTipoDescripción
ejerciciointegerOBLIGATORIO. Año fiscal (ej: 2026). Se pasa como query param: ?ejercicio=2026
empresa_idintegerOBLIGATORIO. ID de la empresa en Gesbon. Se pasa como query param o en el body JSON.
¿Cómo obtener el empresa_id? Usa el endpoint GET /v1/{perfil}/empresas?ejercicio={año} para listar tus empresas y obtener sus IDs.
Trabajadores
GET /v1/{perfil}/trabajadores?ejercicio={año}&empresa_id={id}

Lista los trabajadores de una empresa. Soporta paginación y búsqueda.

Parámetros opcionales (query string)

ParámetroTipoDefaultDescripción
pageinteger1Página
limitinteger100Resultados por página (máx 500)
searchstring-Busca en NIF, nombre, apellidos, NISS, email

Ejemplo respuesta

{
  "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 }
}

GET /v1/{perfil}/trabajadores/{id}?ejercicio={año}

Obtiene un trabajador por su ID.


POST /v1/{perfil}/trabajadores?ejercicio={año}

Crea un nuevo trabajador o actualiza uno existente (upsert).

Comportamiento UPSERT: Si ya existe un trabajador con el mismo NIF/NIE para la misma empresa y ejercicio, la API actualiza sus datos en lugar de devolver un error. Esto permite que SAP envíe los datos repetidamente sin preocuparse por duplicados.

La respuesta indica qué acción se realizó:
"action": "created" → Se creó un nuevo trabajador (HTTP 201)
"action": "updated" → Se actualizó uno existente (HTTP 200)

Body (JSON) - Campos

CampoTipoRequeridoDescripción
empresa_idintegerID de la empresa en Gesbon
tipo_documentostringNIF, NIE, o Pasaporte
documentostringNIF/NIE/Pasaporte. Se valida checksum para NIF y NIE.
nombrestringNombre del trabajador
primer_apellidostringPrimer apellido
segundo_apellidostringSegundo apellido
generostringNoHombre o Mujer
fecha_nacimientostringNoFormato dd/mm/yyyy. Edad mínima: 16 años.
nissstringNoNúmero de Seguridad Social (12 dígitos, se valida checksum)
cuenta_cotizacionstringNoCódigo de cuenta de cotización
emailstringNoEmail del trabajador (se valida formato)
telefonostringNoTeléfono
salario_bruto_anualstringNoSalario bruto anual en euros
horas_conveniostringNoHoras anuales de convenio
nivel_estudiosintegerNoNivel de estudios (código numérico 0-10)
categoria_profesionalintegerNoCategoría profesional (código numérico)
grupo_cotizacionintegerNoGrupo de cotización TGSS
discapacidadintegerNo0 o 1
victima_terrorismointegerNo0 o 1
violencia_generointegerNo0 o 1
fijo_discontinuointegerNo0 o 1

Ejemplo: Crear trabajador

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"

Respuesta (201 Created)

{
  "data": { /* objeto trabajador completo */ },
  "action": "created",
  "message": "Trabajador created successfully."
}

Respuesta upsert (200 OK) - Si el NIF ya existía

{
  "data": { /* objeto trabajador actualizado */ },
  "action": "updated",
  "message": "Trabajador with NIF '12345678Z' already existed and was updated (upsert)."
}

PUT /v1/{perfil}/trabajadores/{id}?ejercicio={año}

Actualiza un trabajador existente por su ID. Solo se actualizan los campos enviados.

Ejemplo

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"

DELETE /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.

Cuidado: Esta operación es irreversible. Se eliminan también las participaciones del trabajador en grupos formativos y sus asignaciones como formador interno.
Empresas
GET /v1/{perfil}/empresas?ejercicio={año}

Lista todas las empresas del usuario. No requiere empresa_id.

Parámetros opcionales (query string)

ParámetroTipoDescripción
searchstringBusca en NIF, nombre fiscal, nombre comercial

Ejemplo respuesta

{
  "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 }
}
Campos adicionales para perfiles organizadora y grupo_empresas: agrupacion, cabecera, credito_dispuesto, credito_disponible, cnae, pyme.

GET /v1/{perfil}/empresas/{id}?ejercicio={año}

Obtiene una empresa por su ID.

Acciones Formativas
GET /v1/{perfil}/acciones_formativas?ejercicio={año}&empresa_id={id}

Lista las acciones formativas de una empresa.


GET /v1/{perfil}/acciones_formativas/{id}?ejercicio={año}

Obtiene una acción formativa por su ID.


POST /v1/{perfil}/acciones_formativas?ejercicio={año}

Crea una nueva acción formativa o actualiza una existente (upsert por codigo + empresa_id + ejercicio).

Comportamiento UPSERT: Si ya existe una acción formativa con el mismo codigo para la misma empresa y ejercicio, la API actualiza sus datos en lugar de crear una nueva.

Body (JSON) - Campos

CampoTipoRequeridoDescripción
empresa_idintegerID de la empresa en Gesbon
codigostringCódigo de la acción formativa (máx 4 caracteres)
denominacionstringNombre de la acción formativa
tipostringNoPropia o Parcial (default: Propia)
grupostringNoGrupo de la acción
modalidadstringNoPresencial, Teleformación o Mixta
horas_presencialnumberNoHoras presenciales (obligatorio si modalidad es Presencial o Mixta)
horas_teleformacionnumberNoHoras teleformación (obligatorio si modalidad es Teleformación o Mixta)
cifstringNoCIF del centro de formación
razon_socialstringNoRazón social del centro de formación
urlstringNoURL de teleformación
nivel_formacionstringNoNivel de formación
objetivosstringNoObjetivos de la acción
contenidos_fundaestringNoContenidos para FUNDAE
contenidos_documentacionstringNoContenidos para documentación
Campos adicionales para perfiles organizadora y grupo_empresas: id_agrupacion, area_profesional.
Validación de modalidad: Si la modalidad es Presencial, se requiere horas_presencial. Si es Teleformación, se requiere horas_teleformacion. Si es Mixta, se requieren ambos campos.

PUT /v1/{perfil}/acciones_formativas/{id}?ejercicio={año}

Actualiza una acción formativa existente por su ID. Solo se actualizan los campos enviados.


DELETE /v1/{perfil}/acciones_formativas/{id}?ejercicio={año}&empresa_id={id}

Elimina una acción formativa.

Restricción: No se puede eliminar una acción formativa que tenga grupos formativos asociados. Primero hay que eliminar los grupos.
Grupos Formativos
GET /v1/{perfil}/grupos_formativos?ejercicio={año}&empresa_id={id}

Lista los grupos formativos de una empresa. Opcionalmente filtra por accion_formativa_id.

Parámetros opcionales (query string)

ParámetroTipoDescripción
accion_formativa_idintegerFiltra grupos por acción formativa

GET /v1/{perfil}/grupos_formativos/{id}?ejercicio={año}

Obtiene un grupo formativo por su ID.


POST /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).

Body (JSON) - Campos

CampoTipoRequeridoDescripción
empresa_idintegerID de la empresa en Gesbon
accion_formativa_idintegerID de la acción formativa a la que pertenece
codigostringCódigo del grupo
denominacionstringNombre del grupo
numero_participantesintegerNoNúmero de participantes (máx 30 presencial / 80 teleformación)
fecha_iniciostringNoFecha de inicio (dd/mm/yyyy). Debe ser anterior o igual a fecha_fin.
fecha_finstringNoFecha de fin (dd/mm/yyyy)
persona_contactostringNoPersona de contacto
telefonostringNoTeléfono de contacto
costes_directosnumberNoCostes directos
costes_indirectosnumberNoCostes indirectos
costes_salarialesnumberNoCostes salariales
finalizadointegerNo0 o 1
Campos específicos por perfil:
bonificada: horas_jornada_laboral (integer)
organizadora / grupo_empresas: id_agrupacion, costes_organizacion

PUT /v1/{perfil}/grupos_formativos/{id}?ejercicio={año}

Actualiza un grupo formativo existente por su ID. Solo se actualizan los campos enviados.


DELETE /v1/{perfil}/grupos_formativos/{id}?ejercicio={año}&empresa_id={id}

Elimina un grupo formativo.

Eliminación en cascada: Al eliminar un grupo formativo, se eliminan también todos sus participantes y formadores asignados.

POST /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.

Body (JSON, opcional)

{ "dry_run": false }
ParámetroTipoDescripción
dry_runbooleanPor defecto true: devuelve el plan sin tocar datos. Pasar false para ejecutar la asignación.

Lógica de asignación

Documentos base — siempre, en cualquier modalidad:

  • recibi
  • certificado (variante certificado_mixta cuando modalidad = Mixta)
  • evaluacion

Reglas adicionales según modalidad y checks del grupo:

ModalidadAula virtual rellenaBimodalDocumento extra
Teleformación(ninguno)
Presencial / MixtaNONOcontrol_asistencia
Presencial / MixtaNOdeclaracion_responsable_fundae
Presencial / Mixtadeclaracion_responsable_fundae + control_asistencia
Diploma: NO entra en este endpoint. Se asigna individualmente a cada participante cuando se marca su flag de Evaluación Positiva (EP) en la interfaz de Gesbon (trigger automático en `api_participantesEP.php`). La plantilla es diploma para Presencial/Teleformación y diploma_mixta para Mixta.

Respuesta (modo ejecución)

{
    "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..."
}
Idempotente: el endpoint detecta asignaciones existentes por nombre base del documento (sin distinguir entre certificado y certificado_mixta) y las salta. Llamarlo dos veces sobre el mismo grupo no duplica nada.
Generación física del PDF: el endpoint solo registra la asignación en la tabla 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.
Participantes
GET /v1/{perfil}/participantes?ejercicio={año}&empresa_id={id}

Lista los participantes de una empresa. Opcionalmente filtra por grupo_formativo_id.

Parámetros opcionales (query string)

ParámetroTipoDescripción
grupo_formativo_idintegerFiltra participantes por grupo formativo

Ejemplo respuesta

{
  "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 }
}

GET /v1/{perfil}/participantes/{id}?ejercicio={año}&empresa_id={id}

Obtiene un participante por su ID.


POST /v1/{perfil}/participantes?ejercicio={año}&empresa_id={id}

Asigna un trabajador a un grupo formativo como participante.

Body (JSON) - Campos

CampoTipoRequeridoDescripción
trabajador_idintegerID del trabajador en Gesbon
grupo_formativo_idintegerID del grupo formativo
evaluacion_positivaintegerNo0 o 1 (default: 0)
minimo_horasintegerNo0 o 1 (default: 1)
Validaciones:
• El trabajador debe existir y pertenecer a la empresa indicada.
• El grupo formativo debe existir y pertenecer a la empresa indicada.
• Un trabajador no puede ser asignado dos veces al mismo grupo.
• Límite de participantes por grupo: 30 (presencial) / 80 (teleformación).

PUT /v1/{perfil}/participantes/{id}?ejercicio={año}&empresa_id={id}

Actualiza los campos evaluación y horas de un participante.


DELETE /v1/{perfil}/participantes/{id}?ejercicio={año}&empresa_id={id}

Elimina un participante de un grupo formativo.

Códigos de Error
CódigoSignificadoEjemplo
400Bad RequestFalta parámetro obligatorio (ejercicio, empresa_id)
401UnauthorizedCredenciales incorrectas o no proporcionadas
403ForbiddenNo tienes acceso a esa empresa/ejercicio, o la cuenta master tiene la prueba caducada / pago pendiente
404Not FoundRecurso no encontrado o sub-ruta no soportada
405Method Not AllowedMétodo HTTP no permitido en ese endpoint (ej: POST en empresas, que solo acepta GET)
409ConflictNIF ya registrado como formador (no se puede usar como trabajador)
422Validation ErrorNIF inválido, email mal formateado, edad insuficiente, etc.
500Server ErrorError interno de base de datos

Formato de error

{
  "error": true,
  "message": "Validation failed",
  "details": [
    "Invalid NIF/NIE: '1234'. Checksum does not match.",
    "Field 'nombre' is required."
  ]
}
Guía de Integración SAP

Endpoints disponibles

La API ofrece los siguientes recursos para integración completa:

RecursoDescripciónMétodos
empresasConsultar empresas y obtener IDsGET
trabajadoresGestión de trabajadoresGET, POST, PUT, DELETE
acciones_formativasGestión de acciones formativasGET, POST, PUT, DELETE
grupos_formativosGestión de grupos formativosGET, POST, PUT, DELETE
grupos_formativos/{id}/asignar_documentosAsignación automática de documentos firmables a participantes según modalidadPOST
participantesAsignar trabajadores a gruposGET, POST, PUT, DELETE

Configuración en SAP PI/PO

  1. Crear un Communication Channel tipo HTTP con:
    • URL: https://api.gesbon.es/v1/{perfil}/{recurso}?ejercicio=2026
    • Auth: Basic Authentication
    • User: email de acceso a Gesbon
    • Password: contraseña de acceso a Gesbon
  2. Content-Type: application/json
  3. Método: POST para crear/actualizar, PUT para modificar, DELETE para eliminar
  4. Mapear los campos de SAP HR al JSON de la API

Configuración en SAP CPI (Cloud Platform Integration)

  1. Crear un HTTP Receiver Adapter
  2. URL: https://api.gesbon.es/v1/{perfil}/{recurso}?ejercicio=2026
  3. Authentication: Basic
  4. Credential Name: crear credential con email/password de Gesbon

Flujo recomendado

  1. Consultar empresas disponibles con GET /empresas
  2. SAP extrae datos de empleados (PA30, Infotipo 0001/0002)
  3. Envía POST por cada trabajador (upsert por NIF)
  4. Crea acciones formativas y grupos formativos vía POST (upsert por código)
  5. Asigna participantes a los grupos con POST /participantes
  6. Registra respuestas para auditoría
Sobre duplicados: Gracias al comportamiento upsert en trabajadores, acciones formativas y grupos formativos, SAP puede enviar los mismos datos periódicamente (ej: cada noche) sin preocuparse por crear duplicados. La API detecta registros existentes por sus claves únicas y actualiza sus datos.
Gesbon API v1 · www.gesbon.es