BioTime API Wrapper
Last updated: 8/28/2026
BioTime API Wrapper
Many customers already have a working integration (JISR, Odoo, a custom payroll script) built against ZKTeco BioTime's own REST API. Rather than rewriting that integration, EasyTime can expose a real, compatible subset of BioTime's own API — same paths, same auth scheme, same response shapes — so the existing integration works against EasyTime unmodified.
Enabling it
- Go to Settings → Integrations → BioTime API.
- Tick Enable BioTime API wrapper.
- Set a BioTime Username — this must be unique across every company on this EasyTime instance, since an incoming request carries only a username/password, no company context.
- Set a BioTime Password.
- Save. The endpoint reference panel shows the exact base URLs to hand to your integrator.
Authentication
Exactly like a real BioTime deployment — DRF's stock token auth, not the Bearer/JWT scheme EasyTime's own API uses.
POST /api-token-auth/
Content-Type: application/json
{"username": "acme_biotime", "password": "your-password"}
Response: {"token": "<40-character hex string>"} — a fixed token, not reissued each login. Use
it on every other call:
Authorization: Token <token>
Supported endpoints
All list endpoints are paginated: {"count", "next", "previous", "msg", "code", "data": [...]}
(page/page_size query params, default 10, max 100 per page) — matching BioTime's own real
pagination envelope exactly, not the plain results array EasyTime's own API uses elsewhere.
Employees — /personnel/api/employees/
| Method | Path | Notes |
|---|---|---|
| GET | /personnel/api/employees/ | List, paginated |
| GET | /personnel/api/employees/{id}/ | Detail |
| POST | /personnel/api/employees/ | Create |
| PUT | /personnel/api/employees/{id}/ | Update |
| DELETE | /personnel/api/employees/{id}/ | Deactivate |
| POST | /personnel/api/employees/adjust_area/ | Bulk reassign area(s) — {"employees":[ids],"areas":[ids]} |
| POST | /personnel/api/employees/adjust_department/ | Bulk reassign department — {"employees":[ids],"department":id} |
| POST | /personnel/api/employees/adjust_position/ | Bulk reassign position — {"employees":[ids],"position":id} |
| POST | /personnel/api/employees/adjust_resign/ | Bulk resign — {"employees":[ids],"resign_date","resign_type","reason","disableatt"} |
| POST | /personnel/api/employees/del_bio_template/ | Delete fingerprint/face templates (local + pushes a real device delete) |
| POST | /personnel/api/employees/resync_to_device/ | Force a fresh re-push to this employee's devices |
Departments / Areas / Positions — full CRUD, identical shape for each:
/personnel/api/departments/, /personnel/api/areas/, /personnel/api/positions/
(GET list, GET detail, POST create, PUT update, DELETE).
Resignations — /personnel/api/resigns/
| Method | Path | Notes |
|---|---|---|
| GET / POST | /personnel/api/resigns/ | List / create — {"employee":id,"resign_date",...} |
| GET / PUT / DELETE | /personnel/api/resigns/{id}/ | Detail / update / delete |
| POST | /personnel/api/resigns/reinstatement/ | Reactivate — {"resigns":[resign-row-ids]} |
Terminals (devices) — /iclock/api/terminals/
| Method | Path | Notes |
|---|---|---|
| GET / POST | /iclock/api/terminals/ | List / create |
| GET / PUT / DELETE | /iclock/api/terminals/{id}/ | Detail / update / delete |
| POST | /iclock/api/terminals/clear_command/ | Clear pending commands — {"terminals":[ids]} |
| POST | /iclock/api/terminals/clear_capture/ | Clear captured biometric data from these devices |
| POST | /iclock/api/terminals/clear_all/ | Wipe all device-side data (real CLEAR DATA command) |
| POST | /iclock/api/terminals/upload_all/ | Force a full re-pull of users/templates/photos |
| POST | /iclock/api/terminals/upload_transaction/ | Force a re-pull of attendance data |
| POST | /iclock/api/terminals/reboot/ | Remote reboot |
Transactions (attendance) — /iclock/api/transactions/
| Method | Path | Notes |
|---|---|---|
| GET | /iclock/api/transactions/ | List — filter with ?start_time=, ?end_time=, ?emp_code= |
| GET | /iclock/api/transactions/{id}/ | Detail |
| DELETE | /iclock/api/transactions/{id}/ | Delete a punch |
| GET | /iclock/api/transactions/export/ | CSV export, same filters as list |
What's not covered
BioTime's real API also has ~100 report/payroll/workflow endpoints under /att/api/,
/staff/api/, /payroll/api/, /workflow/api/ — these are BioTime's own UI-facing report
generators, not what a third-party HR/payroll integration typically pulls. This wrapper covers the
core identity and attendance data (personnel + iclock modules) real integrations actually use.
Security
Every endpoint is strictly scoped to the company that owns the wrapper credential used to authenticate — a company's BioTime API token can never read or affect another company's data, regardless of the IDs passed in.