Sessions
Create a live-view session, send the customer an invite, and poll its status. Timestamps are ISO-8601 UTC (…Z).
Two ways to authenticate
Creating a session and checking its status accept either a dashboard JWT or a team API key. Listing sessions, getting a session, and minting an agent token are dashboard-only (JWT).
Create a session
POST/sessions
Creates a session and its invitation, then dispatches the invite link over the chosen channel. Pass teamId with a dashboard JWT; an API key implies its own team.
| Field | Description |
|---|---|
teamId | The team's UUID. Required when authenticating with a dashboard JWT; inferred automatically from an API key. |
channel | How the invite is delivered: sms, email, or link (nothing is sent — you distribute the URL yourself). |
recipientPhone | The customer's phone number in E.164 format (e.g. +15555550123). Required when channel is sms. |
recipientEmail | The customer's email address. Required when channel is email — the message includes the link plus an inline QR code. |
note | An optional internal label, up to 500 characters (e.g. a ticket number), shown alongside the session in the dashboard. |
ttlMinutes | How long the invite stays valid, in minutes (1–1440). Defaults to 30. |
smsConsent | Required when channel is sms: must be true to confirm the recipient agreed to receive a text from seeitlive.io. Carrier fees may apply. |
metadata | Optional custom key/value pairs (a flat map of strings, e.g. your own external agent id or ticket reference). Stored opaquely and returned on reads. Up to 30 keys; keys up to 64 characters, values up to 500. |
curl -X POST https://api.seeitlive.io/v1/sessions \
-H "Authorization: Bearer sil_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "channel": "sms", "recipientPhone": "+15555550123", "smsConsent": true, "note": "Ticket #4821" }'json
{
"id": "f74f1305-2222-4a11-8b1e-1234567890ab",
"status": "pending",
"inviteCode": "aZ3kQ9",
"inviteUrl": "https://seeitlive.io/u/aZ3kQ9#3n9F1Qk7xY2zR8vB5tW6uL0mC4pD1sA...",
"agentViewUrl": "https://seeitlive.io/a/pL2mN8#7dR2Xa4Wq9Kj6bV3nF1yT8sH5cE0uZ...",
"expiresAt": "2026-07-07T09:42:00.000Z"
}Shown once
inviteUrl and agentViewUrl carry the plaintext session tokens in their URL fragment. They're returned only on creation — store them immediately.Session status
GET/sessions/:id/status
Poll this to know when the customer is on camera.
status moves through pending → ringing → live → ended as the customer joins and leaves, or short-circuits to expired (the invite was never opened) or cancelled.
json
{
"id": "f74f1305-2222-4a11-8b1e-1234567890ab",
"status": "live",
"startedAt": "2026-07-07T09:14:03.000Z",
"endedAt": null,
"producerCount": 1,
"hasVideo": true
}Resolve an invite (public)
GET/u/:code
The public endpoint the guest page calls to resolve an invite code into its session and brand — no token or key required. Joining the stream is authenticated separately, with the token embedded in the invite URL's fragment.
json
{
"sessionId": "f74f1305-2222-4a11-8b1e-1234567890ab",
"brand": {
"name": "Acme Support",
"brandLogoUrl": null,
"brandColor": "#1a2b3c"
},
"status": "pending"
}Rate limited
Limited to 20 requests per minute per IP, since it's unauthenticated and reachable from anywhere.