Events
What Onetap sends, and what each payload contains.
ProposedNot yet callable
This documents a design under review. Endpoints, payloads and field names may change before release.
Event types
| Event | Fires when |
|---|---|
| attendance.recorded | A student is marked present, late or absent for a session. |
| attendance.updated | An existing record changes — a correction, or a late arrival resolving an absence. |
| attendance.deleted | A record is voided, e.g. a session cancelled after the fact. |
| session.started | A timetabled session opens for capture. |
| session.ended | A session closes. Useful as the trigger to reconcile a whole roll at once. |
| device.offline | A device stops reporting. Operational, not attendance data. |
The envelope
Every delivery uses the same envelope. Only data varies by event type.
{
"id": "evt_01J8ZC4K2M",
"type": "attendance.recorded",
"created_at": "2026-07-19T09:15:22Z",
"institution_id": "inst_4b19",
"data": {
"record_id": "att_7d3e91",
"status": "present",
"recorded_at": "2026-07-19T09:14:58Z",
"method": "device",
"student": {
"id": "stu_2a77c1",
"external_id": "2024CS118",
"name": "Priya Nair"
},
"session": {
"id": "ses_55ab20",
"course_code": "CS101",
"starts_at": "2026-07-19T09:00:00Z",
"ends_at": "2026-07-19T10:00:00Z",
"room": "Block C / 204"
},
"device": { "id": "dev_r2_0091", "model": "R2" }
}
}Fields
| Field | Type | Notes |
|---|---|---|
| id | string | Unique per event. Use it to deduplicate — see Delivery and retries. |
| type | string | One of the event types above. |
| created_at | string | RFC 3339 UTC. |
| institution_id | string | Stable id for your institution. |
| data.status | enum | present | late | absent | excused |
| data.method | enum | device | manual | api — how the record was captured. |
| data.device | object | Absent when method is manual or api. |
Matching to your records
external_id is the identifier you gave us for that student during roster sync. Key off it — it maps straight to your system with no lookup table to maintain.
Onetap ids (stu_, ses_, att_) are stable and safe to store, and you will need record_id if you ever call the Attendance API to correct something you received here.