---
title: "Quiz page-to-page journeys"
method: GET
path: "/v1/quizzes/{quiz_id}/analytics/paths"
tags: ["analytics"]
---

# Quiz page-to-page journeys

`GET /v1/quizzes/{quiz_id}/analytics/paths`

## Request

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

## Path parameters

- `quiz_id` string, required

## Query parameters

- `cohort` 'all' | 'finished' | 'left'
- `from` string, date, nullable: First day, inclusive, in tz; 29 days before `to` when absent
- `to` string, date, nullable: Last day, inclusive, in tz; today when absent
- `tz` string
- `channel` string, nullable
- `device` string, nullable
- `new_returning` string, nullable
- `country` string, nullable

## Headers

- `if-none-match` string, nullable

## Response `200`

Analytics for the range. ETag identifies the cached response.

- AnalyticsPaths
  - `quiz_id` string, required
  - `range` AnalyticsRange, required
    - `start` string, date, required: First day of the range, inclusive, in timezone
    - `end` string, date, required: Last day of the range, inclusive, in timezone
    - `days` integer, required
    - `timezone` string, required: IANA name of the timezone the days are counted in; UTC unless the request named one
  - `filters` AnalyticsFilters, required
    - `channel` string, nullable, required: The channel filter applied: direct | organic_search | paid_search | organic_social | paid_social | email | sms | affiliate | display | paid_other | referral | ai_assistant | other | shared_results; null for all
    - `device` string, nullable, required: The device filter applied: mobile | tablet | desktop; null for all
    - `new_returning` string, nullable, required: The visitor filter applied: new | returning; null for all
    - `country` string, nullable, required: The country filter applied, ISO 3166-1 alpha-2; null for all
  - `cohort` 'all' | 'finished' | 'left', required: Which visits are counted: all | finished (completed the quiz) | left (ended without completing)
  - `freshness` Freshness, required
    - `as_of` string, date-time, nullable, required: When the numbers for past hours were last brought up to date, UTC ISO 8601; today's visits and orders are always counted live; null before the first update
    - `next_refresh_at` string, date-time, nullable, required: When the next update is due, UTC ISO 8601; null when none is scheduled or the numbers are read live
    - `stale` boolean, required
    - `pending` boolean, required: True until every update behind these numbers has run once, so they may be incomplete
    - `closed_days_through` string, date, required: The last day whose numbers are settled: yesterday in the request's timezone
    - `today_live` boolean, required
  - `sessions` integer, required: Visits counted in this view: the cohort's visits that opened at least one page in the range
  - `data_start` string, date, nullable, required: The first day the store has analytics numbers: its first recorded visit or order, or the day analytics was last reset; null before any
  - `nodes` PathNode[], required
    - `page_key` string, required
    - `title` string, required
    - `removed` boolean, required: True for a page the published version no longer has
    - `entries` integer, required: How many times shoppers opened this page
    - `entries_by_jump` integer, required: How many of those arrivals came from a jump rule rather than the page before
    - `exits_closed` integer, required: Visits that ended on this page because the shopper closed the quiz
    - `exits_timed_out` integer, required: Visits that ended on this page because the shopper stopped without closing and it timed out
    - `exits_restarted` integer, required: Visits that ended on this page because the shopper started the quiz over
    - `finished_here` integer, required: Visits that finished the quiz on this page
    - `still_here` integer, required: Visits still on this page when the numbers were read, not counted as an exit
    - `median_time_on_page_ms` number, nullable, required: Median milliseconds shoppers spent on this page; null without a timed visit
  - `edges` PathEdge[], required: The observed moves between pages: the 50 busiest and every jump; the rest are in other_paths
    - `from_page_key` string, required
    - `to_page_key` string, required
    - `cause` 'sequential' | 'jump' | 'back' | 'restart', required: How the destination was entered: sequential (the next page) | jump (a jump rule) | back | restart
    - `jump_rule_key` string, nullable, required: The jump rule that fired, unknown for one recorded without a key; null unless cause is jump
    - `moves` integer, required: How many times shoppers made this move; a shopper who made it twice counts twice
    - `sessions_moved` integer, required: How many different visits made this move at least once
  - `other_paths` OtherPaths, required
    - `routes` integer, required: How many less-travelled routes are summed here instead of listed
    - `moves` integer, required: Their moves added up, so the listed edges plus these cover every move
  - `rules` PathRule[], required: Every jump rule of the published version, fired or not, and any other seen in the range
    - `jump_rule_key` string, required
    - `source_page_key` string, nullable, required: The page the rule lives on; null for a rule gone from the published version
    - `fired` integer, required: How many arrivals the rule caused in the range
    - `source_entries` integer, required: Arrivals on the rule's page in the range, the denominator for fired
  - `visibility_skips` PathVisibilitySkip[], required
    - `page_key` string, required
    - `title` string, required
    - `removed` boolean, required: True for a page the published version no longer has
    - `times_hidden` integer, required: How many times visibility rules hid this page as shoppers moved forward past it; jumps are not counted

## Other responses

- `304`: If-None-Match matches the cached response; no body is sent.
- `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.
- `503`: Request limits could not be checked for the body, or the store's details could not be read.
- `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)
