Get Video Call Attendees
Who is registered for this call, and — once it has started — how much of it they actually attended.
The roster comes from one of two places depending on how far along the call is, reported in source:
source: "participants" — the call is ongoing or completed. Registration records were written when it started, so this is a fixed historical roster: it stays accurate even after those subscriptions expire or are revoked.
source: "subscriptions" — the call has not started, so no registration records exist yet. The roster is derived live from everyone with active access to the call's linked Mangos, minus anyone whose only access comes through excludeMangoes. It can still change before the call begins.
Either way each row is one person — deduplicated across subscriptions — with registeredAt marking when they gained access. Use search to match on name, email or phone; filtered reflects that match while total does not.
Attendance is session-based, not a single joined/not-joined flag. During a live call the creator opens one or more attendance sessions and attendees mark themselves present in each. So a call has attendanceSessionsHeld sessions, and each row reports sessionsAttended out of that total.
Reading it correctly:
attendanceSessionsHeld: 0— the creator never took attendance. This is not evidence that nobody attended, and rows carry nosessionsAttended.sessionsAttended: 0withattendanceSessionsHeld: 3— sessions ran and this person was marked present for none of them.- Partial counts are normal, and a low count is not the same as poor attendance. People are only enrolled in sessions open while they are on the call, so someone who joined after the first two sessions closed can attend the rest and still read
1 of 3. TreatsessionsAttendedas a floor on participation, not a percentage.
Because sessions only exist during a live call, attendanceSessionsHeld is always 0 and sessionsAttended is absent when source is subscriptions.
Authorization
bearer In: header
Path Parameters
ID of the video-call occurrence
Query Parameters
125value <= 100Free-text match on the registrant's name, email or phone
Header Parameters
Host name of the dashboard, ex: mydomain.tagmango.com
Timezone offset (in number) example-> 330
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://api-prod-new.tagmango.com/api/v1/external/workshops/video-calls/66c4964c11e7fef26751f3a7/attendees" \ -H "x-whitelabel-host: string" \ -H "x-timezone-offset: string"{
"source": "subscriptions",
"callStatus": "upcoming",
"total": 120,
"filtered": 42,
"attendanceSessionsHeld": 3,
"registrations": [
{
"name": "John Doe",
"email": "john.doe@example.com",
"country": "India",
"userId": "66c4964c11e7fef26751f3ab",
"phone": "9876543210",
"registeredAt": "2025-05-20T09:00:00.000Z",
"sessionsAttended": 2
}
]
}{
"code": 400,
"type": "Bad Request",
"statusMessage": "BAD_REQUEST",
"success": false,
"message": "Invalid request",
"result": "Invalid request"
}{
"code": 401,
"type": "Unauthorized",
"statusMessage": "UNAUTHORIZED",
"message": "Invalid token",
"result": "Invalid token",
"success": false
}{
"code": 403,
"type": "Forbidden",
"statusMessage": "FORBIDDEN",
"errorCode": "WORKSHOP_MANGO_FORBIDDEN",
"message": "You can not access this api with a TagMango account, only available for whitelabel hosts",
"result": "You can not access this api with a TagMango account, only available for whitelabel hosts",
"success": false
}{
"code": 404,
"type": "Not Found",
"statusMessage": "NOT_FOUND",
"errorCode": "WORKSHOP_NOT_FOUND",
"message": "No video call with this id belongs to this creator. Also returned when the id is valid but owned by someone else — ownership failures are not distinguished from missing records.",
"result": "No video call with this id belongs to this creator. Also returned when the id is valid but owned by someone else — ownership failures are not distinguished from missing records.",
"success": false
}{
"code": 429,
"type": "Too Many Requests",
"statusMessage": "TOO_MANY_REQUESTS",
"message": "Request limit exceeded. try after 10 seconds",
"result": "Request limit exceeded. try after 10 seconds",
"success": false
}