Skip to main content

Overview

Quizzes are the core resource in Quiz Quail. A quiz contains one or more rounds, and each round contains one or more questions. This guide walks through the full lifecycle of building a quiz programmatically.

Create a Quiz

curl -X POST https://app.quiz-quail.com/api/v1/quizzes \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "title": "World Geography Challenge" }'
A new quiz is created in draft status with a default first round (“Round 1”). If you omit title, it defaults to “Untitled Quiz”.
{
  "id": "abc-123",
  "title": "World Geography Challenge",
  "status": "draft",
  "rounds": [
    {
      "id": "round-1",
      "title": "Round 1",
      "order": 0,
      "questions": []
    }
  ]
}

Update a Quiz

curl -X PATCH https://app.quiz-quail.com/api/v1/quizzes/abc-123 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "World Geography Challenge 2026",
    "description": "Test your knowledge of world capitals and landmarks",
    "question_duration_seconds": 10,
    "answer_duration_seconds": 5
  }'
All fields are optional on update:
FieldTypeDescription
titlestringQuiz title (cannot be empty)
descriptionstring | nullQuiz description
intro_subtitlestring | nullSubtitle shown on intro screen
outro_textstring | nullText shown on outro screen
question_duration_secondsnumber | nullDefault time to display questions
answer_duration_secondsnumber | nullDefault time to display answers
fact_duration_secondsnumber | nullDefault time to display fun facts
hint_timing_percentnumber | nullWhen to show hints (0-100% of countdown)
resolutionstring | nullVideo resolution (e.g. “1920x1080”)
platform_profilestring | nullPlatform-specific settings profile

List Quizzes

curl "https://app.quiz-quail.com/api/v1/quizzes?limit=10&sort=updated_at&order=desc" \
  -H "Authorization: Bearer YOUR_API_KEY"
Supports cursor-based pagination with the following query parameters:
ParameterDefaultDescription
limit20Items per page (1-100)
sortupdated_atSort field: updated_at, created_at, title
orderdescSort order: asc, desc
statusFilter by status (e.g. draft)
cursorPagination cursor from previous response

Get a Quiz

curl https://app.quiz-quail.com/api/v1/quizzes/abc-123 \
  -H "Authorization: Bearer YOUR_API_KEY"
Returns the full quiz with all rounds, questions, and the assigned theme.

Delete a Quiz

curl -X DELETE https://app.quiz-quail.com/api/v1/quizzes/abc-123 \
  -H "Authorization: Bearer YOUR_API_KEY"
Returns 204 No Content on success. This permanently deletes the quiz and all its rounds and questions.

Duplicate a Quiz

curl -X POST https://app.quiz-quail.com/api/v1/quizzes/abc-123/duplicate \
  -H "Authorization: Bearer YOUR_API_KEY"
Creates a deep copy of the quiz including all rounds, questions, and theme assignment. The new quiz title is appended with ” (Copy)” and its status is set to draft.

Rounds

Rounds are ordered containers for questions within a quiz.

Add a Round

curl -X POST https://app.quiz-quail.com/api/v1/quizzes/abc-123/rounds \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Capital Cities" }'
If title is omitted, it defaults to “Round N” where N is the next number.
FieldTypeDescription
titlestringRound title
timer_overridenumber | nullOverride the quiz-level question duration for this round

Update a Round

curl -X PATCH https://app.quiz-quail.com/api/v1/quizzes/abc-123/rounds/round-1 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "title": "Famous Landmarks" }'

Delete a Round

curl -X DELETE https://app.quiz-quail.com/api/v1/quizzes/abc-123/rounds/round-1 \
  -H "Authorization: Bearer YOUR_API_KEY"
Remaining rounds are automatically re-ordered to fill the gap.

Reorder Rounds

curl -X PUT https://app.quiz-quail.com/api/v1/quizzes/abc-123/rounds/reorder \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "roundIds": ["round-3", "round-1", "round-2"] }'
Pass the complete array of round IDs in the desired order. Each round’s order field is updated to match its array index.

Questions

Questions live inside rounds and represent individual quiz items.

Add a Question

curl -X POST https://app.quiz-quail.com/api/v1/quizzes/abc-123/rounds/round-1/questions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "question_type": "multiple_choice",
    "content": {
      "text": "What is the capital of France?",
      "options": ["London", "Paris", "Berlin", "Madrid"],
      "correctOptionIndex": 1
    },
    "countdown_seconds": 10,
    "hint": "It is known as the City of Light",
    "fact": "Paris has been the capital of France since 987 AD"
  }'
FieldTypeDescription
question_typestringRequired. One of the 13 question types (see below)
contentobjectType-specific content. If omitted, default content is generated
countdown_secondsnumberTime limit for this question (default: 5)
difficultynumber | nullDifficulty level (1-5)
hintstring | nullHint text shown during countdown
factstring | nullFun fact shown after the answer is revealed

Question Types

Quiz Quail supports 13 question types, each with its own content schema:
TypeContent FieldsDescription
multiple_choicetext, options[], correctOptionIndexStandard multiple choice (2-6 options)
true_falsetext, correctAnswerTrue or false
short_answertext, correctAnswerFree-text answer
imagetext, imageUrl, options[], correctOptionIndexImage-based multiple choice
rankingtext, items[], correctOrder[]Put items in the correct order
numerictext, correctAnswerNumeric answer
open_revealtext, revealAnswerOpen-ended with a revealed answer
videotext, videoUrl, options[], correctOptionIndexVideo-based multiple choice
audiotext, audioUrl, options[], correctOptionIndexAudio-based multiple choice
multi_videotext, videoUrls[], options[], correctOptionIndexMultiple video clips
multi_audiotext, audioUrls[], options[], correctOptionIndexMultiple audio clips
progressive_revealtext, mediaUrl, options[], correctOptionIndexGradually revealed media
emojitext, emojis, options[], correctOptionIndexEmoji-based clue

Update a Question

curl -X PATCH \
  https://app.quiz-quail.com/api/v1/quizzes/abc-123/rounds/round-1/questions/q-1 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": {
      "text": "What is the capital of Germany?",
      "options": ["Munich", "Berlin", "Hamburg", "Frankfurt"],
      "correctOptionIndex": 1
    }
  }'

Delete a Question

curl -X DELETE \
  https://app.quiz-quail.com/api/v1/quizzes/abc-123/rounds/round-1/questions/q-1 \
  -H "Authorization: Bearer YOUR_API_KEY"
Remaining questions are automatically re-ordered.

Reorder Questions

curl -X PUT \
  https://app.quiz-quail.com/api/v1/quizzes/abc-123/rounds/round-1/questions/reorder \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "questionIds": ["q-3", "q-1", "q-2"] }'

Example: Build a Complete Quiz

This step-by-step example creates a geography quiz with two rounds.

Step 1: Create the quiz

curl -X POST https://app.quiz-quail.com/api/v1/quizzes \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Geography Quiz"
  }'
Save the returned id (e.g. quiz-001) and the default round ID (e.g. round-001).

Step 2: Add questions to Round 1

curl -X POST https://app.quiz-quail.com/api/v1/quizzes/quiz-001/rounds/round-001/questions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "question_type": "multiple_choice",
    "content": {
      "text": "What is the largest country by area?",
      "options": ["Canada", "China", "Russia", "United States"],
      "correctOptionIndex": 2
    },
    "countdown_seconds": 15,
    "fact": "Russia spans 11 time zones"
  }'

Step 3: Add a second round

curl -X POST https://app.quiz-quail.com/api/v1/quizzes/quiz-001/rounds \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "title": "True or False" }'
Save the returned round ID (e.g. round-002).

Step 4: Add a true/false question

curl -X POST https://app.quiz-quail.com/api/v1/quizzes/quiz-001/rounds/round-002/questions \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "question_type": "true_false",
    "content": {
      "text": "The Great Wall of China is visible from space",
      "correctAnswer": false
    },
    "fact": "This is a common myth - it is not visible to the naked eye from low Earth orbit"
  }'

Step 5: Assign a theme and render

Once your quiz structure is complete, assign a theme and start a render.