Skip to content
Kitenzo Headless is currently invite-only. To enable it on your store, email support@kitenzo.com.

Endpoints

All paths are relative to https://live.bb.eight-cdn.com/api/headless/v1 and require Authorization: Bearer kit_live_….


GET /bundles

Returns published bundles (capped at 100). Lightweight — no sections or product data.

Response 200

[
{
"id": 42,
"name": "Build your own box",
"description": "Pick any 3 items",
"imageUrl": "https://cdn.shopify.com/…",
"type": "native",
"bundlingOption": "bundles",
"published": true
}
]
FieldTypeDescription
idnumberBundle ID.
namestringDisplay name.
descriptionstringMerchant description (may be empty).
imageUrlstringBundle image (may be empty).
typestringsingle-product | multiple-products | native.
bundlingOptionstringbundles or upsells.
publishedbooleanAlways true here.

GET /bundles/:id

Full configuration: sections, discount, limit rules, required products and the conditions-engine signal. Product/variant detail comes from the products endpoint.

Response 200

{
"id": 42,
"name": "Build your own box",
"description": "Pick any 3 items",
"imageUrl": "https://cdn.shopify.com/…",
"type": "native",
"bundlingOption": "bundles",
"layout": "multiple-sections",
"published": true,
"discount": {
"type": "percentage",
"value": "10.00",
"flatOrTiered": "flat",
"minimum": null,
"operator": null,
"tiers": []
},
"sections": [
{
"id": 1,
"name": "Choose a shirt",
"description": "",
"imageUrl": "",
"order": 0,
"products": [
{ "bundleItemId": 7, "shopifyProductId": "111", "variantIds": ["1001", "1002"] }
]
}
],
"requiredProducts": [
{ "shopifyProductId": "222", "variantIds": [], "quantity": 1 }
],
"limitRules": [
{ "type": "total-number-of-products", "operation": "gte", "value": "3", "sectionId": null }
],
"conditionsEngineEnabled": false
}
FieldTypeDescription
layoutstringsingle-page | multiple-sections.
discountobject | nullSee Discounts.
sections[]arrayid, name, description, imageUrl, order, products[].
sections[].products[]arraybundleItemId, shopifyProductId, variantIds[] (empty = all variants allowed).
requiredProducts[]arrayshopifyProductId, variantIds[], quantity.
limitRules[]arraytype, operation, value, sectionId. See Limit rules.
conditionsEngineEnabledbooleanWhether the bundle has conditional free-item logic.

GET /bundles/:id/products

Full product and variant data for the bundle — live pricing, SKU, availability and inventory.

Response 200

{
"products": [
{
"shopifyProductId": "111",
"shopifyProductGid": "gid://shopify/Product/111",
"title": "Classic Tee",
"handle": "classic-tee",
"imageUrl": "https://cdn.shopify.com/…",
"variants": [
{
"shopifyVariantId": "1001",
"shopifyVariantGid": "gid://shopify/ProductVariant/1001",
"title": "Small / Black",
"price": "29.99",
"sku": "TEE-S-BLK",
"available": true,
"inventoryQuantity": 42
}
]
}
]
}

See Sections, products & variants for the availability rules.


POST /bundles/:id/configure

Validates a customer’s selection, creates a configured bundle, and returns the data needed to add it to the Shopify cart.

Request body

{
"type": "native",
"products": [
{ "variant": "1001", "product": "111", "section": 1 },
{ "variant": "1002", "product": "111", "section": 1 }
],
"countryCode": "US"
}
FieldTypeRequiredDescription
typestringYesnative | multiple-products | single-product.
productsarrayYesNon-empty list; each item needs variant, product, section. Max 200.
countryCodestringNoFor market-aware pricing.

Response 200

{
"configured_bundle_id": 9876,
"variant_id": "44556677",
"product_id": "111",
"discount": "<encrypted-discount-string>",
"subscription_id": null,
"pricing": {
"originalPrice": "59.98",
"discountedPrice": "53.98",
"discountType": "percentage",
"discountValue": "10.00",
"currency": "USD"
}
}
FieldTypeDescription
configured_bundle_idnumberThe configured bundle’s ID.
variant_idstringShopify variant to add to cart.
product_idstringShopify product for the bundle.
discountstringEncrypted discount string (for native bundles’ cart transform).
subscription_idnumber | nullSet when a recurring subscription option was chosen.
pricingobjectSame shape as the price endpoint.

POST /bundles/:id/price

Calculates pricing for a selection without creating a configured bundle. Same request body as /configure.

Response 200

{
"originalPrice": "59.98",
"discountedPrice": "53.98",
"discountType": "percentage",
"discountValue": "10.00",
"currency": "USD"
}

GET /settings

Response 200

{
"activeFeatures": ["headless_api", "subscriptions"],
"currency": "USD",
"moneyFormat": "${{amount}}"
}
FieldTypeDescription
activeFeaturesstring[]Enabled Kitenzo features for the shop.
currencystringShop currency code.
moneyFormatstringShopify money format string (used by formatMoney).