Appearance
Events API Reference
Table of Contents
- Overview
- API Documentation Resources
- Base Configuration
- Event Management Endpoints
- Registration Management
- Booth Configuration
- Bundle Management
- Activity & Session Management
- Exhibitor Management
- Organization Management
- Venue Management
- Speaker Management
- Invoice Settings
- Error Responses
Overview
The Engagifii Events API provides comprehensive event management functionality through RESTful endpoints. All endpoints follow consistent patterns for requests and responses.
API Documentation Resources
OpenAPI Specification
- File:
openapi.yaml - Description: Complete OpenAPI 3.0.3 specification with all endpoints, schemas, and security definitions
- Usage: Import into Swagger UI, generate client SDKs, or validate API contracts
- Features:
- All 150+ endpoints documented
- Request/response schemas
- Security definitions
- Server configurations
Postman Collection
- File:
postman-collection.json - Description: Ready-to-use Postman collection for testing and exploration
- Features:
- Pre-configured authentication with auto-refresh
- Environment variables setup
- Test scripts for validation
- Example requests for all endpoints
- Import Instructions:
- Open Postman
- Click Import → Upload Files
- Select
postman-collection.json - Configure environment variables:
identity_server_urlclient_idclient_secrettenant_code
Quick Testing
bash
# Using OpenAPI spec with curl
swagger-codegen generate -i openapi.yaml -l bash -o ./api-client
# Or import directly into tools
# - Swagger UI: https://editor.swagger.io
# - Postman: Import → OpenAPI 3.0
# - Insomnia: Import → From FileAPI Conventions
- Base URL:
https://engagifii-prod-event.azurewebsites.net - API Version:
1.0 - Content Type:
application/json - Authentication: OAuth 2.0 Bearer Token
- Date Format: ISO 8601 (
YYYY-MM-DDTHH:mm:ss.sssZ) - GUID Format: Standard UUID v4
Base Configuration
Required Headers
Every request must include:
http
Authorization: Bearer {access_token}
api-version: 1.0
tenant-code: {tenant_code}
Content-Type: application/jsonPagination
List endpoints support pagination through ListViewRequest:
json
{
"PageNumber": 1,
"PageSize": 10,
"SortBy": "CreatedDate",
"SortOrder": "DESC"
}Response Format
Standard response wrapper:
json
{
"data": [],
"totalCount": 100,
"pageNumber": 1,
"pageSize": 10
}Event Management Endpoints
List Events
Endpoint: POST /api/1.0/event/list
Purpose: Retrieve paginated list of events with filtering
Request:
json
{
"PageNumber": 1,
"PageSize": 10,
"OnlyUpcoming": true,
"SearchText": "Conference",
"EventTypeIds": [1, 2],
"StartDateFrom": "2024-01-01",
"StartDateTo": "2024-12-31",
"Tags": ["technology", "innovation"]
}Response:
json
{
"data": [
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Annual Tech Conference 2024",
"description": "Leading technology conference",
"startDateTime": "2024-06-15T09:00:00Z",
"endDateTime": "2024-06-17T18:00:00Z",
"eventStatus": "Published",
"registrantsCapacity": 500,
"availableRegistrantsCapacity": 245,
"registrantsCount": 255,
"isFreeEvent": false,
"defaultPrice": 299.99,
"location": {
"venueId": "venue-guid",
"venueName": "Convention Center",
"address": "123 Main St",
"city": "New York",
"state": "NY",
"zipCode": "10001"
},
"eventType": "Conference",
"isRegistrationAllowed": true,
"registrationStartFrom": "2024-01-01T00:00:00Z",
"registrationEndDate": "2024-06-01T23:59:59Z"
}
],
"totalCount": 42,
"pageNumber": 1,
"pageSize": 10
}Error Responses:
400 Bad Request: Invalid filter parameters401 Unauthorized: Invalid or expired token403 Forbidden: Insufficient permissions
Get Event Details
Endpoint: GET /api/1.0/event/{id}
Purpose: Retrieve complete event details including bundles, sessions, and configuration
Parameters:
id(GUID): Event identifiergroupId(GUID, optional): Group context for pricing
Response:
json
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"name": "Annual Tech Conference 2024",
"description": "Comprehensive technology conference",
"iconUrl": "https://storage.engagifii.com/event-icon.png",
"startDateTime": "2024-06-15T09:00:00Z",
"endDateTime": "2024-06-17T18:00:00Z",
"eventWithClass": true,
"eventWithExhibitor": true,
"eventStatus": "Published",
"contacts": {
"regular": [
{
"contactTypeId": 1,
"contactType": "Primary",
"name": "John Doe",
"email": "john@example.com",
"phone": "+1-555-0100"
}
],
"finance": [],
"exhibitor": []
},
"bundles": [
{
"id": "bundle-guid",
"name": "VIP Package",
"defaultPrice": 599.99,
"description": "Full conference access with VIP benefits"
}
],
"sessions": [
{
"id": "session-guid",
"name": "Opening Keynote",
"startDateTime": "2024-06-15T09:00:00Z",
"endDateTime": "2024-06-15T10:30:00Z",
"speaker": "Jane Smith",
"room": "Main Hall"
}
],
"pricingFramework": {
"defaultPrice": 299.99,
"earlyBirdPrice": 249.99,
"earlyBirdEndDate": "2024-05-01T23:59:59Z"
},
"registrationWorkflows": [
{
"workflowId": 1,
"workflowName": "Standard Registration",
"requiresApproval": false
}
]
}Create/Update Event
Endpoint: POST /api/1.0/event/save
Purpose: Create new event or update existing event
Request:
json
{
"id": null, // null for new, GUID for update
"name": "New Technology Summit",
"description": "Innovation and technology showcase",
"iconUrl": "https://example.com/icon.png",
"startDateTime": "2024-08-15T09:00:00Z",
"endDateTime": "2024-08-16T18:00:00Z",
"eventWithClass": false,
"eventWithExhibitor": true,
"eventTypeId": 1,
"contacts": {
"regular": [
{
"contactTypeId": 1,
"name": "Event Manager",
"email": "manager@example.com",
"phone": "+1-555-0101"
}
]
},
"location": {
"venueId": "venue-guid",
"roomIds": ["room1-guid", "room2-guid"]
},
"isFreeEvent": false,
"defaultPrice": 199.99,
"registrantsCapacity": 300,
"isRegistrationOn": true,
"registrationStartFrom": "2024-03-01T00:00:00Z",
"registrationEndDate": "2024-08-01T23:59:59Z",
"eventDates": [
{
"date": "2024-08-15",
"startTime": "09:00",
"endTime": "18:00"
},
{
"date": "2024-08-16",
"startTime": "09:00",
"endTime": "17:00"
}
]
}Response:
json
{
"id": "newly-created-event-guid",
"name": "New Technology Summit",
// ... full event object
}Check Event Name Availability
Endpoint: POST /api/1.0/event/CheckEventName
Purpose: Verify if event name is already in use
Request:
json
{
"eventName": "Annual Conference 2024",
"eventId": null // Exclude this event from check
}Response:
json
{
"isAvailable": true,
"message": "Event name is available"
}Registration Management
List Event Registrations
Endpoint: POST /api/1.0/event/registration/GetEventRegistrations
Purpose: Get all registrations for events with advanced filtering
Request:
json
{
"filter": {
"eventId": "event-guid",
"registrationType": 1, // 1=Member, 2=Exhibitor
"registrationStatus": [1, 5], // Status codes
"organizationIds": ["org1-guid", "org2-guid"],
"registrationDateFrom": "2024-01-01",
"registrationDateTo": "2024-12-31",
"searchText": "john"
},
"pageNumber": 1,
"pageSize": 20,
"sortBy": "RegisteredOn",
"sortOrder": "DESC"
}Response:
json
{
"data": [
{
"id": "registration-guid",
"memberId": "member-guid",
"fullName": "John Doe",
"email": "john@example.com",
"organization": "Tech Corp",
"registrationNumber": "REG-2024-001",
"registrationType": "Member",
"registrationStatus": "Approved",
"registeredOn": "2024-03-15T10:30:00Z",
"groupId": "group-guid",
"groupNumber": "GRP-001",
"invoiceDetail": {
"invoiceId": "invoice-guid",
"invoiceNumber": "INV-2024-0001",
"amount": 299.99,
"status": "Paid"
},
"bundles": [
{
"bundleId": "bundle-guid",
"bundleName": "Standard Package",
"price": 299.99
}
],
"approvalStatus": {
"workflowId": 1,
"currentStep": "Completed",
"approvedBy": "Manager Name",
"approvedDate": "2024-03-16T09:00:00Z"
}
}
],
"totalCount": 255,
"pageNumber": 1,
"pageSize": 20
}Create Event Registration
Endpoint: POST /api/1.0/event/registration/save
Purpose: Register member or exhibitor for an event
Request:
json
{
"eventId": "event-guid",
"memberId": "member-guid",
"registrationType": 1, // 1=Member, 2=Exhibitor
"bundleIds": ["bundle1-guid", "bundle2-guid"],
"sessionIds": ["session1-guid", "session2-guid"],
"registrationWorkflowId": 1,
"roleId": 1,
"notifyMe": true,
"customFields": {
"dietaryRestrictions": "Vegetarian",
"emergencyContact": "+1-555-0911"
}
}Response:
json
{
"id": "new-registration-guid",
"registrationNumber": "REG-2024-002",
"status": "PendingApproval",
"requiresApproval": true,
"nextApprover": "manager@example.com",
"estimatedAmount": 299.99
}Get Registration Details
Endpoint: GET /api/1.0/event/registration/GetById/{id}
Purpose: Get complete registration details including items and history
Response:
json
{
"id": "registration-guid",
"eventDetails": {
"id": "event-guid",
"name": "Annual Conference",
"startDate": "2024-06-15"
},
"registrantDetails": {
"memberId": "member-guid",
"name": "John Doe",
"email": "john@example.com",
"phone": "+1-555-0100"
},
"registrationItems": {
"bundles": [
{
"id": "bundle-guid",
"name": "VIP Package",
"price": 599.99,
"items": ["Session Access", "Lunch", "Materials"]
}
],
"sessions": [
{
"id": "session-guid",
"name": "Keynote Speech",
"dateTime": "2024-06-15T09:00:00Z"
}
]
},
"approvalHistory": [
{
"step": "Manager Approval",
"status": "Approved",
"approvedBy": "Jane Manager",
"date": "2024-03-16T09:00:00Z",
"comments": "Approved for professional development"
}
]
}Approve/Deny Registration
Endpoint: POST /api/1.0/event/registration/ApproveRequest
Purpose: Process approval for pending registration
Request:
json
{
"approvalId": "approval-guid",
"registrationId": "registration-guid",
"action": "Approve", // or "Deny"
"comments": "Approved for attendance",
"denyReasonId": null // Required if denying
}Response:
json
{
"success": true,
"nextStep": "Finance Approval",
"notificationsSent": ["registrant@example.com", "nextapprover@example.com"]
}Booth Configuration
List Booth Configurations
Endpoint: POST /api/1.0/event/boothconfiguration/GetAllBoothconfigurations
Purpose: Get all booth configurations for an event
Request:
json
{
"filter": {
"eventId": "event-guid",
"boothStatus": [1, 2], // 1=PreAssigned, 2=Available, 3=Sold
"boothTypeIds": ["type1-guid", "type2-guid"],
"assignedToOrganizationIds": ["org1-guid"],
"minPrice": 1000,
"maxPrice": 5000
},
"pageNumber": 1,
"pageSize": 20
}Response:
json
{
"data": [
{
"id": "booth-guid",
"boothName": "A101",
"boothType": "Premium Corner",
"boothTypeId": "type-guid",
"dimensions": {
"length": 10,
"width": 10,
"area": 100
},
"staffCapacity": 4,
"price": 2500.00,
"defaultPrice": 2500.00,
"status": "Available",
"assignedTo": null,
"location": {
"floor": "1",
"hall": "Main",
"coordinates": {"x": 100, "y": 200}
}
}
],
"totalCount": 150,
"pageNumber": 1,
"pageSize": 20
}Check Booth Availability
Endpoint: POST /api/1.0/event/boothconfiguration/boothAvailable
Purpose: Check if specific booths are available for assignment
Request:
json
{
"eventId": "event-guid",
"boothIds": ["booth1-guid", "booth2-guid", "booth3-guid"],
"checkDate": "2024-06-15"
}Response:
json
{
"availableBooths": [
{
"boothId": "booth1-guid",
"boothName": "A101",
"isAvailable": true,
"price": 2500.00
},
{
"boothId": "booth2-guid",
"boothName": "A102",
"isAvailable": false,
"assignedTo": "Tech Corp",
"reason": "Already assigned"
}
]
}Get Booth Preferences
Endpoint: POST /api/1.0/event/boothconfiguration/getpreferedboothsbyregistration
Purpose: Get booth preferences submitted by a registrant
Request:
json
{
"filter": {
"registrationId": "registration-guid",
"includeAlternatives": true
}
}Response:
json
{
"data": [
{
"preferenceOrder": 1,
"boothId": "booth1-guid",
"boothName": "A101",
"status": "Pending",
"submittedDate": "2024-03-15T10:00:00Z"
},
{
"preferenceOrder": 2,
"boothId": "booth2-guid",
"boothName": "B205",
"status": "Available"
}
]
}Bundle Management
List Event Bundles
Endpoint: POST /api/1.0/eventBundle/list
Purpose: Get all bundles for an event
Request:
json
{
"eventId": "event-guid",
"includeDisabled": false,
"includeItems": true
}Response:
json
{
"data": [
{
"id": "bundle-guid",
"name": "VIP Package",
"description": "Complete conference experience",
"defaultPrice": 599.99,
"maxUnit": 100,
"isDefault": false,
"isEnabled": true,
"sequence": 1,
"items": {
"sessions": ["session1-guid", "session2-guid"],
"activities": ["activity1-guid"],
"classes": [],
"inclusions": ["Lunch", "Materials", "Certificate"]
},
"visibility": {
"isPublic": true,
"restrictedToOrganizations": [],
"restrictedToRoles": []
}
}
],
"totalCount": 5
}Create Inline Bundle
Endpoint: POST /api/1.0/eventBundle/CreateInlineBundle
Purpose: Create a custom bundle during registration
Request:
json
{
"eventId": "event-guid",
"name": "Custom Package",
"description": "Tailored bundle for special requirements",
"items": {
"sessionIds": ["session1-guid", "session3-guid"],
"activityIds": ["activity2-guid"]
},
"price": 399.99,
"forRegistrationId": "registration-guid"
}Response:
json
{
"bundleId": "new-bundle-guid",
"name": "Custom Package",
"price": 399.99,
"created": true
}Get Bundle Participants
Endpoint: POST /api/1.0/eventBundle/participants/list
Purpose: List all participants registered for a specific bundle
Request:
json
{
"bundleId": "bundle-guid",
"includeDetails": true,
"pageNumber": 1,
"pageSize": 20
}Response:
json
{
"data": [
{
"participantId": "member-guid",
"name": "John Doe",
"email": "john@example.com",
"organization": "Tech Corp",
"registrationDate": "2024-03-15T10:00:00Z",
"registrationStatus": "Confirmed"
}
],
"totalCount": 45,
"pageNumber": 1,
"pageSize": 20
}Activity & Session Management
List Event Activities
Endpoint: POST /api/1.0/eventActivity/list
Purpose: Get all activities/sessions for an event
Request:
json
{
"eventId": "event-guid",
"activityTypeIds": [1, 2],
"speakerIds": ["speaker1-guid"],
"dateFrom": "2024-06-15",
"dateTo": "2024-06-17",
"searchText": "workshop"
}Response:
json
{
"data": [
{
"id": "activity-guid",
"name": "Advanced Workshop",
"description": "Hands-on technical workshop",
"activityType": "Workshop",
"startDateTime": "2024-06-16T14:00:00Z",
"endDateTime": "2024-06-16T17:00:00Z",
"duration": 180,
"location": {
"venue": "Convention Center",
"room": "Workshop Room A"
},
"speakers": [
{
"id": "speaker-guid",
"name": "Dr. Jane Smith",
"title": "Senior Engineer"
}
],
"capacity": 30,
"registeredCount": 25,
"price": 150.00
}
],
"totalCount": 12,
"pageNumber": 1,
"pageSize": 10
}Create/Update Activity
Endpoint: POST /api/1.0/eventActivity/save
Purpose: Create new or update existing activity
Request:
json
{
"id": null, // null for new
"eventId": "event-guid",
"name": "Technical Workshop",
"description": "Deep dive into new technologies",
"activityTypeId": 2,
"startDateTime": "2024-06-16T14:00:00Z",
"endDateTime": "2024-06-16T17:00:00Z",
"venueId": "venue-guid",
"roomId": "room-guid",
"speakerIds": ["speaker1-guid", "speaker2-guid"],
"capacity": 50,
"price": 200.00,
"materials": ["Workbook", "Sample Code"],
"prerequisites": "Basic programming knowledge"
}Response:
json
{
"id": "new-activity-guid",
"name": "Technical Workshop",
// ... full activity object
}Error Responses
Standard Error Format
All API errors follow this structure:
json
{
"error": {
"code": "ERROR_CODE",
"message": "Human-readable error message",
"details": {
"field": ["Validation error message"],
"additionalInfo": "Context-specific information"
},
"timestamp": "2024-01-15T10:30:00Z",
"traceId": "correlation-id-for-debugging"
}
}Common Error Codes
| Code | HTTP Status | Description | Resolution |
|---|---|---|---|
INVALID_REQUEST | 400 | Request validation failed | Check request format and required fields |
UNAUTHORIZED | 401 | Authentication failed | Refresh access token |
FORBIDDEN | 403 | Insufficient permissions | Verify user has required role |
NOT_FOUND | 404 | Resource not found | Verify resource ID exists |
CONFLICT | 409 | Resource conflict | Resource already exists or state conflict |
RATE_LIMITED | 429 | Too many requests | Implement backoff and retry |
SERVER_ERROR | 500 | Internal server error | Contact support if persists |
Validation Error Example
json
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Request validation failed",
"details": {
"eventId": ["Event ID is required"],
"startDateTime": ["Start date must be in the future"],
"capacity": ["Capacity must be greater than 0"]
}
}
}Code Examples
JavaScript - Complete Event Registration Flow
javascript
async function registerForEvent(client, eventId, memberId) {
try {
// 1. Get event details
const event = await client.get(`/api/1.0/event/${eventId}`);
// 2. Check availability
if (event.availableRegistrantsCapacity <= 0) {
throw new Error('Event is full');
}
// 3. Get available bundles
const bundles = await client.post('/api/1.0/eventBundle/list', {
eventId: eventId,
includeDisabled: false
});
// 4. Create registration
const registration = await client.post('/api/1.0/event/registration/save', {
eventId: eventId,
memberId: memberId,
registrationType: 1,
bundleIds: [bundles.data[0].id], // Select first bundle
notifyMe: true
});
console.log(`Registration created: ${registration.registrationNumber}`);
// 5. Handle approval if needed
if (registration.requiresApproval) {
console.log(`Approval required. Next approver: ${registration.nextApprover}`);
}
return registration;
} catch (error) {
console.error('Registration failed:', error);
throw error;
}
}Python - Booth Assignment Workflow
python
async def assign_booth_to_exhibitor(client, event_id, registration_id, booth_preferences):
"""Complete booth assignment workflow"""
# 1. Check booth availability
availability = await client.post(
'/api/1.0/event/boothconfiguration/boothAvailable',
{
'eventId': event_id,
'boothIds': booth_preferences
}
)
available_booths = [
b['boothId'] for b in availability['availableBooths']
if b['isAvailable']
]
if not available_booths:
raise Exception('No preferred booths available')
# 2. Submit booth preference
preference_result = await client.post(
'/api/1.0/event/boothconfiguration/submitPreference',
{
'registrationId': registration_id,
'preferredBoothIds': available_booths[:3],
'alternativeBoothIds': available_booths[3:6] if len(available_booths) > 3 else []
}
)
# 3. If direct assignment available, confirm it
if preference_result['assignmentType'] == 'Direct':
confirmation = await client.post(
'/api/1.0/event/boothconfiguration/confirmAssignment',
{
'registrationId': registration_id,
'boothId': preference_result['assignedBoothId']
}
)
print(f"Booth {confirmation['boothName']} assigned successfully")
return confirmation
else:
print("Preference recorded, awaiting manual assignment")
return preference_resultC# - Comprehensive Event Management
csharp
public class EventManagementService
{
private readonly IEngagifiiClient _client;
public async Task<EventViewModel> CreateCompleteEventAsync()
{
// 1. Create base event
var newEvent = await _client.PostAsync<EventViewModel>(
"/api/1.0/event/save",
new EventEditModel
{
Name = "Annual Technology Conference",
Description = "Premier tech event of the year",
StartDateTime = DateTime.Now.AddMonths(3),
EndDateTime = DateTime.Now.AddMonths(3).AddDays(2),
EventWithExhibitor = true,
RegistrantsCapacity = 500,
DefaultPrice = 299.99m,
IsRegistrationOn = true,
RegistrationStartFrom = DateTime.Now,
RegistrationEndDate = DateTime.Now.AddMonths(2).AddDays(20)
});
// 2. Add bundles
var vipBundle = await _client.PostAsync<object>(
"/api/1.0/eventBundle/save",
new
{
EventId = newEvent.Id,
Name = "VIP Package",
Description = "All-access pass with exclusive benefits",
DefaultPrice = 599.99m,
MaxUnit = 50,
IsEnabled = true
});
// 3. Add sessions
var sessions = new[]
{
new { Name = "Opening Keynote", StartTime = "09:00", Duration = 90 },
new { Name = "Tech Workshop", StartTime = "14:00", Duration = 180 },
new { Name = "Networking Event", StartTime = "18:00", Duration = 120 }
};
foreach (var session in sessions)
{
await _client.PostAsync<object>(
"/api/1.0/eventActivity/save",
new
{
EventId = newEvent.Id,
Name = session.Name,
StartDateTime = newEvent.StartDateTime.AddHours(9),
Duration = session.Duration,
ActivityTypeId = 1
});
}
// 4. Configure booth setup
for (int i = 1; i <= 20; i++)
{
await _client.PostAsync<object>(
"/api/1.0/event/boothconfiguration/save",
new
{
EventId = newEvent.Id,
BoothName = $"Booth A{i:00}",
BoothTypeId = "standard-booth-type-guid",
Length = 10,
Width = 10,
StaffCapacity = 4,
DefaultPrice = 2500.00m,
Status = 2 // Available
});
}
// 5. Publish event
await _client.PostAsync<bool>(
"/api/1.0/event/publish",
new
{
EventId = newEvent.Id,
PublishToWeb = true,
PublishToMobile = true
});
return newEvent;
}
}Rate Limiting and Best Practices
Rate Limits
- Default: 1000 requests per minute per tenant
- Burst: 100 concurrent requests maximum
- File uploads: 10 MB maximum file size
- Batch operations: 100 items per batch
Best Practices
- Use Pagination: Always paginate large result sets
- Cache Responses: Cache static data like event types, venues
- Batch Operations: Use bulk endpoints when available
- Handle Retries: Implement exponential backoff for failures
- Monitor Usage: Track API usage against rate limits
Webhooks and Events
The API supports webhooks for real-time notifications:
Available Webhook Events
event.createdevent.updatedevent.cancelledregistration.createdregistration.approvedregistration.cancelledbooth.assignedpayment.completed
Webhook Payload
json
{
"eventType": "registration.approved",
"timestamp": "2024-01-15T10:30:00Z",
"data": {
"registrationId": "registration-guid",
"eventId": "event-guid",
"memberId": "member-guid",
"approvedBy": "approver@example.com"
},
"metadata": {
"tenantCode": "TENANT123",
"correlationId": "correlation-guid"
}
}For complete endpoint details and interactive testing, visit the Swagger Documentation.
