Attendance Analytics API
Base URL: https://api.nexgate.com/api/v1
Short Description: The Attendance AnalyticsManagement API provides comprehensive attendee tracking and analytics for event organizers. ThisOrganizers API enables organizers tocan view overall attendance statistics with per-day and per-ticket-type breakdowns, browse a unified attendance list all(present, checked-absent, and partially attended in attendeesone view) with filters,rich track absentees by category (full no-shows vs specific-day absences),filtering, and viewdrill detailedinto the full check-in history for any individual attendees.ticket. The system supports multi-day events with separate tracking per single-day and providesmulti-day real-timeevents. attendanceAll metrics.status filtering, day filtering, buyer-type filtering, and search are handled through query parameters on a single list endpoint.
Hints:
- Organizer Only: All endpoints restricted to the event
organizersorganizer - Unified List: Present and absent tickets are in one list — filter with
?status=PRESENT|ABSENT|PARTIALLY_ATTENDED - Ticket-Based: Each row in the list is one ticket, not one person — one buyer can appear multiple times
- Attendee Number: Each ticket has a unique
attendeeNumber=bookingReference + "-" + ticketSeries(e.g.EVT-A3F4B21C-VIP-0042) - Buyer vs Attendee:
buyer= who paid,attendee= who holds the ticket — can be different people - Buyer Types:
SYSTEM_USER= bought online,AT_DOOR= name captured at door (no account) - Multi-Day Support: Per-day
statisticsfilteringandviafiltering?dayNumber=1— optional, omit for overall view Real-TimePartial Attendance:UpdatesPARTIALLY_ATTENDEDinstantly=aftercheckedcheck-insin AbsenteesomeCategories:daysFULL_NO_SHOW,butSPECIFIC_DAY_ONLY,notALLall Ticket(multi-dayTypeeventsFilter: Filter by specific ticket typesSearch: Search attendees by name/emailonly)- Pagination:
ListsDefaultpaginated (default 5020 perpage) Check-In History: Complete per-day check-in recordsAttendance Patterns: Tracks which days attended/absentpage
Response Structures
AttendanceStatsResponseAttendanceSummaryResponse
Returned by GET /summary. Always covers the full event — no filtering.
{
"eventId": "uuid",
"eventTitle": "East African Tech Summit 2025"2026",
"totalDays": 3,
"eventSchedule": [
{ "dayNumber": 1, "dayName": "Day 1 - Opening", "date": "2025-2026-12-15" },
{ "dayNumber": 2, "dayName": "Day 2 - Conference", "date": "2025-2026-12-16" },
{ "dayNumber": 3, "dayName": "Day 3 - Closing", "date": "2025-2026-12-17" }
],
"overallStats": {
"totalTickets": 500,
"totalCheckedIn"present": 462,310,
"totalAbsent"partiallyAttended": 38,45,
"absent": 145,
"attendanceRate": 92.4,71.0,
"byDay": [
{
"dayNumber": 1,
"dayName": "Day 1 - Opening",
"date": "2025-2026-12-15",
"totalTickets": 500,
"checkedIn": 475,400,
"absent": 25,100,
"attendanceRate": 95.80.0,
"status": "COMPLETED"
},
{
"dayNumber": 2,
"dayName": "Day 2 - Conference",
"date": "2026-12-16",
"totalTickets": 500,
"checkedIn": 355,
"absent": 145,
"attendanceRate": 71.0,
"status": "ONGOING"
},
{
"dayNumber": 3,
"dayName": "Day 3 - Closing",
"date": "2026-12-17",
"totalTickets": 500,
"checkedIn": 0,
"absent": 500,
"attendanceRate": 0.0,
"status": "UPCOMING"
}
]
},
"byTicketType": [
{
"ticketTypeId": "uuid",
"ticketTypeName": "VIP Pass",
"totalSold": 100,
"totalCheckedIn"present": 98,75,
"totalAbsent"partiallyAttended": 2,10,
"absent": 15,
"attendanceRate": 98.85.0,
"byDay": [
{
"dayNumber": 1,
"dayName": "Day 1 - Opening",
"checkedIn": 99,90,
"absent": 1,10,
"attendanceRate": 99.90.0
}
]
}
]
}
AttendeeListResponseAttendanceListResponse
Returned by GET /list. Reflects applied filters. summary always covers the filtered scope. partiallyAttended only appears when no dayNumber filter is set on a multi-day event.
{
"eventId": "uuid",
"eventTitle": "East African Tech Summit 2025"2026",
"appliedFilters": {
"ticketTypeId": "uuid",
"ticketTypeName": "VIP Pass",
"status": "ALL",
"dayNumber": 1,
"dayName": "Day 1 - Opening",
"dayDate"buyerType": "2025-12-15"ALL",
"ticketTypeId"search": "uuid",null
"ticketTypeName": "VIP Pass"},
"summary": {
"totalTicketsForType"totalTickets": 100,
"checkedInThisDay"present": 9990,
"absent": 10,
"partiallyAttended": null,
"attendanceRate": 90.0
},
"attendees": [
{
"ticketInstanceId": "uuid",
"attendeeNumber": "EVT-A3F4B21C-VIP-0042",
"ticketTypeId": "uuid",
"ticketType": "VIP Pass",
"ticketSeries": "VIP-0042",
"attendeeName": "John Doe",
"attendeeEmail": "john@example.com",
"attendeePhone": "+255712345678",
"buyer": {
"buyerName": "Jane Doe",
"buyerEmail": "jane@example.com",
"buyerId": "uuid",
"buyerType": "SYSTEM_USER"
},
"bookingReference": "EVT-A3F4B21C",
"pricePaid": 150.00,
"attendanceStatus": "PRESENT",
"checkInTime": "2026-12-15T09:15:00+03:00",
"checkInLocation": "Main Gate",
"checkedInBy": "Scanner Operator 1",
"scannerId": "uuid-string"
},
{
"ticketInstanceId": "uuid-2",
"attendeeNumber": "EVT-B5D2E12F-GENE-0101",
"ticketType": "General Admission",
"ticketSeries": "GENE-0101",
"attendeeName": "Ali Hassan",
"attendeeEmail": null,
"attendeePhone": null,
"buyer": {
"buyerName": "Ali Hassan",
"buyerEmail": null,
"buyerId": null,
"buyerType": "AT_DOOR"
},
"bookingReference": "EVT-B5D2E12F",
"pricePaid": 50.00,
"attendanceStatus": "ABSENT",
"checkInTime": null,
"checkInLocation": null,
"checkedInBy": null,
"scannerId": null
}
],
"pagination": {
"currentPage": 0,
"pageSize": 20,
"totalPages": 5,
"totalElements": 100,
"hasNext": true,
"hasPrevious": false
}
}
AttendeeDetailResponse
Returned by GET /attendees/{ticketInstanceId}. Full per-day check-in history for one ticket.
{
"ticketInstanceId": "uuid",
"attendeeNumber": "EVT-A3F4B21C-VIP-0042",
"attendeeName": "John Doe",
"attendeeEmail": "john@example.com",
"attendeePhone": "+255712345678",
"ticketType": "VIP Pass",
"ticketSeries": "VIP-0001",
"bookingReference": "EVT-A3F4B21C",
"pricePaid": 150.00,
"checkInTime": "2025-12-15T09:15:00+03:00",
"checkInLocation": "Main Gate",
"checkedInBy": "Scanner Operator 1",
"scannerId": "uuid-string"
}
],
"pagination": {
"currentPage": 0,
"pageSize": 50,
"totalPages": 2,
"totalElements": 99,
"hasNext": true,
"hasPrevious": false
}
}
AbsenteeListResponse
{
"eventId": "uuid",
"eventTitle": "East African Tech Summit 2025",
"dayNumber": 1,
"dayName": "Day 1 - Opening",
"dayDate": "2025-12-15",
"ticketTypeId": null,
"ticketTypeName": null,
"summary": {
"totalTicketsForType": 500,
"absentThisDay": 25,
"absenteeRate": 5.0,
"breakdown": {
"fullNoShow": 10,
"specificDayOnly": 15
}
},
"absentees": [
{
"ticketInstanceId": "uuid",
"attendeeName": "Jane Smith",
"attendeeEmail": "jane@example.com",
"attendeePhone": "+255723456789",
"ticketType": "General Admission",
"ticketSeries": "GENER-0042",
"bookingReference": "EVT-B5D2E12F",
"pricePaid": 50.00,
"statusForThisDay": "NOT_CHECKED_IN",
"attendancePattern": {
"totalEventDays": 3,
"daysAttended": 2,
"daysAbsent": 1,
"attendedDayNumbers": [2, 3],
"absentDayNumbers": [1],
"category": "SPECIFIC_DAY_ONLY"
}
}
],
"pagination": {
"currentPage": 0,
"pageSize": 50,
"totalPages": 1,
"totalElements": 25,
"hasNext": false,
"hasPrevious": false
}
}
AttendeeDetailResponse
{
"ticketInstanceId": "uuid",
"attendeeName": "John Doe",
"attendeeEmail": "john@example.com",
"attendeePhone": "+255712345678",
"ticketType": "VIP Pass",
"ticketSeries": "VIP-0001",
"bookingReference": "EVT-A3F4B21C",
"pricePaid": 150.00,
"overallStatus": "FULLY_ATTENDED"PARTIALLY_ATTENDED",
"daysAttended": 3,2,
"daysTotal": 3,
"checkInsByDay": [
{
"dayNumber": 1,
"dayName": "Day 1 - Opening",
"dayDate": "2025-2026-12-15",
"status": "CHECKED_IN",
"checkInTime": "2025-2026-12-15T09:15:00+03:00",
"checkInLocation": "Main Gate",
"checkedInBy": "Scanner Operator 1",
"scannerId": "uuid-string"
},
{
"dayNumber": 2,
"dayName": "Day 2 - Conference",
"dayDate": "2025-2026-12-16",
"status": "CHECKED_IN"NOT_CHECKED_IN",
"checkInTime": "2025-12-16T08:45:00+03:00",null,
"checkInLocation": "VIP Entrance",null,
"checkedInBy": "Scanner Operator 2",null,
"scannerId": "uuid-string"null
},
{
"dayNumber": 3,
"dayName": "Day 3 - Closing",
"dayDate": "2025-2026-12-17",
"status": "CHECKED_IN"UPCOMING",
"checkInTime": "2025-12-17T09:00:00+03:00",null,
"checkInLocation": "Main Gate",null,
"checkedInBy": "Scanner Operator 1",null,
"scannerId": "uuid-string"null
}
]
}
Endpoints
1. Get Attendance StatsSummary
Endpoint: GET /attendance/{eventId}/statssummary
Access: 🔒 Event Organizer Only
Path Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| eventId | string (UUID) | Yes | Event identifier |
Success Response: Returns AttendanceStatsResponseAttendanceSummaryResponse
Success Response Message: "Attendance statssummary retrieved"
Behavior:
- Validates organizer owns the event
CalculatesReturns overall attendance metrics across all tickets- Breaks down by day (
multi-dayallevents)events, including single-day) - Breaks down by ticket type with per-day stats
Real-timepresentfrom=check-checked indatafor all days,partiallyAttended= some days,absent= noneattendanceRateincludes bothpresentandpartiallyAttendedtickets
Errors:
403 FORBIDDEN: Not event organizer404 NOT_FOUND: Event not found
2. Get AttendeesAttendance List
Endpoint: GET /attendance/{eventId}/attendees?dayNumber=1&ticketTypeId=uuid&search=john&page=0&size=50list
Access: 🔒 Event Organizer Only
Path Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| eventId | string (UUID) | Yes | Event identifier |
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| status | enum | No | PRESENT, ABSENT, PARTIALLY_ATTENDED — omit for all |
| dayNumber | integer | ||
| ticketTypeId | string (UUID) | No | Filter by ticket type |
| buyerType | enum | No | SYSTEM_USER, AT_DOOR — omit for all |
| search | string | No | Search by |
| page | integer | No | Page number (0-indexed, default: 0) |
| size | integer | No | Items per page (default: 20) |
Success Response: Returns AttendeeListResponseAttendanceListResponse with pagination
Success Response Message: "AttendeesAttendance list retrieved"
Behavior:
ListsReturnschecked-inoneattendeesrow per ticket (not per person)- One buyer can appear multiple times if they purchased multiple tickets
attendeeNumber=bookingReference + "-" + ticketSeries(unique per ticket)- When
dayNumberis set:attendanceStatusisPRESENTorABSENTforspecifiedthat specific day FiltersWhenbydayNumberticketistypeomitted:ifattendanceStatusprovidedreflects overall across all days (PARTIALLY_ATTENDEDpossible)Searchessummarybyblockname/emailalwaysifreflectsprovidedthe current filter scope (not the full event)PaginatedpartiallyAttendedresultsShows check-indetailssummary isnullwhen adayNumberfilter is active
Validation:
Multi-day events requiredayNumberTicket type must belong to eventDay numbermust be within valid range for the event (1 to totalDays)ticketTypeIdmust belong to the event
3. Get Absentees
Endpoint: GET /attendance/{eventId}/absentees?dayNumber=1&ticketTypeId=uuid&category=FULL_NO_SHOW&search=jane&page=0&size=50
Access: 🔒 Event Organizer Only
Path Parameters:
Query Parameters:
Success Response: Returns AbsenteeListResponse with pagination
Success Response Message: "Absentees retrieved"
BehaviorErrors:
Lists403:NOTFORBIDDENchecked-inNotattendeeseventfor specified dayorganizerCategories:404:ALLNOT_FOUND
EveryoneEvent notchecked-infoundfor/thisinvalid dayFULL_NO_SHOW:numberNever/checked-inticketany daySPECIFIC_DAY_ONLY: Attended other days buttype notthis one
Absentee Breakdown:
Full no-shows: Tickets never usedSpecific day only: Partial attendancefound
4.3. Get Attendee Detail
Endpoint: GET /attendance/{eventId}/attendees/{ticketInstanceId}
Access: 🔒 Event Organizer Only
Path Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| eventId | string (UUID) | Yes | Event identifier |
| ticketInstanceId | string (UUID) | Yes |
Success Response: Returns AttendeeDetailResponse
Success Response Message: "Attendee detail retrieved"
Behavior:
ShowsReturnscompletethe full check-in history for one specific ticket across all event daysPer-overallStatuscomputed from all dayscheckInsByDaylists every event day with its status(CHECKED_IN,andNOT_CHECKED_IN,check-inUPCOMING)detailsOverall attendanceDay statusCheck-inreflectsdetailswhether(time,thelocation,dayscanner)has passed, is today, or is upcoming
Overall StatusErrors:
FULLY_ATTENDED403 FORBIDDEN:Checked-inNotalleventdaysorganizerPARTIALLY_ATTENDED404 NOT_FOUND:Checked-inEventsomeordaysticket NOT_ATTENDED:notNever checked-infound
AbsenteeKey Categories ExplainedConcepts
ALLAttendee (Default)Number
Every ticket has a unique attendeeNumber formatted as:
{bookingReference}-{ticketSeries}
WhoExample: EveryoneEVT-A3F4B21C-VIP-0042
Use this as the primary human-readable identifier for a ticket on the attendance list — safer than ticketInstanceId (UUID) for display and manual lookup.
Buyer vs Attendee
These are two different people on the same ticket:
| Field | Who |
|---|---|
attendeeName / attendeeEmail |
The person who |
buyer.buyerName / buyer.buyerEmail |
The person who paid |
Example: Jane buys 3 VIP tickets. She is the buyer on all 3. The attendees are John, Ali, and herself.
One buyer can appear multiple times in for the specified day
Includes:
Full no-shows (never attended any day)Specific-day absentees (attended other days)
Use Case: Complete list of— who'sonce missingper todayticket they purchased.
FULL_NO_SHOWBuyer Types
Who
| Value | Meaning |
|---|---|
SYSTEM_USER |
Bought online — has a platform account, buyerId is populated |
AT_DOOR |
Walk-in sale — only name captured at door, buyerEmail and buyerId are null |
Attendance Status
| Value | Meaning | When |
|---|---|---|
PRESENT |
Checked in | With dayNumber: |
ABSENT |
Not checked in | With dayNumber: not that day. Without: never |
PARTIALLY_ATTENDED |
Checked
|
Only possible without dayNumber filter, on multi-day events |
Day Status (in detail view)
| Value | Meaning |
|---|---|
CHECKED_IN |
Scanned on that day |
NOT_CHECKED_IN |
Day has passed, was not scanned |
UPCOMING |
Day has not happened yet |
Attendance Rate Calculation
attendanceRate = ((present + partiallyAttended) / totalTickets) × 100
Rounded to 2 decimal places.
CharacteristicsPer-day rate:
Checked-(inonsummaryother event daysPartial attendanceShows attendance pattern
Use Case: Identify who skipped specific days (e.g., missed keynote)
ExamplebyDay):
3-Dayrate Festival:
- Ticket A: Attended Day 1, 2, 3 → FULLY_ATTENDED
- Ticket B: Attended Day 1, 3= (missed Day 2) → SPECIFIC_DAY_ONLYcheckedIn for Daythat 2day -/ TickettotalTickets) C:× Never attended → FULL_NO_SHOW for all days100
Multi-Day Event Logic
Day NumberFilter RequirementsBehaviour
dayNumber |
Status scope |
|---|---|
Provided (e.g. ?dayNumber=2) |
Status = did this ticket check in on Day 2? (PRESENT or ABSENT only) |
| Omitted | Status = overall across all days (PRESENT, ABSENT, or PARTIALLY_ATTENDED) |
Single-Day Events:
dayNumberoptional (defaults to 1)Only one day to track
Multi-Day Events:
dayNumberREQUIREDMust specify which day (1, 2, 3...)System returns error if missing
Validationvalidation:
Event has 3 days → dayNumber must be 1, 2, or 3
Request dayNumber=5 → Error:404: "Invalid day 5. Valid: 1-3"
Per-Day Tracking
Statistics:
Total tickets (same for all days)Checked-in (varies per day)Absent (varies per day)Attendance rate (varies per day)
Day Status:
COMPLETEDevents:Day has passedONGOING: DaydayNumberistodayalways UPCOMING:optional.DayOmittinghasn'titstartedgives
Example:same result as ?dayNumber=1.
3-Day Event (Dec 15-17), Today: Dec 16
Day 1: status=COMPLETED, checkedIn=475
Day 2: status=ONGOING, checkedIn=450
Day 3: status=UPCOMING, checkedIn=0
Attendance Rate Calculations
Overall Attendance Rate
Rate = (Unique Tickets Checked-In / Total Tickets) × 100
Example:
Total tickets: 500Tickets with at least one check-in: 462Rate: 92.4%
Per-Day Attendance Rate
Rate = (Checked-In This Day / Total Tickets) × 100
Example:
Total tickets: 500Checked-in Day 1: 475Rate: 95.0%
Per-Ticket-Type Rate
Rate = (Checked-In for Type / Total Sold for Type) × 100
Example:
VIP tickets sold: 100VIP checked-in: 98Rate: 98.0%
Search Functionality
Searches:
Attendee name (case-insensitive)Attendee email (case-insensitive)
Match: Partial match (contains)
Examples:
Search "john" → Matches "John Doe", "Johnny Smith", "john@example.com"Search "@gmail" → Matches all Gmail addressesSearch "255712" → Matches phone numbers containing this
Use Cases
Dashboard Overview
GET /attendance/{eventId}/summary
Use: top-of-page stats card
Shows: -overall Overallrate, attendance rate
- Per-per-day breakdownbreakdown, - Per-per-ticket-type breakdown
-
Full metricsAttendance Table
GET /attendance/{eventId}/list
Use: default organizer table view — all tickets, all statuses
Check Who Attended Today (Day 2)
GET /attendance/{eventId}/list?dayNumber=2&status=PRESENT
Shows: tickets checked in on Day 2
Who Missed Today
GET /attendance/{eventId}/attendees?list?dayNumber=12&status=ABSENT
Shows: -tickets Allthat checked-didn't check in attendees foron Day 12 -(regardless Check-inof timesother and locations
- Searchable and filterabledays)
FindAt-Door No-ShowsWalk-Ins Only
GET /attendance/{eventId}/absentees?dayNumber=1&category=FULL_NO_SHOWlist?buyerType=AT_DOOR
Shows: -all Ticketstickets thatsold wereat neverthe used
- For follow-up or refund processingdoor
TrackPartially PartialAttended Attendance(Multi-Day)
GET /attendance/{eventId}/absentees?dayNumber=2&category=SPECIFIC_DAY_ONLYlist?status=PARTIALLY_ATTENDED
Shows: -tickets Whothat attended Daysome 1days but missednot Dayall
2Requires: -no UsefuldayNumber forfilter
understanding
Search patternsby Name
GET /attendance/{eventId}/list?search=john
Matches: attendee name, email, or phone containing "john"
Individual Ticket History
GET /attendance/{eventId}/attendees/{ticketInstanceId}
Shows: -full Completeper-day check-in historyrecord -for Whichone days attended/missed
- Check-in details per dayticket
Best Practices
For Organizers
✅ Monitor attendance in real-time during event
✅ Follow up with full no-shows post-event
✅ Track partial attendance patterns
✅ Export attendee lists for post-event communications
✅ Use absentee data to improve future events
For Developers
✅ Require dayNumber for multi-day events
✅ Show attendance rate with 1 decimal (92.4%)
✅ Implement export to CSV functionality
✅ Cache stats (refresh every 5 minutes)
✅ Display check-in times in event timezone
Quick Reference
HTTP Status Codes
200 OK:Successful requestSuccess401 UNAUTHORIZED:AuthenticationNotrequiredauthenticated403 FORBIDDEN: Not the event organizer404 NOT_FOUND:Event/Event / ticket / day number not found
Attendance Status Values
FULLY_ATTENDED:PRESENTAll— attended (all dayschecked-inif no day filter)ABSENT— did not attendPARTIALLY_ATTENDED:Some— attended some dayschecked-in(multi-day, NOT_ATTENDED:noNeverdaychecked-infilter)
Day Status Values
COMPLETED:Day— day has passedONGOING:Day— day is todayUPCOMING:Day—hasn'tday has not started
AbsenteeBuyer CategoriesType Values
ALL:SYSTEM_USERAll—absenteesonlineforpurchase,thishasdayplatform accountFULL_NO_SHOW:AT_DOORNever—attendedwalk-in,anynamedayonly, SPECIFIC_DAY_ONLY:noMissed this day onlyaccount
Default Conclusion
Pagination
The
page:Instant0attendance(firstmetrics
page)size:Per-day20breakdowns
items✅perAbsenteepage
✅ Real-Time Stats