Skip to main content

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/newest

Metadata for the newest published quiz (public)

Auth: None

GET/api/quizzes/{id}

Quiz detail for authorized viewers

Auth: Cookie / paid

POST/api/quiz/start

Record start + issue attemptToken

Auth: Paid user

Body: { "quizId": "string" }

POST/api/quiz/start-lock

Acquire single-device quiz session lock

Auth: Paid user

POST/api/quiz/end-lock

Release quiz session lock

Auth: Paid user

POST/api/user/stats

Submit completion (score, timing, rows)

Auth: Paid user

Body: { date, score, total, totalTimeSeconds, quizId, attemptToken, rows? }

GET/api/quiz-completion

Completion status for a quiz

Auth: Cookie

GET/api/quiz-completion/report

Detailed per-question report PDF data

Auth: Cookie

POST/api/user/quiz-integrity-strike

Record 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.

Related in this guide