Skip to content
OpenAppPhysical access, fully managed
Login

Connect go2rtc for door camera live view

Door camera live view on a virtual intercom requires low-latency video in the browser. OpenApp integrates go2rtc for RTSP → WebRTC paths. On a live intercom session, get_public_session_streams tells the answering resident which camera devices belong to the door.

This guide is for building operators and integrators wiring lobby cameras to Virtual Access intercom flows. Setup: go2rtc integration.

NVR / camera (RTSP)
→ go2rtc integration (discovered stream entities)
→ Virtual intercom session (voice / video)
→ GET .../sessions/{id}/streams?token=<callee_token> → camera device_ids for the resident's UI
  1. Add go2rtc integration with NVR host, credentials, and channel discovery (getting started).
  2. Link the Virtual Access door to its opener, and add the go2rtc camera devices to the door’s cameras (stored on the portal device as go2rtc_camera_device_ids). Cameras from another org are ignored.
  3. Start a portal session with "mode": "video" — see Virtual intercom flow. Video sessions count against the video_sessions quota.

SDK

session = await client.public_access.portal_start_session(
portal_id,
target_entity_id=entity_id,
mode="video",
)
session_id = session["session_id"]

The caller receives session_id and caller_token. It can’t read the streams: that route takes the callee token.

HTTP API (curl)

Terminal window
export OPENAPP_API_BASE='https://openapp.house/api/v1'
export PUBLIC_PORTAL_ID='01HPUBLICPORTAL000000000000'
export TARGET_ENTITY_ID='01HENTITY000000000000000000'
curl -sS -X POST \
-H "Content-Type: application/json" \
-d '{
"target_entity_id": "'"${TARGET_ENTITY_ID}"'",
"mode": "video"
}' \
"${OPENAPP_API_BASE}/public/access/portals/${PUBLIC_PORTAL_ID}/sessions"

Save session_id from the response.

Fetch the door’s cameras (resident side)

Section titled “Fetch the door’s cameras (resident side)”

The answering resident’s client calls this with the callee token from the incoming-call notification, as Authorization: Bearer <callee_token> or ?token=. A caller token is refused (403).

SDK

# session_streams() can't send the callee token; call the route through the client transport.
streams = await client._request(
"GET",
f"/public/access/sessions/{session_id}/streams",
query=[("token", callee_token)],
)
camera_device_ids = streams["device_ids"]

HTTP API (curl)

Terminal window
export SESSION_ID='01HSESSION000000000000000000'
export CALLEE_TOKEN='token-from-the-incoming-call-notification'
curl -sS \
-H "Authorization: Bearer ${CALLEE_TOKEN}" \
"${OPENAPP_API_BASE}/public/access/sessions/${SESSION_ID}/streams"

Response shape: PublicSessionStreamsResponse — { "device_ids": ["01H…"] }, the go2rtc camera device ids configured on the door. Stream URLs are resolved client-side from those devices. Full reference: Public Access.

  • Configure go2rtc stream profiles in the integration so the door camera channel is the one you list on the door.
  • Session routes are public and authorized by session tokens, not by org roles.
  • Test reachability with GET .../portals/{id}/reachable before go-live.

← Provision with scripting · MCP server setup