Bundles

Bundles group product variants sold together as a single sellable unit: a meal combo, a starter kit, a multi-pack. A bundle has its own price, SKU, image, tax settings, and categories, independent of its components. Each component references a product variant with a quantity and display position.

Bundles are sellable the same way variants are: pass a bundle_id on an order line item and Flint resolves price and display from the catalog. available_for_sale reflects catalog eligibility, meaning every component is active and sellable; it is not a stock guarantee. Flint checks and reserves each component's inventory when the order flow creates its stock claim. Use inventory levels to inspect stock at each Location. Bundles can also carry a modifier set for buyer customization.

Create components with the bundle, or replace the complete components array in a bundle update with the bundle's current version as expected_version. Include a returned bundle_component_id to keep and update an existing member. Omitting a component removes it. Bundle categories and images use the same fenced, full-replacement pattern.

Each component carries a variant summary with the variant's name, sku, and product_name, so you can label a component without a second read of the product. A component whose variant no longer exists reports only its variant_id.

The bundle list omits components. Every bundle reports component_count, including 0, so a list row can show how many components a bundle holds; retrieve the bundle by ID for the components themselves.

Use the exact sku filter on the bundle list to find a bundle by SKU. Archived bundles remain available by ID and are excluded from list results unless you request status=archived.

The Bundle object#

Every field on a bundle, as returned by retrieve and carried by the endpoints below.

Attributes

available_for_salebooleanRequired
barcodestring
bundle_idstringRequired
categoriesarray of object
component_countintegerRequired

Number of components in the bundle. List responses omit `components`, so use this to show a bundle's size.

componentsarray of object
created_atstring

RFC3339 timestamp.

delivery_configuration_statusenumRequired
  • configured
  • action_required
  • not_applicable
descriptionstring
external_reference_idstring

Caller-owned identifier for this resource in an external system.

imagesarray of objectRequired
line_item_tax_categoryenum

Flint line-item tax category.

  • general
  • physical_goods
  • digital_goods
  • software
  • saas
  • services
  • professional_services
  • food
  • prepared_food
  • clothing
  • medical_goods
  • admission
merchant_idstring
metadatamap of string
modifier_setobject or null
modifier_set_idstring or nullRequired

Attached modifier set. Send null on update to remove it.

namestringRequired
skustring
statusenumRequired
  • active
  • inactive
  • archived
taxableboolean
unit_price_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

updated_atstring

RFC3339 timestamp.

versionintegerRequired
JSON
{
  "available_for_sale": true,
  "bundle_id": "bun_123",
  "component_count": 2,
  "components": [
    {
      "bundle_component_id": "bunc_123",
      "delivery_configuration_status": "not_applicable",
      "position": 0,
      "product_id": "prod_123",
      "quantity": 1,
      "variant": {
        "available_for_sale": true,
        "name": "Default",
        "product_name": "Saturday admission",
        "variant_id": "var_123"
      },
      "variant_id": "var_123"
    },
    {
      "bundle_component_id": "bunc_456",
      "delivery_configuration_status": "not_applicable",
      "position": 1,
      "product_id": "prod_456",
      "quantity": 1,
      "variant": {
        "available_for_sale": true,
        "name": "Default",
        "product_name": "Sunday admission",
        "variant_id": "var_456"
      },
      "variant_id": "var_456"
    }
  ],
  "created_at": "2026-03-17T14:30:00Z",
  "delivery_configuration_status": "not_applicable",
  "images": [],
  "merchant_id": "mer_123",
  "modifier_set_id": null,
  "name": "Weekend pass",
  "status": "active",
  "unit_price_money": {
    "amount": 4500,
    "currency": "USD"
  },
  "updated_at": "2026-03-17T14:30:00Z",
  "version": 1
}

List bundles#

GET/v1/bundles

Requires scope commerce.bundles.read or commerce.bundles.write

List bundles.

Query parameters

page_sizeinteger

Page size, default 20, max 100.

page_tokenstring

Cursor returned by the previous list response.

external_reference_idstring

Exact-match filter on the caller-owned external reference ID.

skustring

Filter by exact SKU.

querystring

Search across bundle ID, external reference ID, name, description, SKU, and barcode. Text fields match any part of the value, and %, _ and \ are ordinary characters, not wildcards. IDs match from the start and need the type prefix, such as ord_01.

category_handlestring

Filter by category handle.

statusenum

Filter by bundle status.

  • active
  • inactive
  • archived
sort_byenum

Sort field.

  • created_at
  • updated_at
  • name
sort_directionenum

Sort direction.

  • asc
  • desc
delivery_profile_idstring

Filter bundles with at least one component assigned to this delivery profile.

delivery_configuration_statusenum

Filter by aggregated delivery readiness across bundle components.

  • configured
  • action_required
  • not_applicable

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/bundles \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [
    {
      "available_for_sale": true,
      "bundle_id": "bun_123",
      "component_count": 2,
      "created_at": "2026-03-17T14:30:00Z",
      "delivery_configuration_status": "not_applicable",
      "images": [],
      "merchant_id": "mer_123",
      "modifier_set_id": null,
      "name": "Weekend pass",
      "status": "active",
      "unit_price_money": {
        "amount": 4500,
        "currency": "USD"
      },
      "updated_at": "2026-03-17T14:30:00Z",
      "version": 1
    }
  ],
  "next_page_token": "example",
  "request_id": "bce56cba-0827-44aa-bb56-4f200ba15ee6"
}

Create bundle#

POST/v1/bundlesIdempotent

Requires scope commerce.bundles.write

Create bundle.

Request body

barcodestring
categoriesarray of string
componentsarray of object
descriptionstring
external_reference_idstring

Caller-owned identifier for this resource in an external system.

imagesarray of object

The complete desired gallery in display order. The first image is primary. Send [] to clear the gallery.

line_item_tax_categoryenum

Flint line-item tax category.

  • general
  • physical_goods
  • digital_goods
  • software
  • saas
  • services
  • professional_services
  • food
  • prepared_food
  • clothing
  • medical_goods
  • admission
metadatamap of string
modifier_set_idstring or null

Attached modifier set. Send null on update to remove it.

namestringRequired
skustring
statusenum
  • active
  • inactive
taxableboolean
unit_price_moneyobjectRequired

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

Response · 201

dataobjectRequired
metaobject
request_idstring
curl -X POST https://api.withflintpay.com/v1/bundles \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "components": [
      {
        "quantity": 1,
        "variant_id": "var_123"
      },
      {
        "quantity": 1,
        "variant_id": "var_456"
      }
    ],
    "name": "Weekend pass",
    "status": "active",
    "unit_price_money": {
      "amount": 4500,
      "currency": "USD"
    }
  }'
curl https://api.withflintpay.com/v1/bundles/bun_123 \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": {
    "available_for_sale": true,
    "bundle_id": "bun_123",
    "component_count": 2,
    "components": [
      {
        "bundle_component_id": "bunc_123",
        "delivery_configuration_status": "not_applicable",
        "position": 0,
        "product_id": "prod_123",
        "quantity": 1,
        "variant": {
          "available_for_sale": true,
          "name": "Default",
          "product_name": "Saturday admission",
          "variant_id": "var_123"
        },
        "variant_id": "var_123"
      },
      {
        "bundle_component_id": "bunc_456",
        "delivery_configuration_status": "not_applicable",
        "position": 1,
        "product_id": "prod_456",
        "quantity": 1,
        "variant": {
          "available_for_sale": true,
          "name": "Default",
          "product_name": "Sunday admission",
          "variant_id": "var_456"
        },
        "variant_id": "var_456"
      }
    ],
    "created_at": "2026-03-17T14:30:00Z",
    "delivery_configuration_status": "not_applicable",
    "images": [],
    "merchant_id": "mer_123",
    "modifier_set_id": null,
    "name": "Weekend pass",
    "status": "active",
    "unit_price_money": {
      "amount": 4500,
      "currency": "USD"
    },
    "updated_at": "2026-03-17T14:30:00Z",
    "version": 1
  },
  "request_id": "bce56cba-0827-44aa-bb56-4f200ba15ee6"
}

Update bundle#

PATCH/v1/bundles/{bundle_id}Idempotent

Requires scope commerce.bundles.write

Update bundle.

Path parameters

bundle_idstringRequired

Flint bundle ID.

Request body

barcodestring
categoriesarray of string
componentsarray of object

Replaces all bundle components atomically. Include an existing bundle_component_id to retain a member. Omitted members are removed. Null is not accepted.

descriptionstring
expected_versioninteger

Resource version last read by the caller. Required when replacing an owned collection.

external_reference_idstring

Caller-owned identifier for this resource in an external system.

imagesarray of object

The complete desired gallery in display order. The first image is primary. Send [] to clear the gallery.

line_item_tax_categoryenum

Flint line-item tax category.

  • general
  • physical_goods
  • digital_goods
  • software
  • saas
  • services
  • professional_services
  • food
  • prepared_food
  • clothing
  • medical_goods
  • admission
metadatamap of string or null

Caller-owned metadata. Omit this field to leave metadata unchanged. Send an object to merge by key, set a key to null to remove it, or set metadata to null to clear all metadata. An empty object makes no change. Empty strings are stored. Keys starting with flint_ are reserved and cannot be written through the public API.

modifier_set_idstring or null

Attached modifier set. Send null on update to remove it.

namestring
skustring
statusenum
  • active
  • inactive
taxableboolean
unit_price_moneyobject

Monetary amount represented as integer minor units plus an ISO 4217 currency code.

Response · 200

Same response as Create bundle.

curl -X PATCH https://api.withflintpay.com/v1/bundles/bun_123 \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a-unique-key" \
  -d '{
    "expected_version": 1,
    "name": "Weekend admission pass"
  }'
curl -X DELETE https://api.withflintpay.com/v1/bundles/bun_123 \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"

List bundle components#

GET/v1/bundles/{bundle_id}/components

Requires scope commerce.bundles.read or commerce.bundles.write

List bundle components.

Path parameters

bundle_idstringRequired

Flint bundle ID.

Query parameters

page_sizeinteger

Page size, default 20, max 100.

page_tokenstring

Cursor returned by the previous list response.

delivery_profile_idstring

Filter by assigned delivery profile ID.

delivery_configuration_statusenum

Filter by delivery readiness.

  • configured
  • action_required
  • not_applicable

Response · 200

dataarray of objectRequired
metaobject
next_page_tokenstring
request_idstring
curl https://api.withflintpay.com/v1/bundles/bun_123/components \
  -H "Flint-Version: 2026-09-07" \
  -H "Authorization: Bearer YOUR_API_KEY"
JSON
{
  "data": [],
  "next_page_token": "example",
  "request_id": "bce56cba-0827-44aa-bb56-4f200ba15ee6"
}

Was this helpful?