Core API
Quiz Lifecycle
Start, play, complete, and report quiz attempts for paid members.
Paid quizzes enforce a start → complete pipeline with anti-cheat timing checks and optional integrity strikes.
GET
/api/quizzes/newestMetadata for the newest published quiz (public)
Auth: None
GET
/api/quizzes/{id}Quiz detail for authorized viewers
Auth: Cookie / paid
POST
/api/quiz/startRecord start + issue attemptToken
Auth: Paid user
Body: { "quizId": "string" }
POST
/api/quiz/start-lockAcquire single-device quiz session lock
Auth: Paid user
POST
/api/quiz/end-lockRelease quiz session lock
Auth: Paid user
POST
/api/user/statsSubmit completion (score, timing, rows)
Auth: Paid user
Body: { date, score, total, totalTimeSeconds, quizId, attemptToken, rows? }
GET
/api/quiz-completionCompletion status for a quiz
Auth: Cookie
GET
/api/quiz-completion/reportDetailed per-question report PDF data
Auth: Cookie
POST
/api/user/quiz-integrity-strikeRecord proctoring / focus violations
Auth: Cookie
// Minimum completion payload
{
"date": "2026-06-05",
"score": 8,
"total": 10,
"totalTimeSeconds": 240,
"quizId": "daily-2026-06-05",
"attemptToken": "<from /api/quiz/start>",
"rows": [
{
"question": "…",
"correctAnswer": "B",
"userAnswer": "B",
"correct": true,
"timeSeconds": 22
}
]
}Completion times must be at least 2 seconds per question and under 2 hours total or the API rejects the submission.