---
title: "Get a shopper profile"
method: GET
path: "/v1/profiles/{profile_id}"
tags: ["profiles"]
---

# Get a shopper profile

`GET /v1/profiles/{profile_id}`

## Request

- Base URL: `https://api.octaneai.com`
- URL: `https://api.octaneai.com/v1/profiles/{profile_id}`
- Auth: HTTP bearer

## Path parameters

- `profile_id` string, required

## Response `200`

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

- ProfileDetail
  - `id` string, required: The profile
  - `removed` boolean, required: True once the shopper's data was erased on a data-deletion request: no identities or contact values remain
  - `removed_at` string, date-time, nullable, required: When the data was erased; null otherwise
  - `identities` ProfileIdentity[], required: The shopper's emails, phones and Shopify customer id; empty on a removed profile
    - `kind` string, required: 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
    - `value` string, required: The email (lowercase), the phone (E.164), or the Shopify customer as a gid://shopify/Customer/<id> GID
    - `first_seen_at` string, date-time, nullable, required: When the identity was first captured
    - `last_seen_at` string, date-time, nullable, required: The latest moment one of the shopper's sessions typed this kind of contact, never earlier than first_seen_at
    - `consent` boolean, required: 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
  - `first_seen_at` string, date-time, nullable, required: The start of the shopper's first session; null when not known
  - `last_seen_at` string, date-time, required: The latest moment the shopper was seen
  - `sessions_count` integer, required: How many quiz sessions the shopper had
  - `completed_count` integer, required: How many of them completed
  - `returning` boolean, nullable, required: True when the shopper took a quiz again after we first knew them, on any device; null on a removed profile
  - `returning_count` integer, nullable, required: Sessions that began after we first knew the shopper; null on a removed profile
  - `quizzes_taken_count` integer, required: How many different quizzes the shopper took
  - `orders_count` integer, required: Orders linked to the shopper's quiz sessions
  - `spent` Money, required
    - `amount` string, required: A decimal string, as "79.97"
    - `currency` string, required: ISO 4217 code
  - `last_order_at` string, date-time, nullable, required: When the latest of them was placed; null without orders
  - `latest_results` ProfileResult[], required: The latest completed result of each quiz
    - `quiz_id` string, required: The quiz
    - `quiz_name` string, required: Its name
    - `version_number` integer, nullable, required: The version the session ran; null when that version is gone
    - `session_id` string, required: The latest completed session of this quiz
    - `started_at` string, date-time, required: When that session opened
    - `completed_at` string, date-time, required: When it completed
    - `answers` ProfileAnswer[], required: Its answers
      - `page_key` string, required: The page the question is on
      - `page_title` string, nullable, required: That page's title; null when it has none
      - `component_key` string, required: The question
      - `question` string, required: The question as the quiz labels it
      - `kind` 'choice' | 'image' | 'text' | 'email' | 'phone' | 'number' | 'date' | 'other', required: What kind of answer this is
      - `values` string[], required: The answer as the shopper saw it: option labels, or the typed value as text
      - `value` unknown, required
      - `image_urls` string[], required: For an image choice: one entry per label in values, the option's image or null
      - `removed` boolean, required: True when the question is no longer in the quiz
    - `points` ProfilePoints[], required: Its points per dimension
      - `dimension_id` string, required: The points dimension
      - `name` string, required: Its name
      - `total` number, required: The points the session scored on it
    - `winner` ProfilePoints, required
      - `dimension_id` string, required: The points dimension
      - `name` string, required: Its name
      - `total` number, required: The points the session scored on it
    - `points_total` number, nullable, required: The points summed over the dimensions; null when the quiz scores none
    - `formulas` ProfileFormula[], required: Its formula values
      - `page_key` string, required: The page the formula or value table is on
      - `component_key` string, required: The formula or value table
      - `label` string, required: Its label
      - `value` number, nullable, required: The number it computed; null for a value table that holds text
      - `kind` 'formula' | 'table': A formula's number, or the value a value table resolved
      - `value_text` string, nullable: The text a value table resolved; null for a formula or a number table
    - `result_page` ProfileResultPage, required
      - `page_key` string, required: The result page
      - `title` string, nullable, required: Its title; null when it has none
      - `position` integer, nullable, required: Its position in the quiz, from 1; null when not known
      - `page_count` integer, nullable, required: How many pages the quiz version has; null when not known
      - `shown_products` ProfileShownProduct[], required: The products it showed
        - `product_id` string, required: The product's Shopify GID
        - `variant_id` string, nullable, required: The variant's Shopify GID; null when the block showed the product only
        - `block_key` string, required: The product block that showed it
        - `handle` string, nullable, required: The product's handle; null when unknown
        - `title` string, nullable, required: The product's title; null when unknown
        - `variant_title` string, nullable, required: The variant's title; null when unknown
        - `price` number, nullable, required: The variant's price in the store's currency; null when unknown
        - `currency` string, nullable, required: The store's currency; null when unknown
        - `image` string, nullable, required: The product's image URL; null when unknown
    - `results_url` string, nullable, required: The link to this result: the page the quiz ran on plus the session's public id; null when the page was not recorded
  - `sessions` ProfileSession[], required: The shopper's sessions, newest first, at most 200
    - `session_id` string, required: The session
    - `quiz_id` string, required: Its quiz
    - `quiz_name` string, required: The quiz's name
    - `version_number` integer, nullable, required: The version it ran; null when that version is gone
    - `status` 'completed' | 'in_progress' | 'left', required: completed | in_progress | left
    - `returning` boolean, nullable, required: True when the session began after we first knew the shopper; null on a removed profile
    - `started_at` string, date-time, required: When it opened
    - `completed_at` string, date-time, nullable, required: When it completed; null otherwise
    - `ended_at` string, date-time, nullable, required: When it ended; null while it runs
    - `pages_visited` integer, required: How many pages the shopper visited in the session
    - `page_count` integer, nullable, required: How many pages the version has; null when not known
    - `last_page_key` string, nullable, required: The last page visited; null before any
    - `last_page_title` string, nullable, required: Its title; null when it has none
    - `last_page_position` integer, nullable, required: Its position in the quiz, from 1; null when not known
    - `device_class` string, required: mobile | tablet | desktop
    - `channel` string, required: 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
    - `country` string, nullable, required: The shopper's country from their IP, ISO 3166-1 alpha-2; null when unknown
    - `order` ProfileSessionOrder, required
      - `order_id` string, required: The Shopify order id
      - `order_name` string, nullable, required: The order's name, as #1042; null when unknown
      - `created_at` string, date-time, required: When the order was placed
      - `amount` Money, required
        - `amount` string, required: A decimal string, as "79.97"
        - `currency` string, required: ISO 4217 code
      - `minutes_after` integer, nullable, required: Minutes from the session's completion (else its start) to the order
      - `matched_tier` string, required: 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
    - `source_session_id` string, nullable, required: The session this one was started from: a shared result (source_kind share) or a Restart (source_kind restart); null for a session the shopper opened themselves
    - `source_kind` string, nullable, required: share: started from a shared result | restart: started by Restart; null for a session the shopper opened themselves
    - `results_url` string, nullable, required: The link to this session's results once completed; null before
    - `opens` integer, required: Times this session's shared result was opened
    - `last_opened_at` string, date-time, nullable, required: When the session's shared result was last opened; null when never
    - `last_open_channel` string, nullable, required: How that last open arrived: direct | organic_search | paid_search | organic_social | paid_social | email | sms | affiliate | display | paid_other | referral | ai_assistant | other | shared_results; null when never opened
  - `orders` ProfileOrder[], required: Orders linked to the shopper's quiz sessions
    - `order_id` string, required: The Shopify order id
    - `order_name` string, nullable, required: The order's name, as #1042; null when unknown
    - `created_at` string, date-time, required: When the order was placed
    - `amount` Money, required
      - `amount` string, required: A decimal string, as "79.97"
      - `currency` string, required: ISO 4217 code
    - `quiz_id` string, nullable, required: The quiz of the session it was tied to; null when not known
    - `quiz_name` string, nullable, required: That quiz's name; null with it
    - `session_id` string, nullable, required: The session it was tied to; null when not known
    - `matched_tier` string, required: 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
  - `share_orders` ProfileShareOrder[], required: Orders bought through this shopper's shared results; never part of orders, orders_count or spent
    - `order_id` string, required: The Shopify order id
    - `order_name` string, nullable, required: The order's name, as #1042; null when unknown
    - `created_at` string, date-time, required: When the order was placed
    - `amount` Money, required
      - `amount` string, required: A decimal string, as "79.97"
      - `currency` string, required: ISO 4217 code
    - `quiz_id` string, nullable, required: The quiz of the session it was tied to; null when not known
    - `quiz_name` string, nullable, required: That quiz's name; null with it
    - `session_id` string, nullable, required: The session it was tied to; null when not known
    - `matched_tier` string, required: 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
    - `via` 'retake' | 'shared_page', required: 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)
    - `buyer_person_id` string, nullable, required: The buyer's profile when one is known

## Other responses

- `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.
- `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)
