Skip to content

Get a quiz

GET
/v1/quizzes/{quiz_id}
curl --request GET \
--url https://api.octaneai.com/v1/quizzes/example \
--header 'Authorization: Bearer <token>'
quiz_id
required
Quiz Id
string

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.

Media typeapplication/json
QuizDetail
object
archived
required
Archived
boolean
created_at
required
Created At
string format: date-time
id
required
Id
string
/^quiz_[0-9a-f]{32}$/
latest_version
Any of:
VersionSummary
object
created_at
required
Created At
string format: date-time
id
required
Id
string
/^ver_[0-9a-f]{32}$/
label
required
Any of:
string
number
required
Number

The version’s number as the editor shows it (v14)

integer
page_count
required
Page Count

How many pages the version has

integer
published
required
Published

Whether this is the version shoppers see now

boolean
quiz_id
required
Quiz Id
string
/^quiz_[0-9a-f]{32}$/
name
required
Name
string
page_count
required
Page Count

How many pages the quiz’s draft has

integer
published_version
required
Any of:
string
/^ver_[0-9a-f]{32}$/
status
required
AppStatus

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.

string
Allowed values: draft published deleted
structure
required
QuizStructure
object
dimensions
Dimensions

The scoring dimensions, in declared order

Array<object>
default:
StructureDimension
object
dimension_id
required
Dimension Id

The dimension

string
label
required
Label

Its label

string
page_count
required
Page Count

How many pages the quiz’s draft has

integer
pages
Pages

In quiz order, the first 50

Array<object>
default:
StructurePage
object
component_count
required
Component Count

How many content components the page has

integer
components
Components

Content components in stored order, the first 40; layout, buttons and links are left out

Array<object>
default:
StructureComponent
object
badges
Any of:
Array<string>
component_key
required
Component Key

The component

string
consent_required
Any of:
boolean
kind
required
Kind

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)

string
label
required
Label

The authored label or copy without markup; a copy block is cut at 500 characters

string
option_count
Any of:
integer
options
Any of:
Array<object>
StructureOption
object
label
required
Label

Its label

string
option_id
Any of:
string
scores
Any of:
Array<string>
product_source
Any of:
string
range
Any of:
StructureRange
object
max
Any of:
number
min
Any of:
number
step
Any of:
number
required
Any of:
boolean
type
required
Type

What a person calls this kind of component

string
visible_if
Any of:
object
key
additional properties
any
jumps
Jumps

The page’s jump rules in stored order

Array<object>
default:
StructureJump
object
condition
Any of:
object
key
additional properties
any
rule_key
Any of:
string
target_page_key
Target Page Key

The stored target page key

page_key
required
Page Key

The page

string
redirect
Any of:
StructureRedirect
object
answer_values
required
Answer Values

Whether a choice {{token}} fills with the picked option values, joined by a comma, instead of the text shoppers see

boolean
delay_seconds
required
Delay Seconds

Whole seconds the page shows before the shopper is sent

integer
new_tab
required
New Tab

Whether the link opens in a new tab

boolean
url
required
Url

The link shoppers are sent to; a {{token}} in it is filled from their answers

string
role
required
PageRole

What the page is for: start (the first page), question, loading (a loading visual), results (it shows products)

string
Allowed values: start question loading results
title
Any of:
string
visible_if
Any of:
object
key
additional properties
any
updated_at
required
Updated At
string format: date-time
urls
required
Urls

Self: this quiz on the API | versions: its versions on the API | dashboard: the quiz in the editor

object
key
additional properties
string
Example
{
"archived": false,
"created_at": "2026-09-01T12:00:00Z",
"id": "quiz_7c9e6679742540de944be07fc1f90ae7",
"name": "Find your routine",
"page_count": 3,
"status": "draft",
"structure": {
"dimensions": [
{
"dimension_id": "dry",
"label": "Dry skin"
},
{
"dimension_id": "oily",
"label": "Oily skin"
}
],
"page_count": 3,
"pages": [
{
"component_count": 0,
"page_key": "welcome",
"role": "start",
"title": "Find your routine"
},
{
"component_count": 2,
"components": [
{
"component_key": "multi_choice-k3x9q",
"kind": "choice_single",
"label": "How does your skin feel by noon?",
"option_count": 2,
"options": [
{
"label": "Tight",
"option_id": "b1f4d2e0-6c3a-4f0e-9b2a-1d5c7e8f9a01",
"scores": [
"dry"
]
},
{
"label": "Shiny",
"option_id": "c2a5e3f1-7d4b-4a1f-8c3b-2e6d8f9a0b12",
"scores": [
"oily"
]
}
],
"required": true,
"type": "Multiple Choice"
},
{
"component_key": "sliders-p8m2t",
"kind": "slider",
"label": "How many products do you use?",
"range": {
"max": 10,
"min": 1,
"step": 1
},
"required": true,
"type": "Slider"
}
],
"jumps": [
{
"condition": {
"=": [
{
"var": "multi_choice-k3x9q"
},
"tight"
]
},
"rule_key": "jump_1",
"target_page_key": "results"
}
],
"page_key": "skin",
"role": "question",
"title": "Your skin"
},
{
"component_count": 2,
"components": [
{
"component_key": "heading-v7r1c",
"kind": "copy",
"label": "Your routine",
"type": "Heading"
},
{
"component_key": "shopify_product_block-a4n8s",
"kind": "products",
"label": "Products",
"product_source": "points",
"type": "Products"
}
],
"page_key": "results",
"role": "results",
"title": "Your routine"
}
]
},
"updated_at": "2026-09-01T12:00:00Z",
"urls": {
"dashboard": "https://editor.octaneai.com/bot_123/editor/quiz_7c9e6679742540de944be07fc1f90ae7",
"self": "https://api.octaneai.com/v1/quizzes/quiz_7c9e6679742540de944be07fc1f90ae7",
"versions": "https://api.octaneai.com/v1/quizzes/quiz_7c9e6679742540de944be07fc1f90ae7/versions"
}
}

The key is missing, malformed, revoked or expired.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "The API key is missing, malformed, revoked or expired",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 401,
"title": "invalid_api_key",
"type": "https://api.octaneai.com/errors/invalid_api_key"
}
WWW-Authenticate
string
Example
Bearer

The store’s plan has no API access, or the key lacks the scope.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Examples
{
"detail": "The API key does not carry the scope this route needs",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"required": [
"quizzes:read"
],
"status": 403,
"title": "insufficient_scope",
"type": "https://api.octaneai.com/errors/insufficient_scope"
}

Not found

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "Not found",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 404,
"title": "not_found",
"type": "https://api.octaneai.com/errors/not_found"
}

A request parameter is invalid.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "A request parameter is invalid.",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 422,
"title": "validation_error",
"type": "https://api.octaneai.com/errors/validation_error"
}

The key’s or the store’s bucket is full; Retry-After says when to try again.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "Too many requests",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"retry_after": 1,
"status": 429,
"title": "rate_limited",
"type": "https://api.octaneai.com/errors/rate_limited"
}

The request timed out.

Media typeapplication/problem+json
Problem

The body of every non-2xx response.

object
detail
required
Detail

What went wrong, for people

string
errors
Any of:
Array<object>
FieldError
object
field
required
Field

The input that failed, as a dotted path (body.label, query.from)

string
message
required
Message

Why it failed

string
export
Any of:
object
key
additional properties
any
feature
Any of:
Feature
string
Allowed values: merchant_api quiz_ab_testing ai_model_switch ai_advanced_model analytics_paths people_filter analytics_funnel analytics_answers quiz_shopify_customer_metafields custom_css_classes shopify_metafields_plan
plan
Any of:
PlanTier

Declared lowest first: a tier includes what every tier before it includes.

string
Allowed values: none basic plus enterprise
request_id
required
Request Id

The same value as the Request-Id header; quote it to support

string
required
Any of:
Array<string>
retry_after
Any of:
integer
status
required
Status

The HTTP status of the response

integer
title
required
Title

The machine-readable error code; the Errors guide lists every one

string
type
required
Type

A stable URI naming the error, on this API’s public host

string
Example
{
"detail": "The request timed out.",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": 504,
"title": "timeout",
"type": "https://api.octaneai.com/errors/timeout"
}