Skip to content

Get a shopper profile

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

The shopper’s identities, latest answers and results, sessions, and linked orders.

Media typeapplication/json
ProfileDetail
object
completed_count
required
Completed Count

How many of them completed

integer
first_seen_at
required
Any of:
string format: date-time
id
required
Id

The profile

string
/^prof_[0-9a-f]{32}$/
identities
required
Identities

The shopper’s emails, phones and Shopify customer id; empty on a removed profile

Array<object>
ProfileIdentity
object
consent
required
Consent

True only when the shopper ticked the marketing-consent box on their newest run that showed it; anything else, including a skipped page or a quiz without the box, is false

boolean
first_seen_at
required
Any of:
string format: date-time
kind
required
Kind

Email | phone | shopify_customer_id. A new kind may be added, so skip one you do not know. shopify_customer_id arrives when the shopper takes a quiz logged in to the store or places an order linked to a quiz session; its consent is always false

string
last_seen_at
required
Any of:
string format: date-time
value
required
Value

The email (lowercase), the phone (E.164), or the Shopify customer as a gid://shopify/Customer/ GID

string
last_order_at
required
Any of:
string format: date-time
last_seen_at
required
Last Seen At

The latest moment the shopper was seen

string format: date-time
latest_results
required
Latest Results

The latest completed result of each quiz

Array<object>
ProfileResult
object
answers
required
Answers

Its answers

Array<object>
ProfileAnswer
object
component_key
required
Component Key

The question

string
image_urls
required
Image Urls

For an image choice: one entry per label in values, the option’s image or null

Array
kind
required
Kind

What kind of answer this is

string
Allowed values: choice image text email phone number date other
page_key
required
Page Key

The page the question is on

string
page_title
required
Any of:
string
question
required
Question

The question as the quiz labels it

string
removed
required
Removed

True when the question is no longer in the quiz

boolean
value
required
Value

The answer as stored: an option id or the typed text, a JSON number for a number, a {date, time} object for a date

values
required
Values

The answer as the shopper saw it: option labels, or the typed value as text

Array<string>
completed_at
required
Completed At

When it completed

string format: date-time
formulas
required
Formulas

Its formula values

Array<object>
ProfileFormula
object
component_key
required
Component Key

The formula or value table

string
kind
Kind

A formula’s number, or the value a value table resolved

string
default: formula
Allowed values: formula table
label
required
Label

Its label

string
page_key
required
Page Key

The page the formula or value table is on

string
value
required
Any of:
number
value_text
Any of:
string
points
required
Points

Its points per dimension

Array<object>
ProfilePoints
object
dimension_id
required
Dimension Id

The points dimension

string
name
required
Name

Its name

string
total
required
Total

The points the session scored on it

number
points_total
required
Any of:
number
quiz_id
required
Quiz Id

The quiz

string
/^quiz_[0-9a-f]{32}$/
quiz_name
required
Quiz Name

Its name

string
result_page
required
Any of:
ProfileResultPage
object
page_count
required
Any of:
integer
page_key
required
Page Key

The result page

string
position
required
Any of:
integer
shown_products
required
Shown Products

The products it showed

Array<object>
ProfileShownProduct
object
block_key
required
Block Key

The product block that showed it

string
currency
required
Any of:
string
handle
required
Any of:
string
image
required
Any of:
string
price
required
Any of:
number
product_id
required
Product Id

The product’s Shopify GID

string
title
required
Any of:
string
variant_id
required
Any of:
string
variant_title
required
Any of:
string
title
required
Any of:
string
results_url
required
Any of:
string
session_id
required
Session Id

The latest completed session of this quiz

string
/^sess_[0-9a-f]{32}$/
started_at
required
Started At

When that session opened

string format: date-time
version_number
required
Any of:
integer
winner
required
Any of:
ProfilePoints
object
dimension_id
required
Dimension Id

The points dimension

string
name
required
Name

Its name

string
total
required
Total

The points the session scored on it

number
orders
required
Orders

Orders linked to the shopper’s quiz sessions

Array<object>
ProfileOrder
object
amount
required
Money

Its total in the store’s currency

object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
created_at
required
Created At

When the order was placed

string format: date-time
matched_tier
required
Matched Tier

How the order was tied to the quiz session: line_item_property | cart_attribute | pixel_claim | email. The first two: the quiz put the product in the cart; pixel_claim: the checkout pixel named the session; email: the order’s email belongs to the shopper

string
order_id
required
Order Id

The Shopify order id

string
order_name
required
Any of:
string
quiz_id
required
Any of:
string
/^quiz_[0-9a-f]{32}$/
quiz_name
required
Any of:
string
session_id
required
Any of:
string
/^sess_[0-9a-f]{32}$/
orders_count
required
Orders Count

Orders linked to the shopper’s quiz sessions

integer
quizzes_taken_count
required
Quizzes Taken Count

How many different quizzes the shopper took

integer
removed
required
Removed

True once the shopper’s data was erased on a data-deletion request: no identities or contact values remain

boolean
removed_at
required
Any of:
string format: date-time
returning
required
Any of:
boolean
returning_count
required
Any of:
integer
sessions
required
Sessions

The shopper’s sessions, newest first, at most 200

Array<object>
ProfileSession
object
channel
required
Channel

How the shopper arrived: direct | organic_search | paid_search | organic_social | paid_social | email | sms | affiliate | display | paid_other | referral | ai_assistant | other | shared_results

string
completed_at
required
Any of:
string format: date-time
country
required
Any of:
string
device_class
required
Device Class

Mobile | tablet | desktop

string
ended_at
required
Any of:
string format: date-time
last_open_channel
required
Any of:
string
last_opened_at
required
Any of:
string format: date-time
last_page_key
required
Any of:
string
last_page_position
required
Any of:
integer
last_page_title
required
Any of:
string
opens
required
Opens

Times this session’s shared result was opened

integer
order
required
Any of:
ProfileSessionOrder
object
amount
required
Money

Its total in the store’s currency

object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
created_at
required
Created At

When the order was placed

string format: date-time
matched_tier
required
Matched Tier

How the order was tied to the quiz session: line_item_property | cart_attribute | pixel_claim | email. The first two: the quiz put the product in the cart; pixel_claim: the checkout pixel named the session; email: the order’s email belongs to the shopper

string
minutes_after
required
Any of:
integer
order_id
required
Order Id

The Shopify order id

string
order_name
required
Any of:
string
page_count
required
Any of:
integer
pages_visited
required
Pages Visited

How many pages the shopper visited in the session

integer
quiz_id
required
Quiz Id

Its quiz

string
/^quiz_[0-9a-f]{32}$/
quiz_name
required
Quiz Name

The quiz’s name

string
results_url
required
Any of:
string
returning
required
Any of:
boolean
session_id
required
Session Id

The session

string
/^sess_[0-9a-f]{32}$/
source_kind
required
Any of:
string
source_session_id
required
Any of:
string
/^sess_[0-9a-f]{32}$/
started_at
required
Started At

When it opened

string format: date-time
status
required
Status

Completed | in_progress | left

string
Allowed values: completed in_progress left
version_number
required
Any of:
integer
sessions_count
required
Sessions Count

How many quiz sessions the shopper had

integer
share_orders
required
Share Orders

Orders bought through this shopper’s shared results; never part of orders, orders_count or spent

Array<object>
ProfileShareOrder
object
amount
required
Money

Its total in the store’s currency

object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
buyer_person_id
required
Any of:
string
/^prof_[0-9a-f]{32}$/
created_at
required
Created At

When the order was placed

string format: date-time
matched_tier
required
Matched Tier

How the order was tied to the quiz session: line_item_property | cart_attribute | pixel_claim | email. The first two: the quiz put the product in the cart; pixel_claim: the checkout pixel named the session; email: the order’s email belongs to the shopper

string
order_id
required
Order Id

The Shopify order id

string
order_name
required
Any of:
string
quiz_id
required
Any of:
string
/^quiz_[0-9a-f]{32}$/
quiz_name
required
Any of:
string
session_id
required
Any of:
string
/^sess_[0-9a-f]{32}$/
via
required
Via

Retake: bought in a session started from this shopper’s shared result (session_id is that session’s); shared_page: bought straight from the shared results page (session_id is the shopper’s own)

string
Allowed values: retake shared_page
spent
required
Any of:
Money
object
amount
required
Amount

A decimal string, as “79.97”

string
currency
required
Currency

ISO 4217 code

string
Example
{
"completed_count": 1,
"first_seen_at": "2026-09-01T12:00:00Z",
"id": "prof_50e1b7e458f14dfca7a2a5b971af2821",
"identities": [
{
"consent": true,
"first_seen_at": "2026-09-01T12:00:00Z",
"kind": "email",
"last_seen_at": "2026-09-01T12:00:00Z",
"value": "shopper@example.com"
},
{
"consent": false,
"first_seen_at": "2026-09-01T12:00:00Z",
"kind": "phone",
"value": "+14155552671"
},
{
"consent": false,
"first_seen_at": "2026-09-01T12:00:00Z",
"kind": "shopify_customer_id",
"last_seen_at": "2026-09-01T12:00:00Z",
"value": "gid://shopify/Customer/7208153301032"
}
],
"last_order_at": "2026-09-01T12:40:00Z",
"last_seen_at": "2026-09-01T12:00:00Z",
"latest_results": [
{
"answers": [
{
"component_key": "image_choice-48su5",
"image_urls": [
"https://cdn.shopify.com/s/files/1/0001/skin-dry.jpg"
],
"kind": "image",
"page_key": "skin",
"page_title": "Your skin",
"question": "Skin type?",
"removed": false,
"value": "dry",
"values": [
"Dry"
]
},
{
"component_key": "number_input-re853",
"image_urls": [],
"kind": "number",
"page_key": "skin",
"page_title": "Your skin",
"question": "Your age",
"removed": false,
"value": 42,
"values": [
"42"
]
},
{
"component_key": "email_input-abc12",
"image_urls": [],
"kind": "email",
"page_key": "contact",
"page_title": "Stay in touch",
"question": "Email",
"removed": false,
"value": "shopper@example.com",
"values": [
"shopper@example.com"
]
}
],
"completed_at": "2026-09-01T12:04:00Z",
"formulas": [
{
"component_key": "formula-tidtk",
"kind": "formula",
"label": "Hydration score",
"page_key": "result",
"value": 72
},
{
"component_key": "value_table-k3x9q",
"kind": "table",
"label": "Shade",
"page_key": "result",
"value_text": "Honey 11"
}
],
"points": [
{
"dimension_id": "dry",
"name": "Dry",
"total": 14
},
{
"dimension_id": "oily",
"name": "Oily",
"total": 6
}
],
"points_total": 20,
"quiz_id": "quiz_7c9e6679742540de944be07fc1f90ae7",
"quiz_name": "Find your routine",
"result_page": {
"page_count": 3,
"page_key": "result",
"position": 3,
"shown_products": [
{
"block_key": "products-k3x9q",
"currency": "USD",
"handle": "hydrating-serum",
"image": "https://cdn.shopify.com/s/files/1/0001/serum.jpg",
"price": 39,
"product_id": "gid://shopify/Product/8692896989320",
"title": "Hydrating Serum",
"variant_id": "gid://shopify/ProductVariant/40926435967056",
"variant_title": "30 ml"
}
],
"title": "Your match"
},
"results_url": "https://shop.example.com/pages/find-your-routine#pqs=sess_9b2d4a5e6f7a4b8c9d0e1f2a3b4c5d6e",
"session_id": "sess_9b2d4a5e6f7a4b8c9d0e1f2a3b4c5d6e",
"started_at": "2026-09-01T12:00:00Z",
"version_number": 2,
"winner": {
"dimension_id": "dry",
"name": "Dry",
"total": 14
}
}
],
"orders": [
{
"amount": {
"amount": "79.97",
"currency": "USD"
},
"created_at": "2026-09-01T12:40:00Z",
"matched_tier": "line_item_property",
"order_id": "5820135686408",
"order_name": "#1042",
"quiz_id": "quiz_7c9e6679742540de944be07fc1f90ae7",
"quiz_name": "Find your routine",
"session_id": "sess_9b2d4a5e6f7a4b8c9d0e1f2a3b4c5d6e"
}
],
"orders_count": 1,
"quizzes_taken_count": 1,
"removed": false,
"returning": false,
"returning_count": 0,
"sessions": [
{
"channel": "email",
"completed_at": "2026-09-01T12:04:00Z",
"country": "US",
"device_class": "mobile",
"ended_at": "2026-09-01T12:04:00Z",
"last_open_channel": "organic_social",
"last_opened_at": "2026-09-02T09:15:00Z",
"last_page_key": "result",
"last_page_position": 3,
"last_page_title": "Your match",
"opens": 2,
"order": {
"amount": {
"amount": "79.97",
"currency": "USD"
},
"created_at": "2026-09-01T12:40:00Z",
"matched_tier": "line_item_property",
"minutes_after": 36,
"order_id": "5820135686408",
"order_name": "#1042"
},
"page_count": 3,
"pages_visited": 3,
"quiz_id": "quiz_7c9e6679742540de944be07fc1f90ae7",
"quiz_name": "Find your routine",
"results_url": "https://shop.example.com/pages/find-your-routine#pqs=sess_9b2d4a5e6f7a4b8c9d0e1f2a3b4c5d6e",
"returning": false,
"session_id": "sess_9b2d4a5e6f7a4b8c9d0e1f2a3b4c5d6e",
"started_at": "2026-09-01T12:00:00Z",
"status": "completed",
"version_number": 2
}
],
"sessions_count": 1,
"share_orders": [
{
"amount": {
"amount": "54.00",
"currency": "USD"
},
"buyer_person_id": "prof_6a1f0c9d2e3b4a5c8d7e6f5a4b3c2d1e",
"created_at": "2026-09-02T10:02:00Z",
"matched_tier": "cart_attribute",
"order_id": "5820135686501",
"order_name": "#1057",
"quiz_id": "quiz_7c9e6679742540de944be07fc1f90ae7",
"quiz_name": "Find your routine",
"session_id": "sess_2f6c1d0e4b7a4c5d8e9f0a1b2c3d4e5f",
"via": "retake"
}
],
"spent": {
"amount": "79.97",
"currency": "USD"
}
}

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": [
"profiles: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"
}