---
title: "Add checkout block"
method: POST
path: "/v25-10-beta/experiences/{experienceId}/checkout-blocks"
tags: ["Manage Checkout Blocks"]
---

# Add checkout block

`POST /v25-10-beta/experiences/{experienceId}/checkout-blocks`

## Request

- Base URL: `https://api.intelligems.io`
- URL: `https://api.intelligems.io/v25-10-beta/experiences/{experienceId}/checkout-blocks`
- 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/checkout-blocks/post.ts> (a function with typed inputs; its response is checked against the schema)

Adds a checkout block to one of an experience's variations.

The block starts from its template's defaults. Send only what you want to change, at any depth: every field of `variables` and `styles` you leave out keeps the template's value. A list you send, such as a trust badge's `items` or an FAQ block's `questions`, replaces the template's list whole.

### Required Fields

- `blockType` (string) — The block type (see the list above)
- `variationId` (UUID) — The variation to add the block to. It must belong to the experience in the path.

### Optional Fields

- `name` (string) — Display name in the dashboard. Defaults to the template's name and the block's position.
- `template` (string) — The preset to start from. The values depend on `blockType`. Not accepted for `postPurchaseUpsell`.
- `variables` (object) — Content settings for this block type
- `styles` (object) — Style settings for this block type
- `displayConditions` (object) — Cart conditions that decide when the block shows. Omit it to show the block on every cart. Not accepted for `postPurchaseUpsell`.
- `upsellProductRules` (array) — Which products the block recommends. `upsell` and `postPurchaseUpsell` only. Leave it out to start with Shopify's recommendations on every cart or order, the same as a block added in Intelligems.

### Response

`{ "block": { ... } }`, with the saved block. A `postPurchaseUpsell` block also returns `adjustments`, listing anything the API changed on its own to keep the offer valid. An `upsell` block sent without `upsellProductRules` returns `adjustments` too, saying which products it starts with.

### Important Notes

- Blocks can only be added to a `checkoutBlock`, `postPurchase` or `personalization` experience, the same as in Intelligems. Adding one to any other experience, such as a price or offer test, returns a `400`.
- A `postPurchaseUpsell` block needs a store that is ready for post-purchase upsells. If it isn't, the request returns a `400` listing what to fix.
- Discounts can't be set with an API key. An upsell's `variables.discount`, a product rule's `discount`, and a post-purchase upsell's `discountType` and `discountValue` return a `400`. Set discounts in Intelligems.
- On a store that uses Agentic Logic, a new `upsell` or `postPurchaseUpsell` block shows products from the store's built-in "Shopify recommendations" rule, the same as one added in Intelligems. Its products come from that rule, so `upsellProductRules` returns a `400` there. To show different products, pick another rule in Intelligems.
- A recurring timer's `resetTimezone` is set to the store's timezone. If the store has none, send one: it has to be an IANA name such as `America/New_York`, or the request returns a `400`.
- Blocks added to a running experience show to shoppers immediately.

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

## Path parameters

- `experienceId` string, uuid, required: The experience the checkout block belongs to.

## Request body

- union
  - object
    - `blockType` 'trustBadge', required: The block type. Picks which `variables`, `styles` and `template` values are accepted. A PUT can't change a block's type.
    - `variationId` string, uuid, required: The variation the block is added to. It must belong to the experience in the path.
    - `name` string: Display name for identifying this block in the dashboard.
    - `template` 'badgeList' | 'badgeTiles' | 'callOut' | 'grid' | 'header' | 'images' | 'brandLogo' | 'textOnly': The preset the block's defaults are seeded from. Values depend on `blockType`. Omit it to use the type's default preset.
    - `variables` object: Content settings for this block type. Send only the fields you want to set, at any depth; every field you leave out keeps the template's value. A list you send replaces the template's list whole. Unknown fields are rejected. An upsell's `discount` can't be set with an API key: set it in Intelligems.
      - `headerText` union
        - string
        - object[]
          - `text` string, required
          - `bold` boolean
          - `italic` boolean
          - `strike` boolean
          - `link` object
            - `href` string, uri, required
      - `items` object[]
        - `order` number, required
        - `title` union
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `subtitle` union
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `type` string, required
        - `icon` string, nullable
        - `iconColor` string, nullable
        - `iconSize` string, nullable
        - `imageSize` number, nullable, required
        - `imageSizeUnit` 'pixels' | 'percentage', required
        - `imageAspectRatio` string, nullable
        - `image` string, nullable
        - `mediaSpacing` string, required
    - `styles` object: Style settings for this block type. Send only the groups and fields you want to set, at any depth; everything you leave out keeps the template's value. Unknown groups and fields are rejected.
      - `typography` object
        - `header` object
          - `fontSize` string
          - `fontStyle` string
        - `itemTitle` object
          - `fontSize` string
          - `fontStyle` string
        - `itemSubtitle` object
          - `fontSize` string
          - `fontStyle` string
      - `backgroundColors` object
        - `header` string
        - `item` string
        - `block` string
      - `colors` object
        - `headerText` string
        - `itemTitleText` string
        - `itemSubtitleText` string
      - `layout` object
        - `headerTextAlign` string
        - `bodyAlign` string
        - `itemTextAlign` string
        - `itemPositionAlign` string
        - `rowCount` integer
        - `columnCount` integer
      - `appearance` object
        - `headerBorderThickness` string
        - `headerBorderStyle` string
        - `headerCornerRadius` string
        - `headerPadding` string
        - `bodySpacing` string
        - `headingToBodySpacing` string
        - `blockBorderThickness` string
        - `blockBorderStyle` string
        - `blockPadding` string
        - `blockCornerRadius` string
        - `itemBorderThickness` string
        - `itemBorderStyle` string
        - `itemCornerRadius` string
        - `itemTextSpacing` string
    - `displayConditions` object: Cart conditions that decide when the block shows. Omit it to show the block on every cart.
      - `match` 'all' | 'any': `all` = every condition must hold (AND). `any` = at least one (OR).
      - `conditions` union[], required: The full condition list. This REPLACES the existing conditions wholesale — to add a second condition to a block, send both the existing one and the new one.
        - union: One cart condition. `anything` matches every cart and cannot be combined with other conditions.
          - object
            - `attribute` 'anything', required
          - object
            - `attribute` 'cartSubtotal', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` number, required: Subtotal to compare against, in the shop's currency (e.g. 50 for $50). For `between`, this is the lower bound.
            - `valueMax` number: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'cartItemCount', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` integer, required: Item count to compare against. For `between`, the lower bound.
            - `valueMax` integer: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'collection', required
            - `operator` 'includes' | 'doesNotInclude'
            - `collectionIds` string[], required: Collection ids the cart must (or must not) contain a product from. Numeric ids or gids from list_collections — the server normalizes them. A title or handle is rejected; look the collection up first.
          - object
            - `attribute` 'tag', required
            - `operator` 'includes' | 'doesNotInclude'
            - `tags` string[], required: Product tags the cart must (or must not) contain.
          - object
            - `attribute` 'subscription', required
            - `operator` 'includes' | 'doesNotInclude': `includes` = cart has at least one subscription line; `doesNotInclude` = none.
          - object
            - `attribute` 'productId', required
            - `operator` 'includes' | 'doesNotInclude'
            - `products` object[], required
              - …
  - object
    - `blockType` 'upsell', required: The block type. Picks which `variables`, `styles` and `template` values are accepted. A PUT can't change a block's type.
    - `variationId` string, uuid, required: The variation the block is added to. It must belong to the experience in the path.
    - `name` string: Display name for identifying this block in the dashboard.
    - `template` 'productTiles' | 'productList' | 'singleProduct' | 'singleProductCheckbox': The preset the block's defaults are seeded from. Values depend on `blockType`. Omit it to use the type's default preset.
    - `variables` object: Content settings for this block type. Send only the fields you want to set, at any depth; every field you leave out keeps the template's value. A list you send replaces the template's list whole. Unknown fields are rejected. An upsell's `discount` can't be set with an API key: set it in Intelligems.
      - `headerText` union
        - string
        - object[]
          - `text` string, required
          - `bold` boolean
          - `italic` boolean
          - `strike` boolean
          - `link` object
            - `href` string, uri, required
      - `maxProductLimit` integer
      - `excludeItemsInCart` boolean
      - `excludeOutOfStock` boolean
      - `buttonText` string
      - `imageSize` number
      - `imageSizeUnit` 'pixels' | 'percentage'
      - `imageAspectRatio` string
      - `mediaSpacing` string
    - `styles` object: Style settings for this block type. Send only the groups and fields you want to set, at any depth; everything you leave out keeps the template's value. Unknown groups and fields are rejected.
      - `typography` object
        - `header` object
          - `fontSize` string
          - `fontStyle` string
        - `productTitle` object
          - `fontSize` string
          - `fontStyle` string
        - `variantTitle` object
          - `fontSize` string
          - `fontStyle` string
        - `price` object
          - `fontSize` string
          - `fontStyle` string
        - `button` object
          - `fontSize` string
          - `fontStyle` string
      - `backgroundColors` object
        - `header` string
        - `item` string
        - `block` string
        - `button` string
        - `productUnit` string
      - `colors` object
        - `headerText` string
        - `productText` string
        - `variantText` string
        - `priceText` string
        - `carouselArrowColor` string
        - `carouselArrowStyle` string
      - `layout` object
        - `headerTextAlign` string
        - `bodyAlign` string
        - `itemTextAlign` string
        - `itemPositionAlign` string
        - `mobile` object
          - `rowCount` integer
          - `columnCount` integer
        - `desktop` object
          - `rowCount` integer
          - `columnCount` integer
      - `appearance` object
        - `headerBorderThickness` string
        - `headerBorderStyle` string
        - `headerCornerRadius` string
        - `headerPadding` string
        - `bodySpacing` string
        - `headingToBodySpacing` string
        - `blockBorderThickness` string
        - `blockBorderStyle` string
        - `blockPadding` string
        - `blockCornerRadius` string
        - `productBorderThickness` string
        - `productBorderStyle` string
        - `productCornerRadius` string
        - `productTextSpacing` string
    - `displayConditions` object: Cart conditions that decide when the block shows. Omit it to show the block on every cart.
      - `match` 'all' | 'any': `all` = every condition must hold (AND). `any` = at least one (OR).
      - `conditions` union[], required: The full condition list. This REPLACES the existing conditions wholesale — to add a second condition to a block, send both the existing one and the new one.
        - union: One cart condition. `anything` matches every cart and cannot be combined with other conditions.
          - object
            - `attribute` 'anything', required
          - object
            - `attribute` 'cartSubtotal', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` number, required: Subtotal to compare against, in the shop's currency (e.g. 50 for $50). For `between`, this is the lower bound.
            - `valueMax` number: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'cartItemCount', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` integer, required: Item count to compare against. For `between`, the lower bound.
            - `valueMax` integer: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'collection', required
            - `operator` 'includes' | 'doesNotInclude'
            - `collectionIds` string[], required: Collection ids the cart must (or must not) contain a product from. Numeric ids or gids from list_collections — the server normalizes them. A title or handle is rejected; look the collection up first.
          - object
            - `attribute` 'tag', required
            - `operator` 'includes' | 'doesNotInclude'
            - `tags` string[], required: Product tags the cart must (or must not) contain.
          - object
            - `attribute` 'subscription', required
            - `operator` 'includes' | 'doesNotInclude': `includes` = cart has at least one subscription line; `doesNotInclude` = none.
          - object
            - `attribute` 'productId', required
            - `operator` 'includes' | 'doesNotInclude'
            - `products` object[], required
              - …
    - `upsellProductRules` object[]: Rules that decide which products the block recommends. The first matching rule wins. Rules can't carry a discount when sent with an API key.
      - `priority` integer: Lower runs first; the first matching rule wins.
      - `when` object, required: Cart conditions that trigger this rule. Use a single `anything` condition for a rule that always applies.
        - `match` 'all' | 'any': `all` = every condition must hold (AND). `any` = at least one (OR).
        - `conditions` union[], required: The full condition list. This REPLACES the existing conditions wholesale — to add a second condition to a block, send both the existing one and the new one.
          - union: One cart condition. `anything` matches every cart and cannot be combined with other conditions.
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
      - `recommend` union, required: Where the block's recommended products come from: Shopify's own recommendations for the cart, a collection, a tag search, or an explicit product list.
        - object
          - `source` 'shopifyRecommendations', required
        - object
          - `source` 'collection', required
          - `collectionId` string, required: Collection to recommend from. Numeric id or gid from list_collections — the server normalizes it. A title or handle is rejected; look the collection up first. Singular because the renderer resolves only one collection per rule.
          - `tags` string[]: Optional: narrow the collection to products carrying ALL of these tags (ANDed) — unlike a tag-source rule, where the tags are ORed.
        - object
          - `source` 'tag', required
          - `tags` string[], required: Recommend products carrying ANY of these tags (they are ORed together).
        - object
          - `source` 'products', required
          - `products` object[], required: Explicit products, in display order. The server hydrates titles, images and prices from Shopify — do not invent them.
            - `productId` string, required: Numeric id or gid; the server normalizes it.
            - `variantIds` string[]: Variants to offer. Omit to offer every variant of the product.
  - object
    - `blockType` 'shippingProgressBar', required: The block type. Picks which `variables`, `styles` and `template` values are accepted. A PUT can't change a block's type.
    - `variationId` string, uuid, required: The variation the block is added to. It must belong to the experience in the path.
    - `name` string: Display name for identifying this block in the dashboard.
    - `template` 'minimal' | 'milestones': The preset the block's defaults are seeded from. Values depend on `blockType`. Omit it to use the type's default preset.
    - `variables` object: Content settings for this block type. Send only the fields you want to set, at any depth; every field you leave out keeps the template's value. A list you send replaces the template's list whole. Unknown fields are rejected. An upsell's `discount` can't be set with an API key: set it in Intelligems.
      - `headerText` union
        - string
        - object[]
          - `text` string, required
          - `bold` boolean
          - `italic` boolean
          - `strike` boolean
          - `link` object
            - `href` string, uri, required
      - `currency` string
      - `template` 'minimal' | 'milestones'
      - `tiers` object[]
        - `threshold` number, required
        - `message` union, required
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `messageComplete` union, required
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `activeIconId` string
        - `inactiveIconId` string
        - `breakpointText` union
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
    - `styles` object: Style settings for this block type. Send only the groups and fields you want to set, at any depth; everything you leave out keeps the template's value. Unknown groups and fields are rejected.
      - `typography` object
        - `header` object
          - `fontSize` string
          - `fontStyle` string
        - `label` object
          - `fontSize` string
          - `fontStyle` string
      - `backgroundColors` object
        - `header` string
        - `item` string
        - `block` string
        - `milestoneIcon` string
      - `colors` object
        - `headerText` string
        - `labelText` string
        - `barTone` string
      - `layout` object
        - `headerTextAlign` string
        - `bodyAlign` string
        - `itemTextAlign` string
        - `itemPositionAlign` string
        - `messageTextAlign` string
      - `appearance` object
        - `headerBorderThickness` string
        - `headerBorderStyle` string
        - `headerCornerRadius` string
        - `headerPadding` string
        - `bodySpacing` string
        - `headingToBodySpacing` string
        - `blockBorderThickness` string
        - `blockBorderStyle` string
        - `blockPadding` string
        - `blockCornerRadius` string
        - `milestoneIconCornerRadius` string
        - `milestoneIconSize` string
        - `milestoneIconPadding` string
    - `displayConditions` object: Cart conditions that decide when the block shows. Omit it to show the block on every cart.
      - `match` 'all' | 'any': `all` = every condition must hold (AND). `any` = at least one (OR).
      - `conditions` union[], required: The full condition list. This REPLACES the existing conditions wholesale — to add a second condition to a block, send both the existing one and the new one.
        - union: One cart condition. `anything` matches every cart and cannot be combined with other conditions.
          - object
            - `attribute` 'anything', required
          - object
            - `attribute` 'cartSubtotal', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` number, required: Subtotal to compare against, in the shop's currency (e.g. 50 for $50). For `between`, this is the lower bound.
            - `valueMax` number: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'cartItemCount', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` integer, required: Item count to compare against. For `between`, the lower bound.
            - `valueMax` integer: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'collection', required
            - `operator` 'includes' | 'doesNotInclude'
            - `collectionIds` string[], required: Collection ids the cart must (or must not) contain a product from. Numeric ids or gids from list_collections — the server normalizes them. A title or handle is rejected; look the collection up first.
          - object
            - `attribute` 'tag', required
            - `operator` 'includes' | 'doesNotInclude'
            - `tags` string[], required: Product tags the cart must (or must not) contain.
          - object
            - `attribute` 'subscription', required
            - `operator` 'includes' | 'doesNotInclude': `includes` = cart has at least one subscription line; `doesNotInclude` = none.
          - object
            - `attribute` 'productId', required
            - `operator` 'includes' | 'doesNotInclude'
            - `products` object[], required
              - …
  - object
    - `blockType` 'timer', required: The block type. Picks which `variables`, `styles` and `template` values are accepted. A PUT can't change a block's type.
    - `variationId` string, uuid, required: The variation the block is added to. It must belong to the experience in the path.
    - `name` string: Display name for identifying this block in the dashboard.
    - `template` 'textCountdown' | 'digitalClock' | 'inlinePill': The preset the block's defaults are seeded from. Values depend on `blockType`. Omit it to use the type's default preset.
    - `variables` object: Content settings for this block type. Send only the fields you want to set, at any depth; every field you leave out keeps the template's value. A list you send replaces the template's list whole. Unknown fields are rejected. An upsell's `discount` can't be set with an API key: set it in Intelligems.
      - `timerMode` 'fixedDate' | 'perVisitor' | 'recurring'
      - `endDateTime` string, nullable
      - `durationMinutes` integer
      - `resetIntervalUnit` 'hour' | 'day' | 'week', nullable
      - `resetTimeOfDay` string, nullable
      - `resetDayOfWeek` union
        - 1
        - 2
        - 3
        - 4
        - 5
        - 6
        - 7
      - `resetMinuteOfHour` integer, nullable
      - `resetTimezone` string, nullable
      - `expiredBehavior` 'remove' | 'showText'
      - `timerTemplate` 'textCountdown' | 'digitalClock' | 'inlinePill'
      - `showDays` boolean
      - `showHours` boolean
      - `showMinutes` boolean
      - `showSeconds` boolean
      - `countdownText` union
        - string
        - object[]
          - `text` string, required
          - `bold` boolean
          - `italic` boolean
          - `strike` boolean
          - `link` object
            - `href` string, uri, required
      - `expiredText` union
        - string
        - object[]
          - `text` string, required
          - `bold` boolean
          - `italic` boolean
          - `strike` boolean
          - `link` object
            - `href` string, uri, required
      - `headline` union
        - string
        - object[]
          - `text` string, required
          - `bold` boolean
          - `italic` boolean
          - `strike` boolean
          - `link` object
            - `href` string, uri, required
    - `styles` object: Style settings for this block type. Send only the groups and fields you want to set, at any depth; everything you leave out keeps the template's value. Unknown groups and fields are rejected.
      - `typography` object
        - `text` object
          - `fontSize` string
          - `fontStyle` string
      - `backgroundColors` object
        - `block` string
        - `expired` string
      - `colors` object
        - `text` string
        - `expiredText` string
        - `digit` string
      - `layout` object
        - `textAlign` string
      - `appearance` object
        - `blockBorderStyle` string
        - `blockBorderThickness` string
        - `blockCornerRadius` string
        - `blockPadding` string
      - `digits` object
        - `separator` 'colon' | 'dot' | 'units'
        - `size` 'small' | 'base'
    - `displayConditions` object: Cart conditions that decide when the block shows. Omit it to show the block on every cart.
      - `match` 'all' | 'any': `all` = every condition must hold (AND). `any` = at least one (OR).
      - `conditions` union[], required: The full condition list. This REPLACES the existing conditions wholesale — to add a second condition to a block, send both the existing one and the new one.
        - union: One cart condition. `anything` matches every cart and cannot be combined with other conditions.
          - object
            - `attribute` 'anything', required
          - object
            - `attribute` 'cartSubtotal', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` number, required: Subtotal to compare against, in the shop's currency (e.g. 50 for $50). For `between`, this is the lower bound.
            - `valueMax` number: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'cartItemCount', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` integer, required: Item count to compare against. For `between`, the lower bound.
            - `valueMax` integer: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'collection', required
            - `operator` 'includes' | 'doesNotInclude'
            - `collectionIds` string[], required: Collection ids the cart must (or must not) contain a product from. Numeric ids or gids from list_collections — the server normalizes them. A title or handle is rejected; look the collection up first.
          - object
            - `attribute` 'tag', required
            - `operator` 'includes' | 'doesNotInclude'
            - `tags` string[], required: Product tags the cart must (or must not) contain.
          - object
            - `attribute` 'subscription', required
            - `operator` 'includes' | 'doesNotInclude': `includes` = cart has at least one subscription line; `doesNotInclude` = none.
          - object
            - `attribute` 'productId', required
            - `operator` 'includes' | 'doesNotInclude'
            - `products` object[], required
              - …
  - object
    - `blockType` 'faqs', required: The block type. Picks which `variables`, `styles` and `template` values are accepted. A PUT can't change a block's type.
    - `variationId` string, uuid, required: The variation the block is added to. It must belong to the experience in the path.
    - `name` string: Display name for identifying this block in the dashboard.
    - `template` 'faqsAccordion': The preset the block's defaults are seeded from. Values depend on `blockType`. Omit it to use the type's default preset.
    - `variables` object: Content settings for this block type. Send only the fields you want to set, at any depth; every field you leave out keeps the template's value. A list you send replaces the template's list whole. Unknown fields are rejected. An upsell's `discount` can't be set with an API key: set it in Intelligems.
      - `headerText` union
        - string
        - object[]
          - `text` string, required
          - `bold` boolean
          - `italic` boolean
          - `strike` boolean
          - `link` object
            - `href` string, uri, required
      - `showDivider` boolean
      - `allowMultipleOpen` boolean
      - `questions` object[]
        - `id` string, required
        - `question` union, required
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `answer` union, required
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `openByDefault` boolean
    - `styles` object: Style settings for this block type. Send only the groups and fields you want to set, at any depth; everything you leave out keeps the template's value. Unknown groups and fields are rejected.
      - `typography` object
        - `header` object
          - `fontSize` string
          - `fontStyle` string
        - `question` object
          - `fontSize` string
          - `fontStyle` string
        - `answer` object
          - `fontSize` string
          - `fontStyle` string
      - `backgroundColors` object
        - `header` string
        - `item` string
        - `block` string
      - `colors` object
        - `headerText` string
        - `questionText` string
        - `answerText` string
      - `layout` object
        - `headerTextAlign` string
        - `bodyAlign` string
        - `itemTextAlign` string
        - `itemPositionAlign` string
      - `appearance` object
        - `headerBorderThickness` string
        - `headerBorderStyle` string
        - `headerCornerRadius` string
        - `headerPadding` string
        - `bodySpacing` string
        - `headingToBodySpacing` string
        - `blockBorderThickness` string
        - `blockBorderStyle` string
        - `blockPadding` string
        - `blockCornerRadius` string
    - `displayConditions` object: Cart conditions that decide when the block shows. Omit it to show the block on every cart.
      - `match` 'all' | 'any': `all` = every condition must hold (AND). `any` = at least one (OR).
      - `conditions` union[], required: The full condition list. This REPLACES the existing conditions wholesale — to add a second condition to a block, send both the existing one and the new one.
        - union: One cart condition. `anything` matches every cart and cannot be combined with other conditions.
          - object
            - `attribute` 'anything', required
          - object
            - `attribute` 'cartSubtotal', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` number, required: Subtotal to compare against, in the shop's currency (e.g. 50 for $50). For `between`, this is the lower bound.
            - `valueMax` number: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'cartItemCount', required
            - `operator` 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` integer, required: Item count to compare against. For `between`, the lower bound.
            - `valueMax` integer: Upper bound. Required for `between`, ignored otherwise.
          - object
            - `attribute` 'collection', required
            - `operator` 'includes' | 'doesNotInclude'
            - `collectionIds` string[], required: Collection ids the cart must (or must not) contain a product from. Numeric ids or gids from list_collections — the server normalizes them. A title or handle is rejected; look the collection up first.
          - object
            - `attribute` 'tag', required
            - `operator` 'includes' | 'doesNotInclude'
            - `tags` string[], required: Product tags the cart must (or must not) contain.
          - object
            - `attribute` 'subscription', required
            - `operator` 'includes' | 'doesNotInclude': `includes` = cart has at least one subscription line; `doesNotInclude` = none.
          - object
            - `attribute` 'productId', required
            - `operator` 'includes' | 'doesNotInclude'
            - `products` object[], required
              - …
  - object
    - `blockType` 'postPurchaseUpsell', required: The block type. Picks which `variables`, `styles` and `template` values are accepted. A PUT can't change a block's type.
    - `variationId` string, uuid, required: The variation the block is added to. It must belong to the experience in the path.
    - `name` string: Display name for identifying this block in the dashboard.
    - `variables` object: Post-purchase upsell settings. Send only the fields you want to set; the rest keep their current or default values. Values must be on the dashboard's lists and within its limits. The offer's discount (`discountType`, `discountValue`) can't be set with an API key: set it in Intelligems. A PUT keeps the saved discount.
      - `excludeOutOfStock` boolean
      - `excludeItemsInCart` boolean
      - `descriptionEnabled` boolean
      - `quantitySelectorEnabled` boolean
      - `countdownTimerEnabled` boolean
      - `compareAtPriceDisplay` 'none' | 'compareAtPrice' | 'regularPrice': Struck-through price beside the offer price: 'none', 'compareAtPrice' (the product's compare-at price from Shopify), or 'regularPrice' (needs a discount).
      - `bannerTitle` string: Callout banner title. New offers already show "It's not too late to add this to your order"; only send this when the merchant asks to change the banner. May include '#customerFirstName'. The banner hides when both title and subtitle are empty.
      - `bannerSubtitle` string: Callout banner subtitle. New offers already show "Don't miss out on these picks for you"; only send this when the merchant asks to change it.
      - `customerFirstNameFallback` string: Shown in place of '#customerFirstName' when the name is unknown. Only send this when the banner uses '#customerFirstName'.
      - `maxProductLimit` integer: How many products the offer shows. New offers already show 3; only send this when the merchant asks for a different number. Moving to or from 1 also turns the description on or off, unless `descriptionEnabled` is sent.
      - `offerTimeout` integer: Minutes before the offer closes and the shopper goes to the thank-you page. New offers already use 60; only send this when the merchant asks for a different time.
      - `headingLevel` '1' | '2' | '3' | 'auto': Heading level for the product title. Defaults to 'auto'; only send this when the merchant asks.
      - `imageAspectRatio` 'original' | '1:1': Product image shape. Defaults to '1:1'; only send this when the merchant asks.
      - `quantityLabel` string: Label above the quantity selector. Defaults to "Quantity"; only send this when the merchant asks to change it.
      - `maxQuantityType` 'noMaximum' | 'setMaximum': 'noMaximum' (the default), or 'setMaximum' to cap the quantity at `maxQuantity`.
      - `maxQuantity` integer: Most units a shopper can add, when `maxQuantityType` is 'setMaximum'.
      - `timerCheckout` object: Countdown settings. Send only the fields the merchant asked to change; the rest keep the editor's defaults.
        - `countdownText` string: Copy shown while the countdown is running. Defaults to "Offer expires in #countdownTextTimeRemaining"; only send this when the merchant asks to change the wording. It must contain '#countdownTextTimeRemaining' where the time goes, which is replaced with the live countdown. Never use '{{...}}' placeholders.
        - `expiredText` string: Copy shown once the countdown ends, if `expiredBehavior` is 'showText'. Defaults to "This offer has expired"; only send this when the merchant asks to change it.
        - `durationMinutes` integer: Countdown length in minutes. A new countdown already gets a length that fits the offer; only send this when the merchant asks for one. Can't be longer than `offerTimeout`; a longer value is shortened to fit.
        - `expiredBehavior` 'remove' | 'showText': What happens at zero: 'remove' hides the countdown, 'showText' (the default) swaps in `expiredText`.
    - `styles` object: Post-purchase upsell styles. Send only the fields you want to set; the rest keep their current or default values. Values must be on the dashboard's lists.
      - `backgroundColors` object
        - `banner` 'secondary' | 'transparent'
        - `countdown` 'secondary' | 'transparent'
        - `expired` 'secondary' | 'transparent'
      - `colors` object
        - `expiredText` 'critical' | 'warning' | 'success' | 'subdued'
      - `appearance` object
        - `bannerTextAlign` 'left' | 'center' | 'right'
        - `countdownTextAlign` 'left' | 'center' | 'right'
        - `bannerBorderStyle` 'none' | 'block'
        - `countdownBorderStyle` 'none' | 'block'
        - `bannerSpacing` 'none' | 'tight' | 'loose'
        - `countdownSpacing` 'none' | 'tight' | 'loose'
        - `imageFit` 'cover' | 'contain'
        - `imageBorder` boolean
        - `pricingAppearance` 'default' | 'critical' | 'warning' | 'success'
        - `pricingEmphasized` boolean
        - `descriptionSubdued` boolean
        - `separatorWidth` 'xtight' | 'tight' | 'loose' | 'xloose'
        - `secondaryButtonStyle` 'default' | 'subdued' | 'plain'
    - `upsellProductRules` object[]: Rules that decide which products the block recommends. The first matching rule wins. Rules can't carry a discount when sent with an API key.
      - `priority` integer: Lower runs first; the first matching rule wins.
      - `when` object, required: Cart conditions that trigger this rule. Use a single `anything` condition for a rule that always applies.
        - `match` 'all' | 'any': `all` = every condition must hold (AND). `any` = at least one (OR).
        - `conditions` union[], required: The full condition list. This REPLACES the existing conditions wholesale — to add a second condition to a block, send both the existing one and the new one.
          - union: One cart condition. `anything` matches every cart and cannot be combined with other conditions.
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
      - `recommend` union, required: Where the block's recommended products come from: Shopify's own recommendations for the cart, a collection, a tag search, or an explicit product list.
        - object
          - `source` 'shopifyRecommendations', required
        - object
          - `source` 'collection', required
          - `collectionId` string, required: Collection to recommend from. Numeric id or gid from list_collections — the server normalizes it. A title or handle is rejected; look the collection up first. Singular because the renderer resolves only one collection per rule.
          - `tags` string[]: Optional: narrow the collection to products carrying ALL of these tags (ANDed) — unlike a tag-source rule, where the tags are ORed.
        - object
          - `source` 'tag', required
          - `tags` string[], required: Recommend products carrying ANY of these tags (they are ORed together).
        - object
          - `source` 'products', required
          - `products` object[], required: Explicit products, in display order. The server hydrates titles, images and prices from Shopify — do not invent them.
            - `productId` string, required: Numeric id or gid; the server normalizes it.
            - `variantIds` string[]: Variants to offer. Omit to offer every variant of the product.

## Response `200`

OK

- object
  - `block` union, required: The saved checkout block.
    - object
      - `id` string, uuid, required: Server-generated. Read-only.
      - `variationId` string, uuid, required: References the parent variation.
      - `locationId` string, required: Shopify checkout extensibility target location where the block renders.
      - `blockType` 'trustBadge', required
      - `blockTemplate` 'badgeList' | 'badgeTiles' | 'callOut' | 'grid' | 'header' | 'images' | 'brandLogo' | 'textOnly', nullable: The template preset this block was created from, within its block type. Null on blocks saved before templates were persisted, which callers must treat as unknown rather than assuming a default.
      - `name` string, required: Display name for identifying this block in the dashboard.
      - `displayConditions` object: Optional cart-based conditions; the block renders only when the expression evaluates true against the current cart.
        - `id` string, uuid, required
        - `expression` object[], required
          - `query` object
            - `key` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `type` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `filter` 'includes' | 'doesNotInclude' | 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` union
              - …
          - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
      - `variables` object, required: Configurable content for the trust badge (e.g., badge images, guarantee text).
        - `headerText` union, required
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `items` object[], required
          - `order` number, required
          - `title` union
            - string
            - object[]
              - …
          - `subtitle` union
            - string
            - object[]
              - …
          - `type` string, required
          - `icon` string, nullable
          - `iconColor` string, nullable
          - `iconSize` string, nullable
          - `imageSize` number, nullable, required
          - `imageSizeUnit` 'pixels' | 'percentage', required
          - `imageAspectRatio` string, nullable
          - `image` string, nullable
          - `mediaSpacing` string, required
      - `styles` object, required: CSS styling overrides for the trust badge appearance.
        - `typography` object, required
          - `header` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `itemTitle` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `itemSubtitle` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
        - `backgroundColors` object, required
          - `header` string, required
          - `item` string, required
          - `block` string, required
        - `colors` object, required
          - `headerText` string, required
          - `itemTitleText` string, required
          - `itemSubtitleText` string, required
        - `layout` object, required
          - `headerTextAlign` string, required
          - `bodyAlign` string, required
          - `itemTextAlign` string, required
          - `itemPositionAlign` string, required
          - `rowCount` integer, required
          - `columnCount` integer, required
        - `appearance` object, required
          - `headerBorderThickness` string, required
          - `headerBorderStyle` string, required
          - `headerCornerRadius` string, required
          - `headerPadding` string, required
          - `bodySpacing` string, required
          - `headingToBodySpacing` string, required
          - `blockBorderThickness` string, required
          - `blockBorderStyle` string, required
          - `blockPadding` string, required
          - `blockCornerRadius` string, required
          - `itemBorderThickness` string, required
          - `itemBorderStyle` string, required
          - `itemCornerRadius` string, required
          - `itemTextSpacing` string, required
    - object
      - `id` string, uuid, required: Server-generated. Read-only.
      - `variationId` string, uuid, required: References the parent variation.
      - `locationId` string, required: Shopify checkout extensibility target location where the block renders.
      - `blockType` 'upsell', required
      - `blockTemplate` 'productTiles' | 'productList' | 'singleProduct' | 'singleProductCheckbox', nullable: The template preset this block was created from, within its block type. Null on blocks saved before templates were persisted, which callers must treat as unknown rather than assuming a default.
      - `name` string, required: Display name for identifying this block in the dashboard.
      - `displayConditions` object: Optional cart-based conditions; the block renders only when the expression evaluates true against the current cart.
        - `id` string, uuid, required
        - `expression` object[], required
          - `query` object
            - `key` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `type` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `filter` 'includes' | 'doesNotInclude' | 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` union
              - …
          - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
      - `variables` object, required: Configurable content for the upsell block (e.g., product selection, heading text, CTA label).
        - `headerText` union, required
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `maxProductLimit` integer, required
        - `excludeItemsInCart` boolean, required
        - `excludeOutOfStock` boolean, required
        - `buttonText` string, required
        - `imageSize` number, required
        - `imageSizeUnit` 'pixels' | 'percentage', required
        - `imageAspectRatio` string, required
        - `mediaSpacing` string, required
        - `discount` object
          - `discountType` 'none' | 'percentage' | 'fixed', required
          - `discountValue` number, nullable
          - `compareAtPriceDisplay` 'none' | 'compareAtPrice' | 'regularPrice', required
      - `styles` object, required: CSS styling overrides for the upsell block appearance.
        - `typography` object, required
          - `header` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `productTitle` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `variantTitle` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `price` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `button` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
        - `backgroundColors` object, required
          - `header` string, required
          - `item` string, required
          - `block` string, required
          - `button` string, required
          - `productUnit` string, required
        - `colors` object, required
          - `headerText` string, required
          - `productText` string, required
          - `variantText` string, required
          - `priceText` string, required
          - `carouselArrowColor` string, required
          - `carouselArrowStyle` string, required
        - `layout` object, required
          - `headerTextAlign` string, required
          - `bodyAlign` string, required
          - `itemTextAlign` string, required
          - `itemPositionAlign` string, required
          - `mobile` object, required
            - `rowCount` integer, required
            - `columnCount` integer, required
          - `desktop` object, required
            - `rowCount` integer, required
            - `columnCount` integer, required
        - `appearance` object, required
          - `headerBorderThickness` string, required
          - `headerBorderStyle` string, required
          - `headerCornerRadius` string, required
          - `headerPadding` string, required
          - `bodySpacing` string, required
          - `headingToBodySpacing` string, required
          - `blockBorderThickness` string, required
          - `blockBorderStyle` string, required
          - `blockPadding` string, required
          - `blockCornerRadius` string, required
          - `productBorderThickness` string, required
          - `productBorderStyle` string, required
          - `productCornerRadius` string, required
          - `productTextSpacing` string, required
      - `upsellProductRules` object[], required: Product selection and recommendation rules that determine which products to show in this upsell block.
        - `id` string, uuid, required
        - `checkoutBlockId` string, uuid, required
        - `priority` integer, required
        - `cartTargeting` object, required
          - `id` string, uuid, required
          - `expression` object[], required
            - `query` object
              - …
            - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
        - `action` Schema0, required
          - `discountType` 'none' | 'percentage' | 'fixed', required
          - `discountValue` number, nullable
          - `compareAtPriceDisplay` 'none' | 'compareAtPrice' | 'regularPrice', required
          - `expression` object[], required
            - `query` object
              - …
            - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
          - `onAccept` Schema0 (recursive)
          - `onDecline` Schema0 (recursive)
        - `variationId` string, uuid, required
      - `agenticLogicPlacementId` string, uuid, nullable: Agentic Logic placement this block evaluates through. Absent means the legacy rule engine serves it — clearing the mapping is the per-surface rollback.
      - `agenticLogicRuleId` string, uuid, nullable: WRITE-SIDE intent: the Agentic Logic rule this block should serve. The experience save upserts the placement and the (placement, variation) assignment from it and stamps `agenticLogicPlacementId`, so callers never assemble that pair themselves. Null detaches the block and returns it to the legacy engine. Reads echo the rule currently assigned.
    - object
      - `id` string, uuid, required: Server-generated. Read-only.
      - `variationId` string, uuid, required: References the parent variation.
      - `locationId` string, required: Shopify checkout extensibility target location where the block renders.
      - `blockType` 'shippingProgressBar', required
      - `blockTemplate` 'minimal' | 'milestones', nullable: The template preset this block was created from, within its block type. Null on blocks saved before templates were persisted, which callers must treat as unknown rather than assuming a default.
      - `name` string, required: Display name for identifying this block in the dashboard.
      - `displayConditions` object: Optional cart-based conditions; the block renders only when the expression evaluates true against the current cart.
        - `id` string, uuid, required
        - `expression` object[], required
          - `query` object
            - `key` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `type` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `filter` 'includes' | 'doesNotInclude' | 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` union
              - …
          - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
      - `variables` object, required
        - `headerText` union
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `currency` string, required
        - `template` 'minimal' | 'milestones', required
        - `tiers` object[], required
          - `threshold` number, required
          - `message` union, required
            - string
            - object[]
              - …
          - `messageComplete` union, required
            - string
            - object[]
              - …
          - `activeIconId` string
          - `inactiveIconId` string
          - `breakpointText` union
            - string
            - object[]
              - …
      - `styles` object, required
        - `typography` object, required
          - `header` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `label` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
        - `backgroundColors` object, required
          - `header` string, required
          - `item` string, required
          - `block` string, required
          - `milestoneIcon` string, required
        - `colors` object, required
          - `headerText` string, required
          - `labelText` string, required
          - `barTone` string, required
        - `layout` object, required
          - `headerTextAlign` string, required
          - `bodyAlign` string, required
          - `itemTextAlign` string, required
          - `itemPositionAlign` string, required
          - `messageTextAlign` string, required
        - `appearance` object, required
          - `headerBorderThickness` string, required
          - `headerBorderStyle` string, required
          - `headerCornerRadius` string, required
          - `headerPadding` string, required
          - `bodySpacing` string, required
          - `headingToBodySpacing` string, required
          - `blockBorderThickness` string, required
          - `blockBorderStyle` string, required
          - `blockPadding` string, required
          - `blockCornerRadius` string, required
          - `milestoneIconCornerRadius` string, required
          - `milestoneIconSize` string, required
          - `milestoneIconPadding` string, required
    - object
      - `id` string, uuid, required: Server-generated. Read-only.
      - `variationId` string, uuid, required: References the parent variation.
      - `locationId` string, required: Shopify checkout extensibility target location where the block renders.
      - `blockType` 'timer', required
      - `blockTemplate` 'textCountdown' | 'digitalClock' | 'inlinePill', nullable: The template preset this block was created from, within its block type. Null on blocks saved before templates were persisted, which callers must treat as unknown rather than assuming a default.
      - `name` string, required: Display name for identifying this block in the dashboard.
      - `displayConditions` object: Optional cart-based conditions; the block renders only when the expression evaluates true against the current cart.
        - `id` string, uuid, required
        - `expression` object[], required
          - `query` object
            - `key` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `type` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `filter` 'includes' | 'doesNotInclude' | 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` union
              - …
          - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
      - `variables` object, required
        - `timerMode` 'fixedDate' | 'perVisitor' | 'recurring', required
        - `endDateTime` string, nullable
        - `durationMinutes` integer, required
        - `resetIntervalUnit` 'hour' | 'day' | 'week', nullable
        - `resetTimeOfDay` string, nullable
        - `resetDayOfWeek` union
          - 1
          - 2
          - 3
          - 4
          - 5
          - 6
          - 7
        - `resetMinuteOfHour` integer, nullable
        - `resetTimezone` string, nullable
        - `expiredBehavior` 'remove' | 'showText', required
        - `timerTemplate` 'textCountdown' | 'digitalClock' | 'inlinePill', required
        - `showDays` boolean, required
        - `showHours` boolean, required
        - `showMinutes` boolean, required
        - `showSeconds` boolean, required
        - `countdownText` union, required
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `expiredText` union, required
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `headline` union, required
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
      - `styles` object, required
        - `typography` object, required
          - `text` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
        - `backgroundColors` object, required
          - `block` string, required
          - `expired` string, required
        - `colors` object, required
          - `text` string, required
          - `expiredText` string, required
          - `digit` string, required
        - `layout` object, required
          - `textAlign` string, required
        - `appearance` object, required
          - `blockBorderStyle` string, required
          - `blockBorderThickness` string, required
          - `blockCornerRadius` string, required
          - `blockPadding` string, required
        - `digits` object, required
          - `separator` 'colon' | 'dot' | 'units', required
          - `size` 'small' | 'base', required
    - object
      - `id` string, uuid, required: Server-generated. Read-only.
      - `variationId` string, uuid, required: References the parent variation.
      - `locationId` string, required: Shopify checkout extensibility target location where the block renders.
      - `blockType` 'faqs', required
      - `blockTemplate` 'faqsAccordion', nullable: The template preset this block was created from, within its block type. Null on blocks saved before templates were persisted, which callers must treat as unknown rather than assuming a default.
      - `name` string, required: Display name for identifying this block in the dashboard.
      - `displayConditions` object: Optional cart-based conditions; the block renders only when the expression evaluates true against the current cart.
        - `id` string, uuid, required
        - `expression` object[], required
          - `query` object
            - `key` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `type` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `filter` 'includes' | 'doesNotInclude' | 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` union
              - …
          - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
      - `variables` object, required
        - `headerText` union
          - string
          - object[]
            - `text` string, required
            - `bold` boolean
            - `italic` boolean
            - `strike` boolean
            - `link` object
              - …
        - `showDivider` boolean, required
        - `allowMultipleOpen` boolean, required
        - `questions` object[], required
          - `id` string, required
          - `question` union, required
            - string
            - object[]
              - …
          - `answer` union, required
            - string
            - object[]
              - …
          - `openByDefault` boolean, required
      - `styles` object, required
        - `typography` object, required
          - `header` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `question` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `answer` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
        - `backgroundColors` object, required
          - `header` string, required
          - `item` string, required
          - `block` string, required
        - `colors` object, required
          - `headerText` string, required
          - `questionText` string, required
          - `answerText` string, required
        - `layout` object, required
          - `headerTextAlign` string, required
          - `bodyAlign` string, required
          - `itemTextAlign` string, required
          - `itemPositionAlign` string, required
        - `appearance` object, required
          - `headerBorderThickness` string, required
          - `headerBorderStyle` string, required
          - `headerCornerRadius` string, required
          - `headerPadding` string, required
          - `bodySpacing` string, required
          - `headingToBodySpacing` string, required
          - `blockBorderThickness` string, required
          - `blockBorderStyle` string, required
          - `blockPadding` string, required
          - `blockCornerRadius` string, required
    - object
      - `id` string, uuid, required: Server-generated. Read-only.
      - `variationId` string, uuid, required: References the parent variation.
      - `locationId` string, required: Shopify checkout extensibility target location where the block renders.
      - `blockType` 'postPurchaseUpsell', required
      - `blockTemplate` unknown
      - `name` string, required: Display name for identifying this block in the dashboard.
      - `displayConditions` object: Optional cart-based conditions; the block renders only when the expression evaluates true against the current cart.
        - `id` string, uuid, required
        - `expression` object[], required
          - `query` object
            - `key` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `type` 'anything' | 'productId' | 'collection' | 'tag' | 'cartSubtotal' | 'cartItemCount' | 'subscription', required
            - `filter` 'includes' | 'doesNotInclude' | 'greaterThan' | 'lessThan' | 'equalTo' | 'greaterThanOrEqual' | 'lessThanOrEqual' | 'between', required
            - `value` union
              - …
          - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
      - `variables` object, required
        - `headerText` string, required
        - `discountType` 'none' | 'percentage' | 'fixed', required
        - `discountValue` number, nullable
        - `compareAtPriceDisplay` 'none' | 'compareAtPrice' | 'regularPrice', required
        - `imageAspectRatio` string, required
        - `excludeOutOfStock` boolean, required
        - `excludeItemsInCart` boolean, required
        - `maxProductLimit` integer, required
        - `bannerEnabled` boolean, required
        - `bannerTitle` string
        - `bannerSubtitle` string
        - `customerFirstNameFallback` string
        - `compareAtPriceEnabled` boolean, required
        - `descriptionEnabled` boolean, required
        - `quantitySelectorEnabled` boolean, required
        - `quantityLabel` string
        - `maxQuantityType` string
        - `maxQuantity` integer
        - `moneyLineEnabled` boolean, required
        - `moneyLineSubtotal` boolean, required
        - `moneyLineShipping` boolean, required
        - `moneyLineTaxes` boolean, required
        - `primaryButtonText` string, required
        - `secondaryButtonEnabled` boolean, required
        - `secondaryButtonText` string, required
        - `headingLevel` string, required
        - `countdownTimerEnabled` boolean
        - `timerCheckout` object
          - `timerMode` 'fixedDate' | 'perVisitor' | 'recurring', required
          - `endDateTime` string, nullable
          - `durationMinutes` integer, required
          - `resetIntervalUnit` 'hour' | 'day' | 'week', nullable
          - `resetTimeOfDay` string, nullable
          - `resetDayOfWeek` union
            - 1
            - 2
            - 3
            - 4
            - 5
            - 6
            - 7
          - `resetMinuteOfHour` integer, nullable
          - `resetTimezone` string, nullable
          - `expiredBehavior` 'remove' | 'showText', required
          - `timerTemplate` 'textCountdown' | 'digitalClock' | 'inlinePill', required
          - `showDays` boolean, required
          - `showHours` boolean, required
          - `showMinutes` boolean, required
          - `showSeconds` boolean, required
          - `countdownText` string, required
          - `expiredText` string, required
          - `headline` string, required
        - `offerTimeout` number
        - `discount` object
          - `discountType` 'none' | 'percentage' | 'fixed', required
          - `discountValue` number, nullable
          - `compareAtPriceDisplay` 'none' | 'compareAtPrice' | 'regularPrice', required
      - `styles` object, required
        - `typography` object, required
          - `banner` object
            - `fontSize` string, required
            - `fontStyle` string, required
          - `productTitle` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `price` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `description` object
            - `fontSize` string, required
            - `fontStyle` string, required
          - `primaryButton` object, required
            - `fontSize` string, required
            - `fontStyle` string, required
          - `secondaryButton` object
            - `fontSize` string, required
            - `fontStyle` string, required
        - `backgroundColors` object, required
          - `banner` string, required
          - `primaryButton` string, required
          - `secondaryButton` string
          - `countdown` string
          - `expired` string
        - `colors` object, required
          - `bannerText` string
          - `productText` string, required
          - `priceText` string, required
          - `descriptionText` string
          - `primaryButtonText` string, required
          - `secondaryButtonText` string
          - `expiredText` string
        - `appearance` object, required
          - `bannerBorderStyle` string, required
          - `bannerSpacing` string, required
          - `bannerTextAlign` string, required
          - `separatorWidth` string, required
          - `imageFit` string, required
          - `imageBorder` boolean, required
          - `pricingAppearance` string
          - `pricingEmphasized` boolean, required
          - `pricingSubduedStyle` boolean
          - `descriptionSubdued` boolean, required
          - `secondaryButtonStyle` string, required
          - `countdownTextAlign` string
          - `countdownBorderStyle` string
          - `countdownSpacing` string
      - `upsellProductRules` object[], required: Product selection and recommendation rules that determine which products to show in this upsell block.
        - `id` string, uuid, required
        - `checkoutBlockId` string, uuid, required
        - `priority` integer, required
        - `cartTargeting` object, required
          - `id` string, uuid, required
          - `expression` object[], required
            - `query` object
              - …
            - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
        - `action` Schema0, required
          - `discountType` 'none' | 'percentage' | 'fixed', required
          - `discountValue` number, nullable
          - `compareAtPriceDisplay` 'none' | 'compareAtPrice' | 'regularPrice', required
          - `expression` object[], required
            - `query` object
              - …
            - `operator` 'and' | 'or' | 'start_paren' | 'end_paren'
          - `onAccept` Schema0 (recursive)
          - `onDecline` Schema0 (recursive)
        - `variationId` string, uuid, required
      - `agenticLogicPlacementId` string, uuid, nullable: Agentic Logic placement this block evaluates through. Absent means the legacy rule engine serves it — clearing the mapping is the per-surface rollback.
      - `agenticLogicRuleId` string, uuid, nullable: WRITE-SIDE intent: the Agentic Logic rule this block should serve. The experience save upserts the placement and the (placement, variation) assignment from it and stamps `agenticLogicPlacementId`, so callers never assemble that pair themselves. Null detaches the block and returns it to the legacy engine. Reads echo the rule currently assigned.
  - `adjustments` string[]: Changes the API made on its own, such as a post-purchase upsell's follow-up rules, or the products a new upsell or post-purchase upsell starts with when the request sends no rules. Absent when there are none.

## 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)
