---
title: "Get offer products"
method: GET
path: "/v25-10-beta/experiences/{experienceId}/offer-products"
tags: ["Fetch Experience Data"]
---

# Get offer products

`GET /v25-10-beta/experiences/{experienceId}/offer-products`

## Request

- Base URL: `https://api.intelligems.io`
- URL: `https://api.intelligems.io/v25-10-beta/experiences/{experienceId}/offer-products`
- Auth: API key in header `intelligems-access-token`
- TypeScript: <https://skmtc.dev/intelligems/apis/intelligems-external-api-v25-10-beta/docs/v25-10-beta/experiences/:experienceId/offer-products/get.ts> (a function with typed inputs; its response is checked against the schema)

Lists the products an experience's offers apply to. `GET /experiences/{experienceId}` only says whether a variation's offer is limited to products (its `includeProducts` flag); this endpoint lists them.

The response has one entry per product and set, each with the `variationId` of the offer it belongs to and every variant of the product marked `include` or `exclude`:

```json
{
  "products": [
    {
      "id": "8123456789",
      "title": "Microfiber towel",
      "variationId": "YOUR_VARIATION_ID",
      "offerId": "YOUR_OFFER_ID",
      "set": "buy",
      "variants": [
        {
          "id": "41000000001",
          "title": "12 pack",
          "price": 19.99,
          "compareAtPrice": null,
          "inclusionType": "include"
        },
        {
          "id": "41000000002",
          "title": "24 pack",
          "price": 34.99,
          "compareAtPrice": 39.99,
          "inclusionType": "exclude"
        }
      ]
    }
  ]
}
```

A list too large to return inline comes back as `{ "type": "s3", "url": "..." }` instead. Download the JSON from `url` within about 15 minutes.

### Query Parameters

All query parameters are optional.

- `variationId` (UUID) — Only return the products of this variation's offer. A variation that isn't on the experience returns 404, the same as an experience your store doesn't have.

### Important Notes

- An offer applies only to the products listed for it. A variation whose offer has no entries covers every product.
- `set` is `buy` for the products the offer applies to. On a Buy X Get Y offer with `bxgyGetProductScope` `list`, `get` entries are the products shoppers get at the discount.
- Each entry's `id`, `set`, and `variants` are what an offer's `products` take on `POST /experiences` and `PUT /experiences/{experienceId}`, so you can edit a list read here and send it back. Titles and prices are read from your store's catalog when you save, so they don't need to be sent.
- A variant marked `exclude` is left out of the offer. A product listed with every variant excluded isn't possible: leave the product out instead.
- A variant deleted in Shopify can still be listed here. Sending it back is fine: the save drops it. A product deleted in Shopify has to be left out of the list you send back.

**Rate Limit:** 50 requests per 30s window, refilling 25 tokens every 30s.

## Path parameters

- `experienceId` string, uuid, required: The experience whose offer products to list.

## Query parameters

- `variationId` string, uuid: Only return the products of this variation's offer. Leave it out for every variation. A variation that isn't on the experience is a 404.

## Response `200`

OK

- union
  - object
    - `products` object[], required: The products each offer applies to: one entry per product and set, with its variationId and every variant marked include or exclude. An entry's id, set, and variants are what an offer's products take on create and update, so a list read here can be edited and sent back. A variation whose offer covers every product has no entries.
      - `id` string, required: Shopify product ID from the store's catalog.
      - `title` string, required: Product display name.
      - `image` string, nullable: URL to the product's primary image.
      - `variants` object[], required: Specific variants of this product with their inclusion/exclusion status.
        - `uuid` string, uuid: Server-generated. Read-only. Internal identifier.
        - `id` string, required: Shopify product variant ID from the store's catalog.
        - `title` string, required: Variant display name (e.g., 'Large / Blue').
        - `price` union, required: Current selling price of this variant.
          - number
          - string
        - `compareAtPrice` union: Original price before any sale. Null if the variant is not on sale.
          - number
          - string
        - `inclusionType` 'include' | 'exclude', required: Whether this variant is explicitly included in or excluded from the offer.
      - `variationId` string, uuid, required: References the parent variation.
      - `offerId` string, uuid, nullable, required: References the parent offer.
      - `set` 'buy' | 'get', required: For Buy X Get Y with different products: 'buy' products trigger the offer, 'get' products can be discounted. Every other offer only uses 'buy'.
  - object
    - `type` 's3', required
    - `url` string, required: A presigned URL to download the list as JSON, sent instead of products when the list is too large to return inline. It expires after about 15 minutes.

## Other responses

- `429`: Too Many Requests

---

[API](https://skmtc.dev/intelligems/apis/intelligems-external-api-v25-10-beta.md) - [All operations](https://skmtc.dev/intelligems/apis/intelligems-external-api-v25-10-beta/llms.txt) - [OpenAPI document](https://skmtc.dev/intelligems/apis/intelligems-external-api-v25-10-beta/revisions/7b769b2f90b1?raw)
