Attendance¶
Note
Write operations (check-in / check-out) require the “Check-in/Check-out”
or “Regularize Attendance” permission enabled in
Zoho People → Settings → Attendance → Permissions for the user’s role.
Read operations (get_user_report) work for all roles.
Check-in and check-out¶
client.attendance.checkin(
email_id="mario.rossi@company.com",
checkin="25/04/2026 09:00:00",
checkout="25/04/2026 18:00:00",
)
# Check-in only (check-out registered later)
client.attendance.checkin(
email_id="mario.rossi@company.com",
checkin="25/04/2026 09:00:00",
)
# Check-out only
client.attendance.checkout(
email_id="mario.rossi@company.com",
checkout="25/04/2026 18:00:00",
)
Employee identifiers¶
Exactly one of the following must be provided:
emp_id— Employee ID (e.g."IMP085")email_id— Employee e-mailmap_id— Biometric device mapper ID
Bulk import¶
Pass check-in and check-out as separate dicts in the list:
records = [
{"checkIn": "2026-04-01 09:00:00"},
{"checkOut": "2026-04-01 18:00:00"},
{"checkIn": "2026-04-02 09:00:00"},
{"checkOut": "2026-04-02 17:00:00"},
]
result = client.attendance.bulk_import(records)
# Check for partial errors
if "errorDates" in str(result):
print("Some dates failed:", result)
Warning
The internal ftime / ttime fields used by the Zoho People web UI
are expressed in milliseconds from midnight (e.g. 09:00 → 32 400 000 ms).
Attendance report¶
report = client.attendance.get_user_report(
start_date="01/04/2026",
end_date="30/04/2026",
date_format="dd/MM/yyyy",
)
# report is a list of dicts with attendanceDetails per day
for day, info in report[0].get("attendanceDetails", {}).items():
print(day, info.get("Status"), info.get("TotalHours"))