Quiz completion funnel
const url = 'https://api.octaneai.com/v1/quizzes/example/analytics/funnel?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/funnel?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
Cohort sessions that finished the quiz, even past the range end.
Cohort sessions that have neither completed nor ended yet.
Views minus starts: sessions that viewed the quiz but had not answered by the end of the range.
object
Sessions that moved on from this page: reached minus dropped minus those still on it.
Sessions whose last page was this one and that ended without completing.
Sessions that opened this page at least once (one per person).
Sessions whose first arrival on this page was a jump rule.
Sessions that used the skip button on this page. A Back or Skip pressed after a long idle, once the visit was already closed as timed out, is not recorded.
Sessions that went back to the previous page from here. A Back or Skip pressed after a long idle, once the visit was already closed as timed out, is not recorded.
object
The cohort: sessions that answered their first question inside the range, each followed to its end. starts == completions + sum(sessions_dropped) + in_progress.
Sessions that opened the quiz inside the range, plus the cohort itself.
Example
{ "completions": 7, "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 }, "in_progress": 0, "not_started": 2, "pages": [ { "avg_time_on_page_ms": 5000, "dropped_share_of_starts": 12.5, "page_key": "welcome", "removed": false, "sessions_continued": 7, "sessions_dropped": 1, "sessions_reached": 8, "sessions_reached_by_jump": 0, "sessions_skipped": 0, "sessions_went_back": 0, "title": "Welcome" } ], "quiz_id": "quiz_7c9e6679742540de944be07fc1f90ae7", "range": { "days": 7, "end": "2026-09-07", "start": "2026-09-01", "timezone": "UTC" }, "starts": 8, "views": 10}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
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
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": [ "quizzes: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
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
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
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
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
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"}