---
title: "Get a quiz"
method: GET
path: "/v1/quizzes/{quiz_id}"
tags: ["quizzes"]
---

# Get a quiz

`GET /v1/quizzes/{quiz_id}`

## Request

- Base URL: `https://api.octaneai.com`
- URL: `https://api.octaneai.com/v1/quizzes/{quiz_id}`
- Auth: HTTP bearer

## Path parameters

- `quiz_id` string, required

## Response `200`

The quiz summary and its structure: pages in order with their role, content components, rules and jumps, and the scoring dimensions. Never the quiz document; null and empty fields are left out.

- QuizDetail
  - `id` string, required
  - `kind` 'quiz' | 'popup', required: What a stored app is: a quiz the store embeds, or a popup the store shows over its pages. One spelling everywhere: the ``phoenix.apps.kind`` column, the wire ``kind`` field, the TS mirror.
  - `name` string, required
  - `status` 'draft' | 'published' | 'deleted', required: Publish-lifecycle status for an app. DRAFT: editable; not served to the storefront embed. PUBLISHED: a version is live; the embed serves the published snapshot. DELETED: soft-deleted; hidden from the dashboard list and the embed, but the row (pages, versions) is retained for recoverability. The column is a plain VARCHAR (native_enum=False), so this value needs no migration.
  - `archived` boolean, required
  - `published_version` string, nullable, required: The version shoppers see; null when none is published
  - `page_count` integer, required: How many pages the quiz's draft has
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `urls` object, required: self: this quiz on the API | versions: its versions on the API | dashboard: the quiz in the editor
  - `latest_version` VersionSummary
    - `id` string, required
    - `quiz_id` string, required
    - `number` integer, required: The version's number as the editor shows it (v14)
    - `label` string, nullable, required
    - `page_count` integer, required: How many pages the version has
    - `published` boolean, required: Whether this is the version shoppers see now
    - `created_at` string, date-time, required
  - `structure` QuizStructure, required
    - `page_count` integer, required: How many pages the quiz's draft has
    - `pages` StructurePage[]: In quiz order, the first 50
      - `page_key` string, required: The page
      - `title` string, nullable: Its title
      - `role` 'start' | 'question' | 'loading' | 'results', required: What a page is for, derived from what it holds (App.page_role): a loading visual, products, the first page in order, else a question page.
      - `visible_if` union: The authored rule, as stored
        - object
        - boolean
      - `component_count` integer, required: How many content components the page has
      - `components` StructureComponent[]: Content components in stored order, the first 40; layout, buttons and links are left out
        - `component_key` string, required: The component
        - `type` string, required: What a person calls this kind of component
        - `kind` string, required: What the component means to a reader: choice_single | choice_multi | choice_slider | slider | number | text | email | phone | date | formula | products | copy (a heading or a text block, whose label is its text) | other (an image, video, HTML block or any other content)
        - `label` string, required: The authored label or copy without markup; a copy block is cut at 500 characters
        - `required` boolean, nullable: Present on a question the shopper cannot leave empty
        - `consent_required` boolean, nullable: The marketing consent box under this input must be ticked before the shopper can continue
        - `options` StructureOption[], nullable: Choice questions only, every option
          - `option_id` string, nullable: The option
          - `label` string, required: Its label
          - `scores` string[], nullable: The scoring dimensions this option adds points to
        - `option_count` integer, nullable: Choice questions only: how many options the question has
        - `range` StructureRange
          - `min` number, nullable: The lowest value
          - `max` number, nullable: The highest value
          - `step` number, nullable: The step between values
        - `product_source` string, nullable: Product blocks only: where the products come from: manual | rankings | points | smart
        - `badges` string[], nullable: Product blocks only: the texts of the badges on its cards, by card position then by product
        - `visible_if` union: The authored rule, as stored
          - object
          - boolean
      - `jumps` StructureJump[]: The page's jump rules in stored order
        - `rule_key` string, nullable: The jump rule
        - `target_page_key` unknown
        - `condition` union: Absent on a jump that always applies
          - object
          - boolean
      - `redirect` StructureRedirect
        - `url` string, required: The link shoppers are sent to; a `{{token}}` in it is filled from their answers
        - `delay_seconds` integer, required: Whole seconds the page shows before the shopper is sent
        - `new_tab` boolean, required: Whether the link opens in a new tab
        - `answer_values` boolean, required: Whether a choice `{{token}}` fills with the picked option values, joined by a comma, instead of the text shoppers see
    - `dimensions` StructureDimension[]: The scoring dimensions, in declared order
      - `dimension_id` string, required: The dimension
      - `label` string, required: Its label

## Other responses

- `401`: The key is missing, malformed, revoked or expired.
- `403`: The store's plan has no API access, or the key lacks the scope.
- `404`: Not found
- `422`: A request parameter is invalid.
- `429`: The key's or the store's bucket is full; Retry-After says when to try again.
- `504`: The request timed out.

---

[API](https://skmtc.dev/octaneai/apis/octane-ai-merchant-api.md) - [All operations](https://skmtc.dev/octaneai/apis/octane-ai-merchant-api/llms.txt) - [OpenAPI document](https://skmtc.dev/octaneai/apis/octane-ai-merchant-api/revisions/dc2d1aa2b7c6?raw)
