API Reference
Core APIs: Events, Registrations, Users, Members
The fundamental CRUD endpoints for events, registrations, users, and members.
Events
Manage events: create, read, update, delete, and image upload.
| Method | Path | Auth | Description |
|---|---|---|---|
POST | /events | π | Create a new event |
GET | /events | π | List all events |
GET | /events/{eventId}/{year} | π | Get a single event |
PATCH | /events/{eventId}/{year} | π | Update an event |
DELETE | /events/{eventId}/{year} | π | Delete an event (admin only) |
GET | /events/nearest | π | Get the nearest upcoming event |
POST | /events/upload | π | Get a presigned S3 URL for image upload |
POST /events: Create Event
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
id | string | β | Event slug (e.g., "blueprint") |
year | number | β | Event year (e.g., 2026) |
ename | string | β | Display name |
description | string | Event description | |
capac | number | Max capacity | |
startDate | string | ISO date string | |
endDate | string | ISO date string | |
elocation | string | Venue location | |
imageUrl | string | Event banner image URL | |
isPublished | boolean | Whether visible to users | |
isApplicationBased | boolean | Requires application to register | |
pricing | object | { nonMember: number, member: number } | |
registrationQuestions | array | Custom registration form questions |
GET /events/{eventId}/{year}
Supports optional query parameters:
?count=trueincludes registration count?users=trueincludes full user details for each registration
Response: Full event object with all fields above, plus isCompleted flag.
GET /events/nearest
Returns the single event with the closest future startDate. No auth required, used for landing pages.
Registrations
Handle event registration, check-in, waitlisting, and bulk operations.
| Method | Path | Auth | Description |
|---|---|---|---|
POST | /registrations | π | Register for an event |
PUT | /registrations/{eventId}/{year} | π | Update a registration |
GET | /registrations | π | List registrations (with filters) |
DELETE | /registrations/{eventId}/{year} | π | Delete a registration |
DELETE | /registrations/delete/{eventId}/{year} | π | Bulk delete registrations |
GET | /registrations/leaderboard/{eventId}/{year} | π | Event leaderboard (points) |
PUT | /registrations/massUpdate/{eventId}/{year} | π | Bulk update registrations |
POST /registrations: Register
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
eventID | string | β | Event ID |
year | number | β | Event year |
email | string | β | User's email |
basicInformation | object | { fname, lname } | |
dynamicResponses | object | Answers to custom registration questions | |
isPartner | boolean | Whether this is a partner registration |
What happens on registration:
- Checks if event exists and has capacity
- If full β auto-sets status to
waitlist - Creates registration record
- Sends QR code email via SendGrid
- Sends calendar invite (ICS file)
- Sends SNS notification to Slack
Registration Statuses
| Status | Description |
|---|---|
registered | Confirmed registration |
waitlist | On the waitlist (event at capacity) |
checkedIn | Checked in at event |
incomplete | Started but didn't finish registration |
cancelled | Cancelled by user or admin |
accepted | Application accepted (application-based events) |
acceptedPending | Accepted, awaiting payment |
acceptedComplete | Accepted and paid |
rejected | Application rejected |
GET /registrations: Query Filters
| Query Param | Description |
|---|---|
eventID | Filter by event ID |
year | Filter by year |
email | Filter by user email |
eventID;year | Filter by composite event key |
Users
User account management.
| Method | Path | Auth | Description |
|---|---|---|---|
POST | /users | π | Create user |
GET | /users/check/{email} | π | Check if user exists |
GET | /users/isMember/{email} | π | Check membership status |
GET | /users/{email} | π | Get user details |
GET | /users | π | List all users (admin) |
PATCH | /users/{email} | π | Update user |
PATCH | /users/favEvent/{email} | π | Toggle favorite event |
DELETE | /users/{email} | π | Delete user |
User Schema
| Field | Type | Description |
|---|---|---|
id | string | Email address (primary key) |
fname | string | First name |
lname | string | Last name |
email | string | Email address |
admin | boolean | Auto-set if email contains @ubcbiztech.com |
isMember | boolean | Has active membership |
faculty | string | Faculty/school |
major | string | Area of study |
year | string | Academic year |
studentId | string | Student number |
diet | string | Dietary restrictions |
gender | string | Gender identity |
education | string | Education level |
favEvents | array | Favorited event IDs |
Immutable Fields
The id and email fields cannot be changed after creation. The admin field is auto-detected from the email domain.
Members
Club membership CRUD.
| Method | Path | Auth | Description |
|---|---|---|---|
POST | /members | π | Create member |
GET | /members/{email} | π | Get member by email |
GET | /members/profileID/{profileID} | π | Get member email by profile ID |
GET | /members | π | List all members (admin) |
PATCH | /members/{email} | π | Update member |
DELETE | /members/{email} | π | Delete member |
POST | /members/grant | π | Admin: grant membership (creates user + member + profile in one call) |
Member Schema
| Field | Type | Description |
|---|---|---|
id | string | Email address (primary key) |
profileID | string | Human-readable profile identifier |
firstName | string | First name |
pronouns | string | Preferred pronouns |
faculty | string | Faculty |
major | string | Major |
year | string | Academic year |
international | boolean | International student status |
prevMember | boolean | Was a member before |
education | string | Education level (undergrad, grad, etc.) |
heardFrom | string | How they heard about BizTech |
topics | array | Topics of interest |
admin | boolean | Admin status |
discordId | string | Discord user ID |