Get a shopper profile
const url = 'https://api.octaneai.com/v1/profiles/example';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/profiles/example \ --header 'Authorization: Bearer <token>'Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Responses
Section titled “Responses”The shopper’s identities, latest answers and results, sessions, and linked orders.
object
How many of them completed
The profile
The shopper’s emails, phones and Shopify customer id; empty on a removed profile
object
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
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
The email (lowercase), the phone (E.164), or the Shopify customer as a gid://shopify/Customer/
The latest moment the shopper was seen
The latest completed result of each quiz
object
Its answers
object
The question
For an image choice: one entry per label in values, the option’s image or null
What kind of answer this is
The page the question is on
The question as the quiz labels it
True when the question is no longer in the quiz
The answer as stored: an option id or the typed text, a JSON number for a number, a {date, time} object for a date
The answer as the shopper saw it: option labels, or the typed value as text
When it completed
Its formula values
object
The formula or value table
A formula’s number, or the value a value table resolved
Its label
The page the formula or value table is on
Its points per dimension
object
The points dimension
Its name
The points the session scored on it
The quiz
Its name
object
The result page
The products it showed
object
The product block that showed it
The product’s Shopify GID
The latest completed session of this quiz
When that session opened
object
The points dimension
Its name
The points the session scored on it
Orders linked to the shopper’s quiz sessions
object
Its total in the store’s currency
object
A decimal string, as “79.97”
ISO 4217 code
When the order was placed
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
The Shopify order id
Orders linked to the shopper’s quiz sessions
How many different quizzes the shopper took
True once the shopper’s data was erased on a data-deletion request: no identities or contact values remain
The shopper’s sessions, newest first, at most 200
object
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
Mobile | tablet | desktop
Times this session’s shared result was opened
object
Its total in the store’s currency
object
A decimal string, as “79.97”
ISO 4217 code
When the order was placed
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
The Shopify order id
How many pages the shopper visited in the session
Its quiz
The quiz’s name
The session
When it opened
Completed | in_progress | left
How many quiz sessions the shopper had
Orders bought through this shopper’s shared results; never part of orders, orders_count or spent
object
Its total in the store’s currency
object
A decimal string, as “79.97”
ISO 4217 code
When the order was placed
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
The Shopify order id
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)
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.
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": [ "profiles: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"}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"}