Version 0.4.0
Release Date: February 10, 2026
🎯 Quiz Events
You can now create Events to control when and how participants take a quiz. Events act as scheduled sessions tied to a specific quiz, giving you fine-grained control over availability, timing, and behavior.
What You Can Do
- Schedule quiz sessions — Set a start and end time so participants can only take the quiz during that window
- Override quiz settings per event — Customize attempt limits, time limits, submission mode, and client enforcement without changing the original quiz
- Attach metadata — Store any custom data on an event (e.g. class, department, session info) and search by it later
- Search and filter — Find events by name, date range, status, quiz, or metadata
How It Works
- Create an event on any quiz you own, with a time window and optional overrides
- Share the event with participants — they can only attempt the quiz through the event while it's active
- When the event ends, no new attempts can be started and ongoing answers are blocked
Event Detail
When you view an event, the response now includes:
- Full quiz information (title, categories, tags, access type, etc.)
- List of questions with their type, category, difficulty, and points
- Question count for quick reference
- Computed
is_activestatus based on the current time
🎟️ Attempt Tickets
Tickets let quiz owners grant additional attempts to specific participants, beyond the normal limits set on a quiz or event.
What You Can Do
- Issue tickets — Give a participant extra attempts for a specific quiz or event
- Set quantity — Each ticket can grant one or more bonus attempts
- Revoke tickets — Cancel a ticket if it's no longer needed
- List tickets — View all active tickets, with optional filtering by participant or ticket type
- Bypass client enforcement — Optionally allow a participant to skip native client requirements
How It Works
- Issue a ticket to a participant for a quiz or event
- When the participant reaches the normal attempt limit, the system automatically checks for available tickets
- If a valid ticket exists, it's consumed and the participant can continue
- Tickets expire automatically (1 hours by default) and track usage so they can't be reused beyond their quantity
Ticket Types
| Type | Scope | Required Field |
|---|---|---|
| Quiz | Extra attempts on a specific quiz | quiz_id |
| Event | Extra attempts on a specific event | event_id |
Auto-Submit on Ticket Issuance
When you issue a ticket, any open (unsubmitted) attempts the participant has on that quiz are automatically submitted. This ensures a clean slate before the bonus attempts begin.
🛡️ Client Enforcement (Anti-Cheat)
Quizzes and events can now require participants to use a native client app (Android, iOS, Windows, macOS) instead of a web browser. This helps ensure a controlled testing environment.
How It Works
- Enable
client_onlyon a quiz or event - Participants using a web browser will be blocked from starting an attempt
- Participants using a recognized native client can proceed normally
- Public quizzes are exempt — client enforcement only applies to private/shared quizzes
- Bypass via ticket — Owners can issue a ticket with
bypass_clientenabled to let a specific participant skip this requirement
📋 New API Endpoints
Events
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/events | Create a new event |
| POST | /api/v1/events/search | Search events with filters and pagination |
| GET | /api/v1/events/{event_id} | Get event detail with quiz info and questions |
| PUT | /api/v1/events/{event_id} | Update an event |
| DELETE | /api/v1/events/{event_id} | Delete an event |
Tickets
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/v1/tickets | Issue a ticket to a participant |
| GET | /api/v1/tickets | List active tickets (optional filters) |
| DELETE | /api/v1/tickets/{ticket_id} | Revoke a ticket |
⚡ Other Improvements
- Event-level overrides — When an event sets
max_attempts,time_limit_seconds,submission_mode, orclient_only, those values take priority over the quiz defaults for that session - Expired event protection — Once an event's time window passes, answering and submitting are automatically blocked
- Metadata search — Event metadata supports containment queries, so you can search for all events matching partial criteria (e.g. find all events for "Class A" regardless of other metadata fields)
Breaking Changes
None. All existing quiz and attempt functionality continues to work unchanged.