Skip to content

Products attributed to the store's quizzes

GET
/v1/analytics/products
curl --request GET \
--url 'https://api.octaneai.com/v1/analytics/products?limit=50&sort=revenue&tz=UTC' \
--header 'Authorization: Bearer <token>'
limit
Limit
integer
default: 50 >= 1 <= 200
bucket
Any of:
string
Allowed values: added_from_quiz shown_bought_later bought_not_shown
sort
Sort
string
default: revenue
Allowed values: revenue units orders
from
Any of:
string format: date

First day, inclusive, in tz; 29 days before to when absent

to
Any of:
string format: date

Last day, inclusive, in tz; today when absent

tz
Tz
string
default: UTC <= 64 characters
if-none-match
Any of:
string
<= 1024 characters

Analytics for the range. ETag identifies the cached response.

Media typeapplication/json
AnalyticsProducts
object
bucket
required
Any of:
string
Allowed values: added_from_quiz shown_bought_later bought_not_shown
freshness
required
Freshness
object
as_of
required
Any of:
string format: date-time
closed_days_through
required
Closed Days Through

The last day whose numbers are settled: yesterday in the request’s timezone

string format: date
next_refresh_at
required
Any of:
string format: date-time
pending
required
Pending

True until every update behind these numbers has run once, so they may be incomplete

boolean
stale
required
Stale
boolean
today_live
required
Today Live
boolean
line_revenue
required
Any of:
Money
object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
orders_matched_by_email
required
Orders Matched By Email

Linked orders in the range matched by the email the shopper gave

integer
quiz_id
required
Any of:
string
/^quiz_[0-9a-f]{32}$/
range
required
AnalyticsRange
object
days
required
Days
integer
end
required
End

Last day of the range, inclusive, in timezone

string format: date
start
required
Start

First day of the range, inclusive, in timezone

string format: date
timezone
required
Timezone

IANA name of the timezone the days are counted in; UTC unless the request named one

string
rows
required
Rows
Array<object>
ProductRow
object
had_variants
required
Had Variants
boolean
image_url
required
Any of:
string
in_store
required
In Store
boolean
line_revenue
required
Any of:
Money
object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
orders_approx
required
Orders Approx

An estimate of the linked orders containing the product, once per order

integer
product_id
required
Product Id
string
quiz_name
required
Any of:
string
revenue_by_bucket
required
ProductBucketMoney

That revenue split by how each item reached the cart

object
added_from_quiz
required
Any of:
Money
object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
bought_not_shown
required
Any of:
Money
object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
shown_bought_later
required
Any of:
Money
object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
shown_on
required
Any of:
ProductShownOn
object
block_key
required
Any of:
string
page_key
required
Page Key
string
page_title
required
Any of:
string
times_shown
required
Times Shown

How many times the quiz showed the product, once per visit for each card that showed it

integer
title
required
Any of:
string
units
required
Units

Units of the product bought across linked orders

integer
sort
required
Sort
string
Allowed values: revenue units orders
total_products
required
Total Products

How many different products appear in linked orders in the range, within bucket when set

integer
totals_by_bucket
required
ProductBucketMoney

The revenue of every product in the range split by how it reached the cart, whatever bucket is set

object
added_from_quiz
required
Any of:
Money
object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
bought_not_shown
required
Any of:
Money
object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
shown_bought_later
required
Any of:
Money
object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
Example
{
"freshness": {
"as_of": "2026-09-07T12:00:00Z",
"closed_days_through": "2026-09-06",
"next_refresh_at": "2026-09-07T13:00:00Z",
"pending": false,
"stale": false,
"today_live": true
},
"line_revenue": {
"amount": "12.50",
"currency": "USD"
},
"orders_matched_by_email": 1,
"range": {
"days": 7,
"end": "2026-09-07",
"start": "2026-09-01",
"timezone": "UTC"
},
"rows": [
{
"had_variants": false,
"in_store": true,
"line_revenue": {
"amount": "12.50",
"currency": "USD"
},
"orders_approx": 1,
"product_id": "gid://shopify/Product/1",
"quiz_name": "Routine",
"revenue_by_bucket": {
"added_from_quiz": {
"amount": "12.50",
"currency": "USD"
},
"bought_not_shown": {
"amount": "0",
"currency": "USD"
},
"shown_bought_later": {
"amount": "0",
"currency": "USD"
}
},
"shown_on": {
"block_key": "product-abc12",
"page_key": "result",
"page_title": "Your match"
},
"times_shown": 5,
"title": "Serum",
"units": 1
}
],
"sort": "revenue",
"total_products": 1,
"totals_by_bucket": {
"added_from_quiz": {
"amount": "12.50",
"currency": "USD"
},
"bought_not_shown": {
"amount": "0",
"currency": "USD"
},
"shown_bought_later": {
"amount": "0",
"currency": "USD"
}
}
}
ETag
string
Example
"5a23d8"

If-None-Match matches the cached response; no body is sent.

ETag
string

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": [
"analytics:read"
],
"status": 403,
"title": "insufficient_scope",
"type": "https://api.octaneai.com/errors/insufficient_scope"
}

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"
}

Request limits could not be checked for the body, or the store’s details could not be read.

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": "A backing service is temporarily unavailable; retry shortly",
"request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"retry_after": 2,
"status": 503,
"title": "dependency_unavailable",
"type": "https://api.octaneai.com/errors/dependency_unavailable"
}

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"
}