Events

Timestamped moments when a room changed: listed by the API, sent on the stream and delivered by webhook, with the same ID everywhere.

Event types

  • room.occupied, room.emptyThe room's count changed, from what Cymo observed. A device going offline never empties a room.
  • zone.entered, zone.exitedA person crossed into or out of a zone. Carries zone_id, zone_type and zone_revision.
  • bed.entered, bed.exitedA person actually got into or out of bed. Sitting up or sitting on the edge is not a bed exit.
  • posture.changed, activity.changedStanding, sitting, lying; walking, sitting up, turning in bed. Carries previous and current.
  • fall.detected, fall.state_changedA fall, then each state after it, such as on_floor, sitting_up and standing.
  • sleep.started, sleep.ended, sleep.stage_updatedA sleep session and its stages, linked by sleep_session_id.
  • analysis.updatedA windowed analysis, such as a sleep report, has a new revision.
  • track.associatedTwo tracks turned out to be the same person, for example across rooms.
  • device.online, device.offline, observation.gapCoverage changed. Missing data is reported, never filled in.

Facts, not rules

Events describe what Cymo measured, not what you build with it. There is no "out of bed for ten minutes" or "on the floor too long" event: your app starts its own timer from the bed.exited or fall.detected timestamp and decides when to alert. That keeps the list short and lets the same events power very different products.

Event shape

timestamp is when it happened; received_at is when the cloud got it, which differs for backfilled data. A correction keeps the event's id and raises its revision, so deduplicate by ID and keep the highest revision.

event
{
  "object": "event",
  "id": "evt_01",
  "type": "bed.exited",
  "timestamp": "2026-10-24T23:55:30.000Z",
  "received_at": "2026-10-24T23:55:30.000Z",
  "project_id": "proj_demo",
  "room_id": "room_bedroom",
  "device_id": "dev_bedroom",
  "track_id": "trk_001",
  "person_id": "person_001",
  "confidence": 0.92,
  "data": {},
  "revision": 1
}

Read history with GET /v1/events, filtered by room_id, person_id, type and time.

Webhooks

Every event can also be delivered to your server as a signed POST. The Webhooks guide covers registering a URL, retries, verifying signatures and receiving deliveries on your machine.