Saltar al contenido principal

Reporte de Productividad

Métricas de productividad de tareas por vehículo/conductor — cantidades de tareas, horas, kilómetros y ocupación.

GET/apidev/v1/reports/gt/productivity
PermisoAPICLI_RPTGT_PRODUCTIVIDAD
Límite de solicitudes10 req/min
Caché300s
Rango máximo31 días

Resumen​

Devuelve métricas de productividad agregadas por vehículo o conductor dentro de un rango de fechas — cantidades de tareas (programadas, no programadas, total), horas de tareas y de turno, kilómetros (trabajados, ideales, de turno), tiempo promedio de llegada y tasa de ocupación. Usá group_by_person=true para agregar por conductor en lugar de por dispositivo, y acotá los resultados con filtros de dispositivo, conductor, tipo de dispositivo o tipo de servicio.

Hay tres métricas que hoy no son confiables

task_hours, shift_hours y avg_arrival_time vuelven en null justo cuando traen un valor real, y en 0 cuando la métrica es genuinamente cero. Leé Campos de la respuesta antes de construir sobre ellas.


Solicitud​

Encabezados de la solicitud​

Every request to a protected endpoint requires these headers:

HeaderRequiredDescription
AuthorizationYesBearer token obtained from the Login endpoint. Format: Bearer <token>
X-API-KeyYesCompany integration key provided during onboarding. Format: gtk_xxx...
tenantYesYour assigned tenant domain (default: geotareas.com) — always send your assigned tenant
Content-TypeConditionalapplication/json — required for POST and PUT requests

Parámetros de consulta​

ParámetroTipoRequeridoPor defectoDescripción
startdatestringSí—Fecha-hora de inicio en ISO 8601 (ej. 2026-03-01T00:00:00).
enddatestringSí—Fecha-hora de fin en ISO 8601. Rango máximo 31 días desde startdate.
devicesstringNo—IDs de dispositivos separados por comas. Máximo 500.
driversstringNo—IDs de conductores separados por comas. Máximo 500.
device_groupsstringNo—Ids de tipo de dispositivo separados por comas (el catálogo device_group que expone Flota / Dispositivos). Máximo 100.
service_typesstringNo—IDs de tipos de servicio separados por comas. Máximo 100.
group_by_personbooleanNofalseAgrupar resultados por conductor en lugar de por dispositivo.
limitintegerNo25Cantidad de registros por página (1–100).
offsetintegerNo0Cantidad de registros a omitir para la paginación.

Ejemplos de código​

curl -s -H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT" \
"https://$TENANT/apidev/v1/reports/gt/productivity?startdate=2026-03-01T00:00:00&enddate=2026-03-15T23:59:59&limit=25"

Respuesta​

Campos de la respuesta​

Todos los campos de abajo vienen siempre como clave. Lo que cambia entre filas es si traen valor o no — ver las dos notas que siguen a la tabla.

CampoTipoDescripción
service_typestringNombre del tipo de servicio. Hoy siempre llega vacío — ver la nota más abajo.
driver_namestringNombre del conductor. Se completa solo con group_by_person=true; en el resto de los casos llega vacío.
device_namestringNombre del vehículo. Se completa solo con group_by_person=false (el valor predeterminado); en el resto de los casos llega vacío.
unscheduled_tasksnumberCantidad de tareas no programadas.
scheduled_tasksnumberCantidad de tareas programadas.
total_tasksnumberCantidad total de tareas.
task_hoursnumber | nullTiempo dedicado a tareas. Llega null toda vez que el valor no es cero — ver la nota más abajo.
shift_hoursnumber | nullTiempo total de jornada. Llega null toda vez que el valor no es cero — ver la nota más abajo.
kms_workednumberKilómetros durante las tareas.
kms_idealnumberKilómetros ideales/planificados (la distancia ruteada).
kms_shiftnumberTotal de kilómetros de la jornada.
avg_arrival_timenumber | nullTiempo promedio de llegada a las tareas no programadas. Llega null toda vez que el valor no es cero — ver la nota más abajo.
occupancynumberPorcentaje de ocupación (tiempo de tareas sobre tiempo de jornada).
task_hours, shift_hours y avg_arrival_time todavía no son utilizables

Son los tres únicos campos nulables del reporte, y su null no significa "sin datos". El patrón está invertido:

  • la métrica vale cero → llega 0
  • la métrica tiene cualquier valor real → llega null

Es decir: una fila que sí tuvo horas trabajadas informa null, y una fila sin actividad informa 0. No interpretes el null como jornada vacía ni sumes estos tres campos: los totales quedarían mal en las dos direcciones.

Hasta que esto se corrija, calculá lo que necesites con los campos confiables: occupancy ya expresa el tiempo de tareas sobre el de jornada en porcentaje, y total_tasks / kms_worked / kms_shift traen números reales.

service_type siempre llega vacío

El reporte de base agrupa únicamente por vehículo o por conductor, así que nunca arrastra el nombre del tipo de servicio: el campo está por compatibilidad de forma, pero lee "" en todas las filas. El filtro service_types sí funciona (acota qué tareas se cuentan); lo único que no vuelve es la etiqueta.

Ejemplo de respuesta​

Modo predeterminado (sin group_by_person), con lo que producción devuelve hoy:

{
"success": true,
"data": [
{
"service_type": "",
"driver_name": "",
"device_name": "Truck A-101",
"unscheduled_tasks": 3,
"scheduled_tasks": 12,
"total_tasks": 15,
"task_hours": null,
"shift_hours": null,
"kms_worked": 142.3,
"kms_ideal": 135.0,
"kms_shift": 180.0,
"avg_arrival_time": null,
"occupancy": 81
},
{
"service_type": "",
"driver_name": "",
"device_name": "Van B-205",
"unscheduled_tasks": 0,
"scheduled_tasks": 0,
"total_tasks": 0,
"task_hours": 0,
"shift_hours": 0,
"kms_worked": 0,
"kms_ideal": 0,
"kms_shift": 0,
"avg_arrival_time": 0,
"occupancy": 0
}
],
"meta": {
"total": 2,
"limit": 25,
"offset": 0
}
}

Con group_by_person=true​

Las filas se agregan por conductor: driver_name trae el nombre y device_name pasa a llegar vacío.

{
"service_type": "",
"driver_name": "Carlos Martinez",
"device_name": "",
"unscheduled_tasks": 5,
"scheduled_tasks": 18,
"total_tasks": 23,
"task_hours": null,
"shift_hours": null,
"kms_worked": 210.6,
"kms_ideal": 198.0,
"kms_shift": 265.0,
"avg_arrival_time": null,
"occupancy": 74
}

Errores​

CódigoHTTPDescripción
VALIDATION_ERROR400Parámetros inválidos: faltan fechas, rango > 31 días, valores de enum inválidos.
UNAUTHORIZED401tenant / Authorization / X-API-Key faltante, inválido o expirado
FORBIDDEN403El usuario no tiene el permiso requerido.
RATE_LIMITED429Se superaron las 10 req/min.
INTERNAL_ERROR500Error inesperado del servidor.