curl --request GET \
--url https://api.doozy.live/v1/quizzes/{quizId}/report \
--header 'x-api-key: <api-key>'import requests
url = "https://api.doozy.live/v1/quizzes/{quizId}/report"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.doozy.live/v1/quizzes/{quizId}/report', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.doozy.live/v1/quizzes/{quizId}/report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.doozy.live/v1/quizzes/{quizId}/report"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.doozy.live/v1/quizzes/{quizId}/report")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doozy.live/v1/quizzes/{quizId}/report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"object": "quiz_report",
"id": "quiz_abc123",
"title": "Product Knowledge Assessment",
"summary": {
"total_participants": 145,
"completed": 120,
"in_progress": 10,
"not_started": 10,
"expired": 5,
"average_score": 78.5,
"median_score": 82,
"p25_score": 70,
"p75_score": 95,
"score_distribution": {
"90": 41,
"100": 30
},
"pass_threshold": null,
"passed": null,
"failed": null,
"question_count": 10,
"completion_rate": 82.8
},
"participants": [
{
"object": "quiz_participant",
"id": "user_abc123",
"email": "jane.doe@example.com",
"display_name": "Jane Doe",
"slack_user_id": "U01234567",
"group_name": "Engineering",
"group_names": [
"Engineering",
"Platform"
],
"group_ids": [
"group_engineering"
],
"manager_email": "manager@example.com",
"manager_name": "John Smith",
"manager_slack_user_id": "U09876543",
"status": "completed",
"score": 85,
"points": 842,
"duration_seconds": 327,
"attempt": 2,
"attempts": 3,
"total_questions": 10,
"answered_questions": 10,
"correct_answers": 8,
"incorrect_answers": 2,
"assigned_at": "2026-01-15T10:30:00.000Z",
"completed_at": "2026-01-15T11:00:00.000Z",
"delivery_instance_id": "act_abc123",
"delivery_method": "track",
"track_id": "trk_xyz789",
"track_name": "Onboarding Quiz",
"is_admin": false,
"user_id": "user_abc123",
"question_responses": [
{
"object": "question_response",
"question_id": "q_abc123",
"submitted_answer": {
"id": "<string>",
"answer": "<string>"
},
"is_correct": true,
"answered_at": "2026-02-01T14:22:00.000Z",
"submitted_answers": [
{
"id": "<string>",
"answer": "<string>"
}
]
}
],
"feedback_response": {
"object": "feedback_response",
"survey_id": "srv_abc123",
"survey_instance_id": "srvi_xyz789",
"submitted_at": "2026-02-01T14:30:00.000Z",
"responses": [
{
"question_id": "fq_abc123",
"question_text": "How would you rate this quiz?",
"question_type": "scale",
"response": 4,
"comment": "Great quiz, very informative!"
}
]
}
}
],
"delivery_instances": [
{
"object": "quiz_delivery_instance",
"id": "inst_abc123",
"total_participants": 25,
"delivery_method": "track",
"track_id": "trk_xyz789",
"track_name": "Onboarding Quiz",
"delivery_detail": "#general channel"
}
],
"has_more": true,
"url": "/v1/quizzes/quiz_abc123/report",
"next_cursor": "resp_xyz789",
"previous_cursor": "resp_abc123",
"question_analytics": [
{
"object": "question_analytics",
"id": "q_abc123",
"question": "What is the capital of France?",
"type": "multipleChoice",
"round_id": "round_xyz789",
"round_name": "Geography",
"total_answered": 120,
"total_correct": 95,
"total_incorrect": 25,
"accuracy_rate": 79.2,
"answer_breakdown": [
{
"id": "ans_a1b2c3",
"answer": "Paris",
"total_selected": 45,
"correct_selections": 45,
"incorrect_selections": 0
}
]
}
]
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}Get quiz report
Retrieve a detailed analytics report for a specific quiz. Returns participant results with scores, completion status, and optionally per-question responses and analytics. Results are paginated by participant.
curl --request GET \
--url https://api.doozy.live/v1/quizzes/{quizId}/report \
--header 'x-api-key: <api-key>'import requests
url = "https://api.doozy.live/v1/quizzes/{quizId}/report"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://api.doozy.live/v1/quizzes/{quizId}/report', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.doozy.live/v1/quizzes/{quizId}/report",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.doozy.live/v1/quizzes/{quizId}/report"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.doozy.live/v1/quizzes/{quizId}/report")
.header("x-api-key", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.doozy.live/v1/quizzes/{quizId}/report")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"object": "quiz_report",
"id": "quiz_abc123",
"title": "Product Knowledge Assessment",
"summary": {
"total_participants": 145,
"completed": 120,
"in_progress": 10,
"not_started": 10,
"expired": 5,
"average_score": 78.5,
"median_score": 82,
"p25_score": 70,
"p75_score": 95,
"score_distribution": {
"90": 41,
"100": 30
},
"pass_threshold": null,
"passed": null,
"failed": null,
"question_count": 10,
"completion_rate": 82.8
},
"participants": [
{
"object": "quiz_participant",
"id": "user_abc123",
"email": "jane.doe@example.com",
"display_name": "Jane Doe",
"slack_user_id": "U01234567",
"group_name": "Engineering",
"group_names": [
"Engineering",
"Platform"
],
"group_ids": [
"group_engineering"
],
"manager_email": "manager@example.com",
"manager_name": "John Smith",
"manager_slack_user_id": "U09876543",
"status": "completed",
"score": 85,
"points": 842,
"duration_seconds": 327,
"attempt": 2,
"attempts": 3,
"total_questions": 10,
"answered_questions": 10,
"correct_answers": 8,
"incorrect_answers": 2,
"assigned_at": "2026-01-15T10:30:00.000Z",
"completed_at": "2026-01-15T11:00:00.000Z",
"delivery_instance_id": "act_abc123",
"delivery_method": "track",
"track_id": "trk_xyz789",
"track_name": "Onboarding Quiz",
"is_admin": false,
"user_id": "user_abc123",
"question_responses": [
{
"object": "question_response",
"question_id": "q_abc123",
"submitted_answer": {
"id": "<string>",
"answer": "<string>"
},
"is_correct": true,
"answered_at": "2026-02-01T14:22:00.000Z",
"submitted_answers": [
{
"id": "<string>",
"answer": "<string>"
}
]
}
],
"feedback_response": {
"object": "feedback_response",
"survey_id": "srv_abc123",
"survey_instance_id": "srvi_xyz789",
"submitted_at": "2026-02-01T14:30:00.000Z",
"responses": [
{
"question_id": "fq_abc123",
"question_text": "How would you rate this quiz?",
"question_type": "scale",
"response": 4,
"comment": "Great quiz, very informative!"
}
]
}
}
],
"delivery_instances": [
{
"object": "quiz_delivery_instance",
"id": "inst_abc123",
"total_participants": 25,
"delivery_method": "track",
"track_id": "trk_xyz789",
"track_name": "Onboarding Quiz",
"delivery_detail": "#general channel"
}
],
"has_more": true,
"url": "/v1/quizzes/quiz_abc123/report",
"next_cursor": "resp_xyz789",
"previous_cursor": "resp_abc123",
"question_analytics": [
{
"object": "question_analytics",
"id": "q_abc123",
"question": "What is the capital of France?",
"type": "multipleChoice",
"round_id": "round_xyz789",
"round_name": "Geography",
"total_answered": 120,
"total_correct": 95,
"total_incorrect": 25,
"accuracy_rate": 79.2,
"answer_breakdown": [
{
"id": "ans_a1b2c3",
"answer": "Paris",
"total_selected": 45,
"correct_selections": 45,
"incorrect_selections": 0
}
]
}
]
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}{
"error": {
"type": "invalid_request_error",
"code": "resource_not_found",
"message": "No such quiz: quiz_abc123",
"param": "id",
"doc_url": "https://docs.doozy.live/api/errors#resource_not_found"
}
}Authorizations
API key for authentication. Generate keys in the Doozy dashboard.
Path Parameters
The unique identifier of the quiz
1 - 128^[A-Za-z0-9_-]+$"quiz_abc123"
Query Parameters
Maximum number of participants to return (1-10000, default 25)
1 <= x <= 1000025
Cursor for pagination - the user ID of the last participant from the previous page
256"user_abc123"
Cursor for backward pagination - the user ID of the first participant on the previous page
256"user_xyz789"
Filter participants by status
not_started, in_progress, completed, expired "completed"
Comma-separated participant statuses. Takes precedence over status.
1not_started, in_progress, completed, expired "completed,expired"
Participant order. Score ties use points, duration, name, member ID, then delivery ID.
score_desc, score_asc, name_asc, completed_at_desc, completed_at_asc, duration_asc "score_desc"
Minimum participant score, inclusive
0 <= x <= 10080
Maximum participant score, inclusive
0 <= x <= 100100
Case-insensitive participant name or email search
1"Amara"
Filter participants by exact account group ID
1"group_engineering"
Filter results to participants from a specific track (workflow). When specified, only participants who received the quiz via this track will be included.
"wf_abc123"
Filter results to a specific instance. When specified, only participants from this scheduled activity will be included.
1"abc123"
Filter participants by assigned_at >= this exact ISO 8601 instant
"2026-01-01T00:00:00.000Z"
Filter participants by assigned_at <= this exact ISO 8601 instant
"2026-01-31T23:59:59.999Z"
Include quiz admin users in results (default false)
true, false "false"
Include participant rows. Set false for summary and analytics only.
true, false "false"
Include per-question responses for each participant (default false)
true, false "true"
Include per-question analytics with answer breakdowns (default false)
true, false "true"
Include feedback responses from post-quiz surveys (default false)
true, false "false"
Response
Quiz report with participants and analytics
Object type identifier
quiz_report "quiz_report"
Quiz ID
"quiz_abc123"
Quiz title
"Product Knowledge Assessment"
Summary statistics for the report
Show child attributes
Show child attributes
Paginated list of participants
Show child attributes
Show child attributes
Quiz delivery instances (workflows and one-off sends)
Show child attributes
Show child attributes
Whether there are more participants available beyond this page
true
The URL for accessing this report
"/v1/quizzes/quiz_abc123/report"
Cursor to fetch the next page of participants. Pass as starting_after in subsequent requests.
"resp_xyz789"
Cursor to fetch the previous page of participants. Pass as ending_before in subsequent requests.
"resp_abc123"
Per-question analytics (only included if include_question_analytics=true)
Show child attributes
Show child attributes
Was this page helpful?