SecureGate Docs

Timeline

Presence tracking — entry/exit logs, room occupancy, dwell time, and peak detection

Overview

The timeline records every face recognition event that occurs on entry and exit cameras. Each entry captures who was detected, where, when, and the recognition confidence.

Timeline Entry

{
  "id": "tl_abc123",
  "event_id": "evt_xyz",
  "attendee_id": "att_456",
  "attendee_name": "Jane Smith",
  "room_id": "room_lobby",
  "camera_id": "cam_entry1",
  "action": "entered",
  "confidence": 0.87,
  "timestamp": "2026-06-15T09:23:45Z",
  "face_crop_url": "https://storage.securegate.dev.satschel.com/crops/tl_abc123.jpg"
}
FieldDescription
actionentered (from entry camera) or exited (from exit camera)
confidenceCosine similarity score of the face match
face_crop_urlLink to the detected face crop (encrypted at rest, signed URL)

API

GET /timeline

Query presence logs for an event:

curl "https://api.securegate.dev.satschel.com/timeline?event_id=evt_xyz" \
  -H "Authorization: Bearer $TOKEN"

Response:

{
  "entries": [
    {
      "id": "tl_001",
      "attendee_id": "att_456",
      "attendee_name": "Jane Smith",
      "room_id": "room_lobby",
      "action": "entered",
      "confidence": 0.87,
      "timestamp": "2026-06-15T09:23:45Z"
    },
    {
      "id": "tl_002",
      "attendee_id": "att_456",
      "attendee_name": "Jane Smith",
      "room_id": "room_lobby",
      "action": "exited",
      "confidence": 0.84,
      "timestamp": "2026-06-15T09:45:12Z"
    }
  ],
  "aggregates": {
    "total_entries": 342,
    "total_exits": 298,
    "current_occupancy": 44,
    "unique_attendees_seen": 187,
    "peak_occupancy": 156,
    "peak_time": "2026-06-15T11:30:00Z"
  }
}

Filtering

ParameterTypeDescription
event_idstringRequired. Filter by event
room_idstringFilter by specific room
attendee_idstringFilter by specific attendee
actionstringFilter by entered or exited
fromISO 8601Start of time range
toISO 8601End of time range

Occupancy Tracking

Room occupancy is derived from the timeline in real-time:

Current occupancy = count(entered) - count(exited)

The dashboard displays occupancy for each room with color-coded status:

StatusConditionDisplay
NormalBelow 80% capacityGreen
Warning80-100% capacityYellow
Over capacityAbove 100% capacityRed

Aggregates

The timeline API returns pre-computed aggregates:

AggregateDescription
total_entriesTotal entry events across all rooms
total_exitsTotal exit events across all rooms
current_occupancyCurrent net occupancy (entries - exits)
unique_attendees_seenCount of distinct attendees detected
peak_occupancyHighest concurrent occupancy during event
peak_timeTimestamp of peak occupancy

Dwell Time

For individual attendees, dwell time per room is calculated from entry/exit pairs:

Dwell time = exit_timestamp - entry_timestamp

If an attendee has entered but not exited, the current dwell time is calculated from the entry timestamp to now. This is exposed in the per-attendee view on the operator dashboard.

Data Retention

Timeline entries are retained for the duration configured by the tenant's data retention policy. When the retention period expires, timeline entries and associated face crops are deleted. If the tenant is deleted entirely, the TEK is destroyed, making all encrypted data (including face crops in S3) unrecoverable (crypto-shredding).

On this page