Reference
Tables, states, codes and endpoints — the lookup page.
Binding states
Every mirrored BioTime employee is in exactly one of these nine states.
| State | Meaning | Has an ERPat employee? |
|---|---|---|
| bound | Confirmed link — set or accepted by a person. Authoritative; no automatic pass overwrites it. | Yes |
| auto_matched | A single unambiguous match on ID number, applied automatically. Reversible and visibly unconfirmed. | Yes |
| suggested | A similar name was found. Recorded as a candidate; nothing applied. | No |
| unbound | Not attempted, or deliberately cleared. | No |
| not_found | No ERPat employee carries this ID number. | No |
| conflict | Two or more ERPat employees share this ID number, so no automatic match is safe. | No — never guessed |
| missing_remote | Present in an earlier sync, now absent from BioTime. The binding is kept so old punches stay attributable. | Yes, retained |
| ignored | Deliberately excluded — test cards, shared badges. | No |
| disabled | Disabled or attendance-off on the BioTime side. | No |
How a match is decided
- Manual — an operator's binding wins and is never overwritten.
- Existing Kiosk enrollment — where ERPat's Kiosk module already knows this code.
- Exact ID number — one candidate becomes
auto_matched; two or more becomeconflict; none continues. - Name similarity — recorded as a suggestion, never applied.
- Otherwise
not_found.
Punch codes
| Code | Meaning |
|---|---|
0 | Check In |
1 | Check Out |
2 | Break Out |
3 | Break In |
4 | Overtime In |
5 | Overtime Out |
An unrecognised code is shown as Unknown (n) rather than being mapped to something plausible — a mislabelled punch is worse than an obviously unrecognised one.
Verification methods
Confirmed values: 0 Password · 1 Fingerprint · 2 Card ·
3 Fingerprint + Password · 4 Card · 15 Face ·
20 Palm. Codes outside this set display with their raw number; the list grows
only as values are actually observed.
Import outcomes
What the Imported column on Attendance Transactions can say about a punch.
| Shows | Means |
|---|---|
| Imported | It became part of an attendance record; hover for the record number. |
| Awaiting | Bound and eligible; usually a shift that is not closed yet. |
| Only one punch | The shift has no clock-out. Skipped unless the opt-in is on. |
| Date locked | The day is closed for attendance edits. |
| Overlaps an existing record | Another record already covers those hours. |
| Record already decided | Its record is approved, rejected or auto-closed; never rewritten. |
| Record edited by hand | Its record's times were changed by a person; the correction stands. |
| Arrived after import | Needs a human: spans two records, wrong owner after a re-binding, or the record reaches beyond this shift. |
| Employee inactive | The bound ERPat employee is deleted or deactivated. |
| Future timestamp | More than a day ahead — a device with a wrong clock. |
| Shift over 24 hours | A broken clock or a missed clock-out. |
| Access terminal | A door reader, not an attendance clock. |
| Attendance deleted | Its record was deleted; not recreated unless you retry. |
| Repeat tap | A duplicate of the tap beside it, folded into the same record. |
Error codes
Every failure is classified before it is recorded, so a sync run's error code is precise rather than a scraped message.
| Code | Meaning | Typically |
|---|---|---|
BT-NET | Could not reach the server. | DNS, firewall, timeout, TLS transport failure. |
BT-POLICY | Refused by the host policy. | Address resolves somewhere ERPat may not reach. |
BT-AUTH | Credentials rejected. | Wrong password, or the account was disabled. |
BT-TOKEN | The session expired and could not be renewed. | Server restarted or revoked the session. |
BT-SHAPE | Response was not in the expected shape. | A server generation change, or an intercepting proxy. |
BT-REMOTE | The server reported an error. | A server-side fault or a vendor error code. |
BT-RATE | The server is rate-limiting us. | Common on large backfills; the next run resumes. |
BT-CONFLICT | A conflict inside ERPat. | Duplicate ID number, competing binding. |
BT-LOCKED | Connection locked after repeated credential failures. | Wait, then retry with the correct password. |
BT-TRUNCATED | Ran out of work budget with more to do. | Not a failure — the next run resumes from the same place. |
BT-IMPORT | The attendance import failed repeatedly. | An ERPat-side fault, not the remote server. Nothing further was written. |
Menu and pages
| Menu item | URL | Permission |
|---|---|---|
| Dashboard | biotime | Biotime |
| Employees & Bindings | biotime_employees | Employees & Bindings |
| Attendance Transactions | biotime_transactions | Attendance transactions |
| Devices | biotime_devices | Devices |
| Organization | biotime_organization | Organization |
| Sync Center | biotime_sync | View sync history (+ Run a sync to start one) |
| Analytics | biotime_analytics | Analytics |
| API Logs | biotime_logs | View API logs |
| Settings | biotime_settings | Biotime settings |
Stored data
| Table | Holds |
|---|---|
biotime_connections | One configured server: address, username, encrypted credential and tokens, profile, timezone, status. |
biotime_employees | Mirrored personnel, including which biometrics are enrolled — as flags, never the biometric data. |
biotime_employee_bindings | The link to an ERPat employee: state, how it was decided, by whom, and the alternatives. |
biotime_transactions | Mirrored punches, with raw, local and UTC times, plus the link to the ERPat attendance record each was imported into (or the reason it was not). |
biotime_devices | Terminals: serial, alias, address, firmware, state, activity and enrollment counts. |
biotime_departments | Mirrored departments. |
biotime_positions | Mirrored positions. |
biotime_areas | Mirrored areas. |
biotime_locations | Mirrored locations — a cloud-only resource. |
biotime_sync_cursors | Where each resource got to, so a sync can resume. |
biotime_sync_runs | Run history with counts and error codes. |
biotime_api_logs | Every outbound call: path, statuses, duration and a redacted excerpt. |
biotime_analytics_daily | Daily punch totals, kept deliberately so history survives a transaction purge. |
Integration API
All read-only, all requiring the biotime:read scope, all returning ERPat's
standard JSON envelope.
| Endpoint | Returns | Filters |
|---|---|---|
GET /api/v1/biotime/status | Connection health, profile, counts, binding summary, last sync. | — |
GET /api/v1/biotime/employees | Mirrored personnel with their binding state. | page, per_page |
GET /api/v1/biotime/bindings | Binding rows on their own. | status, page, per_page |
GET /api/v1/biotime/transactions | Mirrored punches, local and UTC, each with erpat_attendance_id, imported_at_utc and import_note showing what the attendance import made of it. | from, to, emp_code, terminal_sn, page, per_page |
GET /api/v1/biotime/devices | Terminals. | — |
GET /api/v1/biotime/sync-runs | Run history. | page, per_page |
GET /api/v1/biotime/analytics/summary | Daily rollups over a range. | from, to |
from and to are local dates (YYYY-MM-DD),
matching the way punches are bucketed by day. Photographs and temperature appear in
responses only when their display settings are switched on.
The BioTime API contract
For anyone integrating with the same server directly, these are the details that most often go wrong — all verified against a live cloud tenant:
| Element | Required value | If wrong |
|---|---|---|
| Authorization header | JWT <token> — never Bearer | 401, with no useful message |
| Timezone header | e.g. Asia/Manila | Times come back in the server's default zone; every punch silently shifts |
| Accessor header | Web | Some endpoints refuse the request |
| Trailing slash | Required on every path | Redirect or 404 |
| Sign-in path | /web/oauth/api/v2/user_sign_in/ | — |
| Success code | ZBSY0000 in the body | A 200 can still carry a failure code |
| List envelope | rows at data.data, count at data.total | — |
/api/jwt-api-token-auth/
returns 405, /web/oauth/api/v2/sign_in/ returns 404 (use
user_sign_in/), and /web/att/api/v2/employee_schedules/ returns
404 (use schedules/). Biotime never probes these.