Endpoints
| Method | Path | Description |
|---|---|---|
GET | /api/v2/rooms/{room_id}/analytics | Get room analytics |
Get room analytics
GET /api/v2/rooms/{room_id}/analytics
Returns engagement data for the room: overall progress, the internal company, all assignees (internal and external), and a breakdown of viewership per section, step, and action.
curl https://api.flowla.com/api/v2/rooms/<room_id>/analytics \
-H "x-flowla-api-key: YOUR_API_KEY"
import requests
response = requests.get(
"https://api.flowla.com/api/v2/rooms/<room_id>/analytics",
headers={"x-flowla-api-key": "YOUR_API_KEY"},
)
print(response.json())
const res = await fetch(
"https://api.flowla.com/api/v2/rooms/<room_id>/analytics",
{ headers: { "x-flowla-api-key": "YOUR_API_KEY" } }
);
const data = await res.json();
Response fields
string
Room title.
number
Overall completion percentage (0–100).
object
{ type, name } of the owning organization.array
Everyone on the room — internal team members and external contacts.
Show Assignee fields
Show Assignee fields
string
internal_organization or external_organization.string
Assignee email.
string
Full name.
string
Job title.
boolean
Present on internal assignees.
true if this person owns the room.boolean
Present on external assignees.
string
ISO 8601 timestamp. Present on external assignees.
number
Total visits. Present on external assignees.
array
Per-section analytics.
Show Section fields
Show Section fields
string
Section ID.
string
Section title.
boolean
Whether the section is marked complete.
boolean
Whether buyers can see this section.
array
Page-level viewership. Each entry has
id, title, isVisibleToExternal, and a viewership array with durationInSeconds, timesViewed, engagements, and the user who viewed it.array
Action-plan items with analytics. Each includes
id, title, status, description, internal, assignees, dueDate, isOverdue, isVisibleToExternal, actionType, and viewership.Example response
Example response
{
"title": "Flowla <> Acme",
"progressPercentage": 14.29,
"internalCompany": { "type": "internal", "name": "Flowla" },
"assignees": [
{
"belongsTo": "internal_organization",
"email": "jordan@flowla.com",
"name": "Jordan Avery",
"title": "Account Executive",
"isRoomOwner": true
},
{
"belongsTo": "external_organization",
"email": "morgan.lee@acme.com",
"name": "Morgan Lee",
"title": "VP of Operations",
"isPrimaryContact": true,
"lastSeen": "2026-05-05T14:30:44.260Z",
"viewCount": 4
}
],
"sections": [
{
"id": "e6136fc8-0036-472c-886d-5f4089f22af0",
"title": "Welcome",
"isCompleted": false,
"isVisibleToExternal": true,
"steps": [
{
"id": "14968206-ac51-4da1-9846-8b6b85a10edf",
"title": "Introduction",
"isVisibleToExternal": true,
"viewership": [
{
"user": {
"belongsTo": "external_organization",
"email": "morgan.lee@acme.com",
"name": "Morgan Lee",
"isPrimaryContact": true,
"lastSeen": "2026-05-05T14:30:44.260Z",
"viewCount": 4
},
"durationInSeconds": 144,
"timesViewed": 1,
"engagements": [
{ "type": "TASK_COMPLETED", "createdAt": "2026-05-05T14:30:54.168Z" }
]
}
]
}
],
"actions": [
{
"id": "7e06cab8-4bf6-49ca-a1c6-f49893ae28c2",
"title": "Sign mutual NDA",
"status": "in_progress",
"description": "Review and countersign the NDA before kickoff",
"internal": false,
"dueDate": "2026-05-11T22:00:00.000Z",
"isOverdue": true,
"isVisibleToExternal": true,
"actionType": "fill-form",
"assignees": [
{
"type": "user",
"user": {
"belongsTo": "internal_organization",
"email": "delia@flowla.com",
"name": "Delia Barbat",
"isRoomOwner": false
}
}
],
"viewership": [
{
"user": {
"belongsTo": "external_organization",
"email": "morgan.lee@acme.com",
"name": "Morgan Lee",
"isPrimaryContact": true,
"lastSeen": "2026-05-05T14:30:44.260Z",
"viewCount": 4
},
"durationInSeconds": 3,
"timesViewed": 1,
"engagements": []
}
]
}
]
}
]
}