Search Documentation
Search for a documentation page...
Bundles API
REST API endpoints for managing product bundles.
Bundles group existing product variants into a single purchasable package, sold at a discount versus buying each item separately. Each bundle is composed of one or more variants with a quantity and display position, plus an optional discountPercentage applied against the sum of the constituent prices.
List Bundles
Returns lightweight bundle list items (no full composition). Fetch a single bundle to get its constituent products.
Query Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
limit | number | 50 | Bundles per page (1-100) |
offset | number | 0 | Bundles to skip |
Response (200)
Get Bundle
Returns a single bundle by UUID, including its constituent products.
Response (200)
Tax rate
taxRate is the bundle's own rate — the one a grouped bundle is taxed at, whatever rates its constituent products carry. null means the bundle sells untaxed. Set it with taxRateId on create or update, usually to the rate its items share.
| Field | Type | Description |
|---|---|---|
taxRate.id | string | Tax rate UUID |
taxRate.name | string | Tax rate name, e.g. VAT 23% |
taxRate.rate | number | Rate as a 0-100 percentage |
taxRate.label | string | null | Optional label shown to shoppers |
Create Bundle
Creates a product bundle composed of existing variants. Slug is auto-generated from the name if omitted and must be unique.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Bundle name |
slug | string | No | URL slug, lowercase (a-z0-9-); auto-generated from name if omitted |
summary | string | No | Short summary |
seo | object | No | SEO metadata (title, description, canonical) |
images | string[] | No | Bundle image URLs |
discountPercentage | number | No | Discount vs. the sum of constituent prices (0-100) |
taxRateId | string | No | Tax rate UUID applied to this bundle (create one with POST /api/v1/tax-rates); pass null to clear. A bundle without one sells untaxed |
status | string | No | Publication status: draft, published, or hidden |
variants | object[] | No | Variants that make up the bundle (see below) |
Variant Object
| Field | Type | Required | Description |
|---|---|---|---|
variantId | string | Yes | Variant UUID to include in the bundle |
quantity | number | No | How many of this variant the bundle contains (default: 1) |
position | number | No | Display order within the bundle (default: 0) |
Response (201)
Returns the created bundle with full composition (same shape as Get Bundle). Returns 409 if a bundle with the same slug already exists.
Update Bundle
Partially updates a bundle. Provided fields change; omitted fields are preserved. Passing variants replaces the entire composition.
Request Body
All fields from Create Bundle are accepted and optional.
Response (200)
Returns the updated bundle with full composition.
Delete Bundle
Hard-deletes the bundle by UUID. The composition is cascade-removed; the underlying products and variants are untouched.