Platform
ScaiWave ScaiGrid ScaiCore ScaiBot ScaiDrive ScaiKey Models Tools & Services
Solutions
Organisations Developers Internet Service Providers Managed Service Providers AI-in-a-Box
Resources
Support Documentation Blog Downloads
Company
About Research Careers Investment Opportunities Contact
Log in

Presence and state API

3 endpoints.

Method Path Purpose
GET /v1/presence Batch-fetch presence for a list of participant ids.
GET /v1/rooms/{room_id}/state Snapshot of a room's authoritative state (members, engagement, settings, plan).
PUT /v1/typing Send your typing indicator.

GET /v1/presence#

bash
1
2
curl "$BASE/v1/presence?ids=p1,p2,p3" \
  -H "Authorization: Bearer $TOKEN"
json
1
2
3
4
5
6
7
{
  "data": {
    "p1": "online",
    "p2": "idle",
    "p3": "offline"
  }
}

Use this for member lists and search results. Don't poll — subscribe to the presence WebSocket event for live updates and use this for the initial snapshot.

States: online, idle, busy, appear_offline, offline.

GET /v1/rooms/{room_id}/state#

A single denormalised snapshot of everything client-side state typically needs:

jsonc
{
  "data": {
    "room": { /* room metadata */ },
    "members": [ /* members with their per-room state */ ],
    "engagement": { /* mode + per-AI overrides */ },
    "plan": null,         // or full plan if one is active
    "active_sidekicks": [ /* live sidekicks */ ],
    "active_call": null,  // or call state
    "unread_count": 7,
    "last_read_event_id": "evt-…",
    "muted_until": null,
    "snoozed_event_ids": []
  }
}

Faster than 7 parallel requests on first room-open. Internal use is the client mounting a fresh room view; you can use it too.

PUT /v1/typing#

bash
1
2
3
curl -X PUT "$BASE/v1/typing" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"room_id": "room-…", "typing": true}'

Sets your typing indicator. Auto-clears after 4 seconds of no re-publish. Use typing: false to clear early.

Fan out to other room members via the typing WebSocket event.

Updated 2026-05-18 12:07:15 View source (.md) rev 4