> ## Documentation Index
> Fetch the complete documentation index at: https://help.privy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get a product

> Retrieve a single product from your connected store's catalog by its
store product id.

Includes detail fields not returned by the list endpoint: `description`,
`tags`, `options`, `image`, `images`, and `media`, plus per-variant
`barcode`, `inventory_policy`, `position`, `product_id`, `taxable`,
`image_id`, and `updated_at`.

Requires a connected Shopify or BigCommerce store — without one, this endpoint returns
`404 no_connected_store`.

The response shape is the same on both platforms; detail fields BigCommerce does
not supply (`media`, per-variant `inventory_policy`, `position`, `taxable`,
`image_id`, `updated_at`) are `null` or empty.

**Required scope:** `products_read`




## OpenAPI

````yaml openapi/privy-api.yaml GET /products/{id}
openapi: 3.1.0
info:
  title: Privy API
  version: '1.0'
  description: >
    The Privy API lets you programmatically manage your contact list and read
    what you have set up in Privy.

    Create, update, unsubscribe, and remove contacts; report orders;

    and read your campaigns, flows, segments, orders, store products, coupon
    pools,

    performance reports, and account setup.
servers:
  - url: https://api.privy.com/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Account
    description: Retrieve information about the authenticated Privy account.
  - name: Contacts
    description: Manage your contact list.
  - name: Imports
    description: >-
      Read your contact import history — CSV uploads, connected-provider syncs,
      and SMS consent imports.
  - name: Campaigns
    description: >-
      Read your message campaigns — email and SMS newsletters, plus the messages
      your flows send.
  - name: Displays
    description: >-
      Read your on-site displays (popups, flyouts, banners, embedded forms,
      landing pages).
  - name: Coupons
    description: Read your coupon pools, their code inventory, and individual codes.
  - name: Reports
    description: >-
      Read performance reporting — signups, views, conversion rates, and
      attributed revenue — for your business, displays, and flows.
  - name: Flows
    description: Read your automation flows and their configuration.
  - name: Segments
    description: Read your customer segments and their membership.
  - name: Orders
    description: Report orders placed in your store and read your order history.
  - name: Products
    description: Read the product catalog and collections of your connected store.
  - name: Events
    description: Ingest custom events to trigger Flows and other automations.
paths:
  /products/{id}:
    get:
      tags:
        - Products
      summary: Get a product
      description: >
        Retrieve a single product from your connected store's catalog by its

        store product id.


        Includes detail fields not returned by the list endpoint: `description`,

        `tags`, `options`, `image`, `images`, and `media`, plus per-variant

        `barcode`, `inventory_policy`, `position`, `product_id`, `taxable`,

        `image_id`, and `updated_at`.


        Requires a connected Shopify or BigCommerce store — without one, this
        endpoint returns

        `404 no_connected_store`.


        The response shape is the same on both platforms; detail fields
        BigCommerce does

        not supply (`media`, per-variant `inventory_policy`, `position`,
        `taxable`,

        `image_id`, `updated_at`) are `null` or empty.


        **Required scope:** `products_read`
      operationId: getProduct
      parameters:
        - $ref: '#/components/parameters/AccountIdParam'
        - name: id
          in: path
          required: true
          description: The store's product id (returned as `id` in product responses).
          schema:
            type: integer
            format: int64
          example: 7890123456789
      responses:
        '200':
          description: The product.
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/ProductDetail'
              example:
                data:
                  id: 7890123456789
                  title: Classic T-Shirt
                  handle: classic-t-shirt
                  status: active
                  product_type: Shirts
                  vendor: Acme Apparel
                  url: https://mystore.com/products/classic-t-shirt
                  image_url: https://cdn.shopify.com/s/files/1/0001/products/tshirt.jpg
                  description: A timeless crew-neck tee in heavyweight cotton.
                  tags:
                    - cotton
                    - summer
                  options:
                    - id: 10012345678901
                      name: Size
                      position: 1
                      values:
                        - Small
                        - Large
                  image:
                    id: 30012345678901
                    url: https://cdn.shopify.com/s/files/1/0001/products/tshirt.jpg
                    alt_text: Front of the classic t-shirt
                    width: 1600
                    height: 1200
                  images:
                    - id: 30012345678901
                      url: >-
                        https://cdn.shopify.com/s/files/1/0001/products/tshirt.jpg
                      alt_text: Front of the classic t-shirt
                      width: 1600
                      height: 1200
                  media:
                    - id: 20012345678901
                      media_content_type: image
                      alt: Front of the classic t-shirt
                      preview_image_url: >-
                        https://cdn.shopify.com/s/files/1/0001/products/tshirt.jpg
                  price_range:
                    min: '10.00'
                    max: '15.00'
                    currency_code: USD
                  total_inventory: 42
                  tracks_inventory: true
                  variants_count: 2
                  variants:
                    - id: 40012345678901
                      title: Small
                      price: '10.00'
                      compare_at_price: null
                      sku: TSHIRT-S
                      inventory_quantity: 12
                      available: true
                      barcode: '0123456789012'
                      inventory_policy: deny
                      position: 1
                      product_id: 7890123456789
                      taxable: true
                      image_id: 30012345678901
                      updated_at: '2026-06-01T09:00:00Z'
                  created_at: '2026-01-10T09:00:00Z'
                  updated_at: '2026-06-01T09:00:00Z'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/InsufficientScope'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/ProductsRateLimited'
        '502':
          $ref: '#/components/responses/StoreUnavailable'
      security:
        - bearerAuth: []
components:
  parameters:
    AccountIdParam:
      name: Privy-Account-Id
      in: header
      required: false
      description: >
        Target a subaccount instead of the main connected account.

        Pass a subaccount `id` from get_account's `subaccounts` list. Only
        direct subaccounts

        of the connected account are reachable — omit this for the main account
        itself.
      schema:
        type: string
      example: S1U2B3A4C5C6T7
  schemas:
    ProductDetail:
      description: >
        A product with the additional detail fields only returned by `GET
        /v1/products/{id}`

        (the list endpoint returns the leaner `Product` shape).
      allOf:
        - $ref: '#/components/schemas/Product'
        - type: object
          properties:
            description:
              type:
                - string
                - 'null'
              description: The product description, as plain text.
              example: A timeless crew-neck tee in heavyweight cotton.
            tags:
              type: array
              items:
                type: string
              example:
                - cotton
                - summer
            options:
              type: array
              description: The product's option definitions (e.g. Size, Color).
              items:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    example: 10012345678901
                  name:
                    type: string
                    example: Size
                  position:
                    type: integer
                    example: 1
                  values:
                    type: array
                    items:
                      type: string
                    example:
                      - Small
                      - Large
            image:
              description: >-
                The product's featured image. `null` when the product has no
                images.
              anyOf:
                - $ref: '#/components/schemas/ProductImage'
                - type: 'null'
            images:
              type: array
              description: All product images (up to 100).
              items:
                $ref: '#/components/schemas/ProductImage'
            media:
              type: array
              description: All product media — images, videos, 3D models (up to 100).
              items:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    example: 20012345678901
                  media_content_type:
                    type: string
                    enum:
                      - image
                      - video
                      - external_video
                      - model_3d
                    example: image
                  alt:
                    type:
                      - string
                      - 'null'
                    example: Front of the classic t-shirt
                  preview_image_url:
                    type:
                      - string
                      - 'null'
                    example: https://cdn.shopify.com/s/files/1/0001/products/tshirt.jpg
            variants:
              type: array
              items:
                $ref: '#/components/schemas/ProductVariantDetail'
    Product:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: >-
            The store's product id. Use this value in `/v1/products/{id}`.
            Matches the product ids on order line items.
          example: 7890123456789
        title:
          type: string
          example: Classic T-Shirt
        handle:
          type:
            - string
            - 'null'
          description: >-
            The product's URL slug. `null` on BigCommerce products with no
            storefront path.
          example: classic-t-shirt
        status:
          type: string
          enum:
            - active
            - draft
            - archived
          example: active
        product_type:
          type:
            - string
            - 'null'
          description: >-
            The merchant-defined product category. Always `null` on BigCommerce
            stores.
          example: Shirts
        vendor:
          type:
            - string
            - 'null'
          description: The product's vendor/brand. Always `null` on BigCommerce stores.
          example: Acme Apparel
        url:
          type:
            - string
            - 'null'
          description: >-
            The product's storefront URL. `null` if not published to the online
            store; always `null` on BigCommerce stores.
          example: https://mystore.com/products/classic-t-shirt
        image_url:
          type:
            - string
            - 'null'
          example: https://cdn.shopify.com/s/files/1/0001/products/tshirt.jpg
        price_range:
          type:
            - object
            - 'null'
          properties:
            min:
              type: string
              example: '10.00'
            max:
              type: string
              example: '15.00'
            currency_code:
              type: string
              example: USD
        total_inventory:
          type:
            - integer
            - 'null'
          description: >-
            Total sellable inventory across variants. `null` when the store does
            not report it.
          example: 42
        tracks_inventory:
          type: boolean
          example: true
        variants_count:
          type:
            - integer
            - 'null'
          description: >-
            Total number of variants on the product (the `variants` array may be
            truncated below this).
          example: 3
        variants:
          type: array
          items:
            $ref: '#/components/schemas/ProductVariant'
        created_at:
          type: string
          format: date-time
          example: '2026-01-10T09:00:00Z'
        updated_at:
          type: string
          format: date-time
          example: '2026-06-01T09:00:00Z'
    ProductImage:
      type: object
      properties:
        id:
          type:
            - integer
            - 'null'
          format: int64
          description: The store's image id.
          example: 30012345678901
        url:
          type: string
          example: https://cdn.shopify.com/s/files/1/0001/products/tshirt.jpg
        alt_text:
          type:
            - string
            - 'null'
          example: Front of the classic t-shirt
        width:
          type:
            - integer
            - 'null'
          example: 1600
        height:
          type:
            - integer
            - 'null'
          example: 1200
    ProductVariantDetail:
      allOf:
        - $ref: '#/components/schemas/ProductVariant'
        - type: object
          properties:
            barcode:
              type:
                - string
                - 'null'
              example: '0123456789012'
            inventory_policy:
              type:
                - string
                - 'null'
              description: >-
                Whether the variant can be sold when out of stock. Always `null`
                on BigCommerce stores.
              enum:
                - deny
                - continue
                - null
              example: deny
            position:
              type:
                - integer
                - 'null'
              description: >-
                The variant's position within the product. Always `null` on
                BigCommerce stores.
              example: 1
            product_id:
              type: integer
              format: int64
              description: The store's id of the parent product.
              example: 7890123456789
            taxable:
              type:
                - boolean
                - 'null'
              description: Always `null` on BigCommerce stores.
              example: true
            image_id:
              type:
                - integer
                - 'null'
              format: int64
              description: >-
                The store's id of the variant's image. `null` when the variant
                has no dedicated image.
              example: 30012345678901
            updated_at:
              type:
                - string
                - 'null'
              format: date-time
              description: Always `null` on BigCommerce stores.
              example: '2026-06-01T09:00:00Z'
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              enum:
                - invalid_client
                - invalid_scope
                - unauthorized
                - insufficient_scope
                - paid_plan_required
                - api_access_required
                - not_found
                - no_connected_store
                - conflict
                - contacts_not_ready
                - validation_failed
                - rate_limited
                - store_unavailable
              example: validation_failed
            message:
              type: string
              example: One or more fields are invalid
            details:
              type: array
              items:
                type: object
                properties:
                  field:
                    type: string
                    example: email
                  message:
                    type: string
                    example: is required
    ProductVariant:
      type: object
      properties:
        id:
          type: integer
          format: int64
          description: The store's variant id.
          example: 40012345678901
        title:
          type:
            - string
            - 'null'
          description: >-
            `null` on BigCommerce stores for a product's base variant (it has no
            option values); Shopify default variants carry "Default Title"
            instead.
          example: Small
        price:
          type:
            - string
            - 'null'
          description: Variant price in the store's currency, as a decimal string.
          example: '10.00'
        compare_at_price:
          type:
            - string
            - 'null'
          example: '15.00'
        sku:
          type:
            - string
            - 'null'
          example: TSHIRT-S
        inventory_quantity:
          type:
            - integer
            - 'null'
          example: 12
        available:
          type: boolean
          description: >-
            Whether the variant can currently be purchased (untracked inventory
            counts as available).
          example: true
  responses:
    Unauthorized:
      description: Missing or invalid bearer token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: unauthorized
              message: Bearer token is missing or invalid
    InsufficientScope:
      description: Token lacks the required scope for this endpoint.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: insufficient_scope
              message: Token does not have the required scope
    NotFound:
      description: >-
        The requested resource does not exist or does not belong to your
        account.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: not_found
              message: Not found
    ProductsRateLimited:
      description: >-
        Rate limit exceeded — either Privy's API rate limit (code
        `rate_limited`, with the `X-RateLimit-*` headers) or the connected
        store's own quota passed through (code `store_rate_limited`).
        `Retry-After` carries the wait when it is known — BigCommerce's reset
        window, or a wait derived from Shopify's throttle cost payload.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
          example: 15
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: store_rate_limited
              message: >-
                The connected store is rate limiting requests. Try again
                shortly.
    StoreUnavailable:
      description: >-
        The connected store's API could not be reached or returned an error.
        Retry shortly.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            error:
              code: store_unavailable
              message: The connected store could not be reached. Try again shortly.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API token or OAuth access token
      description: >
        Send either an API token or an OAuth access token as

        `Authorization: Bearer <token>`. See the Authentication page for
        details.

````