Activity Summary Report
Monthly per-person activity calendar: one row per person, one cell per day, with shift, rest, and absence status.
/apidev/v1/reports/cpm/activity-summaryOverview
Returns a calendar-style summary for the selected month. Each person appears once, with a list of daily activity entries that show the worked shift, rest periods, hours worked and rested, kilometers driven, and the day-level status (worked, rest day, or absence). Use it to review attendance and workload across an entire month at a glance.
- Month view — the period is a single calendar month; days up to the current company date are evaluated, future days are left empty
- Day status — each day carries a status so you can spot absences, rest days, and breaches without parsing raw timestamps
- Scope filters — narrow results by person, device, device type, or shift category
Request
Request Headers
Every request to a protected endpoint requires these headers:
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer token obtained from the Login endpoint. Format: Bearer <token> |
X-API-Key | Yes | Company integration key provided during onboarding. Format: gtk_xxx... |
tenant | Yes | Your assigned tenant domain (default: geotareas.com) — always send your assigned tenant |
Content-Type | Conditional | application/json — required for POST and PUT requests |
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
month | string | Yes | — | Target month in ISO 8601 (e.g. 2026-03 or 2026-03-01). Covers the full calendar month. |
drivers | string | No | All visible | Comma-separated person IDs. Max 500. |
devices | string | No | All visible | Comma-separated device IDs. Max 500. |
device_types | string | No | — | Comma-separated device type IDs. Max 100. |
shift_categories | string | No | — | Comma-separated shift category IDs. Max 50. |
limit | integer | No | 25 | Number of people per page (1–100). |
offset | integer | No | 0 | Number of people to skip for pagination. |
Code Examples
- cURL
- JavaScript
- Python
curl -s -H "Authorization: Bearer $TOKEN" \
-H "X-API-Key: $APIKEY" \
-H "tenant: $TENANT" \
"https://$TENANT/apidev/v1/reports/cpm/activity-summary?month=2026-03&limit=25"
const res = await fetch(
`https://${TENANT}/apidev/v1/reports/cpm/activity-summary?month=2026-03&limit=25`,
{
headers: {
'Authorization': `Bearer ${token}`,
'X-API-Key': apiKey,
'tenant': TENANT,
},
}
);
const data = await res.json();
import requests
response = requests.get(
f"https://{TENANT}/apidev/v1/reports/cpm/activity-summary",
headers={"Authorization": f"Bearer {token}", "X-API-Key": api_key, "tenant": TENANT},
params={"month": "2026-03", "limit": 25},
)
data = response.json()
Response
Response Fields
Each item in data is a person with an activities array of daily entries.
| Field | Type | Description |
|---|---|---|
person_id | string | null | Person identifier. |
person_name | string | null | Person name. |
person_image | string | null | Person image URL. |
total_worked_minutes | number | Minutes worked across the month (sum of activities[].worked_minutes). |
total_discount_minutes | number | Deducted minutes across the month (late arrivals + early departures). |
activities | array | One entry per day of the month (see below). |
Activity entry (activities[])
One entry per day of the month, including days with no shift (they carry day, date and status only) — the same cells the web matrix paints.
| Field | Type | Description |
|---|---|---|
day | number | null | Day of the month (1–31). |
date | string | null | Date of the entry (YYYY-MM-DD). |
shift_id | string | null | Work-shift identifier. |
shift_line | number | null | Rest line number inside the shift. |
shift_name | string | null | Shift/schedule name. |
device_name | string | null | Device (vehicle) name. |
shift_start | string | null | Shift start timestamp. |
shift_end | string | null | Shift end timestamp. |
rest_start | string | null | Rest start timestamp. |
rest_end | string | null | Rest end timestamp. |
qra_time | string | null | Effective shift-start mark (QRA). |
qtp_time | string | null | Effective shift-end mark (QTP). |
start_address | string | null | Address where the shift started. |
end_address | string | null | Address where the shift ended. |
worked_minutes | number | null | Minutes worked that day (shift span minus rest). |
discount_minutes | number | null | Deducted minutes that day (late arrival + early departure). |
status | string | null | Day status: OK (complied), WARN (needs review), ERROR (breach). null = no shift that day. |
status_reason | string | null | Reason code behind the status (e.g. absent). null when there is none. |
edited | boolean | true when a supervisor corrected one of the day's marks. |
edited_by | string | null | Who corrected the mark. |
shifts_count | number | Shifts of that day (> 1 = several shifts in one day). 0 = no shift. |
Kilometers (kms_shift / kms_rest) and rested hours are not returned by this report: the monthly matrix engine does not compute them. Earlier drafts of this page listed worked_hours, rested_hours, kms_shift and kms_rest — only the worked time exists, and it is published as worked_minutes. Per-shift kilometers are available in Activity Detail.
Example Response
{
"success": true,
"data": [
{
"person_id": "982710394857201700",
"person_name": "Carlos Martinez",
"person_image": "https://cdn.example.com/people/982710394857201700.jpg",
"total_worked_minutes": 9450,
"total_discount_minutes": 65,
"activities": [
{
"day": 5,
"date": "2026-03-05",
"shift_id": "982710394857201664",
"shift_line": 1,
"shift_name": "Morning Shift",
"device_name": "Unit-105",
"shift_start": "2026-03-05T07:00:00",
"shift_end": "2026-03-05T15:00:00",
"rest_start": "2026-03-05T11:00:00",
"rest_end": "2026-03-05T11:30:00",
"qra_time": "2026-03-05T07:02:00",
"qtp_time": "2026-03-05T15:04:00",
"start_address": "Av. Reforma 1234, Col. Centro",
"end_address": "Calle Madero 456, Col. Centro",
"worked_minutes": 450,
"discount_minutes": 0,
"status": "OK",
"status_reason": null,
"edited": false,
"edited_by": null,
"shifts_count": 1
},
{
"day": 6,
"date": "2026-03-06",
"shift_id": null,
"shift_line": null,
"shift_name": null,
"device_name": null,
"shift_start": null,
"shift_end": null,
"rest_start": null,
"rest_end": null,
"qra_time": null,
"qtp_time": null,
"start_address": null,
"end_address": null,
"worked_minutes": null,
"discount_minutes": null,
"status": "ERROR",
"status_reason": "absent",
"edited": false,
"edited_by": null,
"shifts_count": 0
}
]
},
{
"person_id": "982710394857201701",
"person_name": "Laura Hernandez",
"person_image": null,
"total_worked_minutes": 7680,
"total_discount_minutes": 0,
"activities": [
{
"day": 5,
"date": "2026-03-05",
"shift_id": "982710394857201999",
"shift_line": null,
"shift_name": "Night Shift",
"device_name": "Unit-203",
"shift_start": "2026-03-05T22:00:00",
"shift_end": "2026-03-06T06:00:00",
"rest_start": null,
"rest_end": null,
"qra_time": "2026-03-05T22:00:00",
"qtp_time": "2026-03-06T06:00:00",
"start_address": "Ruta 8 Km 24",
"end_address": "Ruta 8 Km 24",
"worked_minutes": 480,
"discount_minutes": 0,
"status": "OK",
"status_reason": null,
"edited": true,
"edited_by": "supervisor.mendez",
"shifts_count": 1
}
]
}
],
"meta": {
"total": 2,
"limit": 25,
"offset": 0
}
}
Errors
| Code | HTTP | Description |
|---|---|---|
VALIDATION_ERROR | 400 | Invalid parameters (e.g. malformed month). |
UNAUTHORIZED | 401 | Missing, invalid, or expired tenant / Authorization / X-API-Key |
FORBIDDEN | 403 | User lacks required permission. |
RATE_LIMITED | 429 | Exceeded 10 req/min. |
INTERNAL_ERROR | 500 | Unexpected server error. |