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

EventFires when
attendance.recordedA student is marked present, late or absent for a session.
attendance.updatedAn existing record changes — a correction, or a late arrival resolving an absence.
attendance.deletedA record is voided, e.g. a session cancelled after the fact.
session.startedA timetabled session opens for capture.
session.endedA session closes. Useful as the trigger to reconcile a whole roll at once.
device.offlineA 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

FieldTypeNotes
idstringUnique per event. Use it to deduplicate — see Delivery and retries.
typestringOne of the event types above.
created_atstringRFC 3339 UTC.
institution_idstringStable id for your institution.
data.statusenumpresent | late | absent | excused
data.methodenumdevice | manual | api — how the record was captured.
data.deviceobjectAbsent 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.