Quiz page-to-page journeys
const url = 'https://api.octaneai.com/v1/quizzes/example/analytics/paths?cohort=all&tz=UTC';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://api.octaneai.com/v1/quizzes/example/analytics/paths?cohort=all&tz=UTC' \ --header 'Authorization: Bearer <token>'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Query Parameters
Section titled “Query Parameters”Header Parameters
Section titled “Header Parameters”Responses
Section titled “Responses”Analytics for the range. ETag identifies the cached response.
object
Which visits are counted: all | finished (completed the quiz) | left (ended without completing)
The observed moves between pages: the 50 busiest and every jump; the rest are in other_paths
object
How the destination was entered: sequential (the next page) | jump (a jump rule) | back | restart
How many times shoppers made this move; a shopper who made it twice counts twice
How many different visits made this move at least once
object
The last day whose numbers are settled: yesterday in the request’s timezone
True until every update behind these numbers has run once, so they may be incomplete
object
How many times shoppers opened this page
How many of those arrivals came from a jump rule rather than the page before
Visits that ended on this page because the shopper closed the quiz
Visits that ended on this page because the shopper started the quiz over
Visits that ended on this page because the shopper stopped without closing and it timed out
Visits that finished the quiz on this page
True for a page the published version no longer has
Visits still on this page when the numbers were read, not counted as an exit
object
Their moves added up, so the listed edges plus these cover every move
How many less-travelled routes are summed here instead of listed
object
Last day of the range, inclusive, in timezone
First day of the range, inclusive, in timezone
IANA name of the timezone the days are counted in; UTC unless the request named one
Every jump rule of the published version, fired or not, and any other seen in the range
Visits counted in this view: the cohort’s visits that opened at least one page in the range
object
True for a page the published version no longer has
How many times visibility rules hid this page as shoppers moved forward past it; jumps are not counted
Example
{ "cohort": "all", "data_start": "2026-09-01", "edges": [ { "cause": "jump", "from_page_key": "welcome", "jump_rule_key": "jr_1", "moves": 3, "sessions_moved": 3, "to_page_key": "gone" }, { "cause": "restart", "from_page_key": "welcome", "moves": 2, "sessions_moved": 2, "to_page_key": "welcome" } ], "filters": {}, "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 }, "nodes": [ { "entries": 10, "entries_by_jump": 1, "exits_closed": 1, "exits_restarted": 2, "exits_timed_out": 1, "finished_here": 0, "median_time_on_page_ms": 5000, "page_key": "welcome", "removed": false, "still_here": 1, "title": "Welcome" }, { "entries": 3, "entries_by_jump": 3, "exits_closed": 0, "exits_restarted": 0, "exits_timed_out": 0, "finished_here": 3, "page_key": "gone", "removed": true, "still_here": 0, "title": "Page removed" } ], "other_paths": { "moves": 1, "routes": 1 }, "quiz_id": "quiz_7c9e6679742540de944be07fc1f90ae7", "range": { "days": 7, "end": "2026-09-07", "start": "2026-09-01", "timezone": "UTC" }, "rules": [ { "fired": 3, "jump_rule_key": "jr_1", "source_entries": 10, "source_page_key": "welcome" } ], "sessions": 8, "visibility_skips": [ { "page_key": "skin", "removed": false, "times_hidden": 3, "title": "Skin" } ]}Headers
Section titled “Headers”Example
"5a23d8"If-None-Match matches the cached response; no body is sent.
Headers
Section titled “Headers”The key is missing, malformed, revoked or expired.
The body of every non-2xx response.
object
What went wrong, for people
object
The input that failed, as a dotted path (body.label, query.from)
Why it failed
The same value as the Request-Id header; quote it to support
The HTTP status of the response
The machine-readable error code; the Errors guide lists every one
A stable URI naming the error, on this API’s public host
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"}Headers
Section titled “Headers”Example
BearerThe store’s plan has no API access, or the key lacks the scope.
The body of every non-2xx response.
object
What went wrong, for people
object
The input that failed, as a dotted path (body.label, query.from)
Why it failed
The same value as the Request-Id header; quote it to support
The HTTP status of the response
The machine-readable error code; the Errors guide lists every one
A stable URI naming the error, on this API’s public host
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"}{ "detail": "The merchant API is available on the Plus and Enterprise plans", "request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "status": 403, "title": "plan_required", "type": "https://api.octaneai.com/errors/plan_required"}Not found
The body of every non-2xx response.
object
What went wrong, for people
object
The input that failed, as a dotted path (body.label, query.from)
Why it failed
The same value as the Request-Id header; quote it to support
The HTTP status of the response
The machine-readable error code; the Errors guide lists every one
A stable URI naming the error, on this API’s public host
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.
The body of every non-2xx response.
object
What went wrong, for people
object
The input that failed, as a dotted path (body.label, query.from)
Why it failed
The same value as the Request-Id header; quote it to support
The HTTP status of the response
The machine-readable error code; the Errors guide lists every one
A stable URI naming the error, on this API’s public host
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.
The body of every non-2xx response.
object
What went wrong, for people
object
The input that failed, as a dotted path (body.label, query.from)
Why it failed
The same value as the Request-Id header; quote it to support
The HTTP status of the response
The machine-readable error code; the Errors guide lists every one
A stable URI naming the error, on this API’s public host
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.
The body of every non-2xx response.
object
What went wrong, for people
object
The input that failed, as a dotted path (body.label, query.from)
Why it failed
The same value as the Request-Id header; quote it to support
The HTTP status of the response
The machine-readable error code; the Errors guide lists every one
A stable URI naming the error, on this API’s public host
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"}{ "detail": "Request limits cannot be checked right now; retry shortly", "request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "retry_after": 2, "status": 503, "title": "limiter_unavailable", "type": "https://api.octaneai.com/errors/limiter_unavailable"}The request timed out.
The body of every non-2xx response.
object
What went wrong, for people
object
The input that failed, as a dotted path (body.label, query.from)
Why it failed
The same value as the Request-Id header; quote it to support
The HTTP status of the response
The machine-readable error code; the Errors guide lists every one
A stable URI naming the error, on this API’s public host
Example
{ "detail": "The request timed out.", "request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7", "status": 504, "title": "timeout", "type": "https://api.octaneai.com/errors/timeout"}