🔗Public APIs for Quantity Breaks (QB)
🔐 Get Your Access Key
After installing the B2B/Wholesale Solution Shopify app:
Open the Public API page
Click Copy to copy your Access Key
Use this key in request bodies shown below.
🧱 Rule Model — Fields & Enums
Understand these fields before calling the endpoints:
priority Determines which rule takes precedence over others.
status
0: inactive
1: activeapply_to
0: All customers
1: Logged-in customers
2: Not-logged-in customers
3: Specific customers
4: Customer tagsexclude_customer
0: None
1: Customer tags
2: Specific customersproduct_condition_type
0: All products
1: Specific products
2: Product collections
3: Product tags
4: Specific variantsexc_product_type
0: None
1: Specific products
2: Product collections
3: Product tagsrule_setting
0: Quantity break
1: Amount breakqb_table_type
0: Full range & Discounts
1: Full range & Discounted prices
2: From & Discounts
3: From & Discounted prices 1
4: From & Discounted prices 2
5: From & Discounts with Discounted prices 1
6: From & Discounts with Discounted prices 2
7: Legacy 1
8: Legacy 2Note
When you get rules by domain or ID,
rule_settingappears in the response to indicate whether a rule is Quantity Break or Amount Break.When you create/update a rule,
rule_settingwill be Quantity Break by default (create/update Amount Break is not supported as of now).
📊 qty_table — Quantity Settings
qty_table — Quantity Settingsrule_type
0: Minimum Product Qty
1: Minimum Order Qty
2: Minimum Variant QtyBehavior explanations (verbatim logic):
Minimum Product Qty If one order contains the selected products and the number of each product meets the quantity break ranges, the price of the product will be discounted accordingly. Example: Products A (variants A1, A2) and B (variants B1, B2) are selected. Ranges: 0–5 (−10%), 6–10 (−15%). If a customer buys 3×A1, 6×A2, 4×B1 → Total A qty = 9 → A gets −15%, B gets −10%. If qty is not within ranges, original prices apply.
Minimum Order Qty If one order contains the selected products and the total number of those products meets the ranges, they will be discounted accordingly. Example: Products A, B; A has A1, A2, B has B1, B2. Ranges: 0–5 (−10%), 6–10 (−15%), 11–20 (−20%). If customer buys 3×A1, 6×A2, 4×B1 → Total A+B qty = 13 → A & B get −20%. If qty not within ranges, original prices apply.
Minimum Variant Qty If one order contains the selected products and the number of variants meets the ranges, those variants are discounted accordingly. Example: Products A, B; variants A1, A2, B1, B2. Ranges: 0–5 (−10%), 6–10 (−15%), 11–20 (−20%). If customer buys 3×A1, 6×A2, 4×B1 → A1 & B1 get −10%, A2 gets −15%. If qty not within ranges, original prices apply.
Range fields
qty_from: lower bound of a rangeqty_to: upper bound of a range
discount_type
0: Apply a price to selected products
1: Decrease a fixed amount of the original prices of selected products
2: Decrease the original prices of selected products by a percentage (%)📥 Rule Endpoints
Get rules by domain
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/get-by-domainHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx"
}Response 200 (excerpt)
{
"success": true,
"rules": [
{
"id": 9792,
"shop_id": 9204,
"name": "sencond1",
"priority": 0,
"rule_type": 2,
"rule_setting": 0,
"status": 1,
"apply_to": 0,
"customer_ids": [],
"customer_tags": [],
"product_condition_type": 0,
"product_ids": [],
"product_collections": [],
"product_tags": [],
"varianst_id": [],
"exc_product_type": 1,
"exc_specific_products": [6669588136111, 6669469352111],
"exc_product_collections": [],
"exc_product_tags": [],
"published_at": null,
"unpublished_at": null,
"exc_customer_tags": "",
"exclude_from": 0,
"exc_customers": "",
"qb_table_type": 3,
"createdAt": "2023-03-09T02:27:26.000Z",
"updatedAt": "2023-05-30T04:29:18.000Z",
"qbRuleQtyTables": [
{
"id": 33022,
"rule_id": 9792,
"qty_from": 1,
"qty_to": 4,
"discount_type": 0,
"discount_value": 10,
"createdAt": "2023-05-26T04:26:21.000Z",
"updatedAt": "2023-05-26T04:26:21.000Z"
},
{
"id": 33023,
"rule_id": 9792,
"qty_from": 6,
"qty_to": 8,
"discount_type": 1,
"discount_value": 10,
"createdAt": "2023-05-26T04:26:21.000Z",
"updatedAt": "2023-05-26T04:26:21.000Z"
}
],
"abRuleQtyTables": []
},
{
"id": 9909,
"shop_id": 9204,
"name": "sencond2",
"priority": 0,
"rule_type": 2,
"rule_setting": 0,
"status": 1,
"apply_to": 0,
"customer_ids": [],
"customer_tags": [],
"product_condition_type": 4,
"product_ids": [],
"product_collections": [],
"product_tags": [],
"variants_ids": [4908909872990, 8799990863829],
"exc_product_type": 0,
"exc_specific_products": [],
"exc_product_collections": [],
"exc_product_tags": [],
"published_at": null,
"unpublished_at": null,
"exc_customer_tags": null,
"exclude_from": 0,
"exc_customers": null,
"qb_table_type": 0,
"createdAt": "2023-03-13T09:39:48.000Z",
"updatedAt": "2023-05-26T04:26:21.000Z",
"qbRuleQtyTables": [
{
"id": 33024,
"rule_id": 9909,
"qty_from": 1,
"qty_to": 4,
"discount_type": 0,
"discount_value": 10,
"createdAt": "2023-05-26T04:26:21.000Z",
"updatedAt": "2023-05-26T04:26:21.000Z"
},
{
"id": 33025,
"rule_id": 9909,
"qty_from": 6,
"qty_to": 8,
"discount_type": 1,
"discount_value": 11,
"createdAt": "2023-05-26T04:26:21.000Z",
"updatedAt": "2023-05-26T04:26:21.000Z"
}
],
"abRuleQtyTables": []
}
]
}Get rules by ID
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/get-by-idHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"id": 46
}Response 200 (excerpt)
{
"success": true,
"rule": {
"id": 46,
"name": "sencond1",
"priority": 0,
"status": 1,
"apply_to": 0,
"customer_ids": [],
"customer_tags": [],
"exclude_from": 0,
"exc_customers": [],
"exc_customer_tags": [],
"product_condition_type": 0,
"product_ids": [],
"product_collections": [],
"product_tags": [],
"variant_ids": [],
"exc_product_type": 3,
"exc_specific_products": [],
"exc_product_tags": ["babytshirt", "gaminggear"],
"exc_product_collections": [],
"rule_setting": 0,
"rule_type": 2,
"qty_table": [
{
"id": 33022,
"rule_id": 9792,
"qty_from": 1,
"qty_to": 4,
"discount_type": 0,
"discount_value": 10,
"createdAt": "2023-05-26T04:26:21.000Z",
"updatedAt": "2023-05-26T04:26:21.000Z"
},
{
"id": 33023,
"rule_id": 9792,
"qty_from": 6,
"qty_to": 8,
"discount_type": 1,
"discount_value": 10,
"createdAt": "2023-05-26T04:26:21.000Z",
"updatedAt": "2023-05-26T04:26:21.000Z"
}
],
"amount_table": [],
"qb_table_type": 3,
"createdAt": "2023-03-09T02:27:26.000Z",
"updatedAt": "2023-05-30T04:29:18.000Z"
}
}Create or Update a single rule
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/saveHeaders
Content-Type: application/jsonRules
If there’s no
id, a new rule is created.If
idis present, that rule is updated.If
"product_condition_type" = 4(specific variants), thenrule_typemust not be0(minimum product qty).
Body
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"rule": {
"id": 11,
"name": "sencond1",
"priority": 0,
"status": 1,
"apply_to": 0,
"customer_ids": [],
"customer_tags": [],
"exclude_from": 0,
"exc_customers": [],
"exc_customer_tags": [],
"product_condition_type": 0,
"product_ids": [],
"product_collections": [],
"product_tags": [],
"variant_ids": [],
"exc_product_type": 1,
"exc_specific_products": [4766764787771, 4766764787752],
"exc_product_tags": [],
"exc_product_collections": [],
"rule_setting": 0,
"rule_type": 2,
"qty_table": [
{ "qty_from": 1, "qty_to": 4, "discount_type": 0, "discount_value": 10 },
{ "qty_from": 6, "qty_to": 8, "discount_type": 1, "discount_value": 10 }
],
"amount_table": [],
"qb_table_type": 1
}
}Response 200
{
"success": true,
"ruleId": 11,
"message": "Updated the rule successfully"
}Create or Update multiple rules
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/bulk-saveHeaders
Content-Type: application/jsonRules
If a rule has no
id, it will be created.If a rule has an
id, it will be updated.If an
idis incorrect/not found inside the batch, those rules will not be created/updated.
Body (excerpt)
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"rules": [
{
"name": "sencond1",
"priority": 0,
"status": 1,
"apply_to": 0,
"product_condition_type": 0,
"customer_ids": [],
"customer_tags": [],
"product_ids": [],
"product_collections": [],
"product_tags": [],
"variant_ids": [],
"exc_customer_tags": "",
"exclude_from": 0,
"exc_customers": "",
"exc_product_type": 0,
"exc_specific_products": [],
"exc_product_tags": [],
"exc_product_collections": [],
"rule_type": 2,
"rule_setting": 0,
"qty_table": [
{ "qty_from": 1, "qty_to": 4, "discount_type": 0, "discount_value": 10 },
{ "qty_from": 6, "qty_to": 8, "discount_type": 1, "discount_value": 10 }
],
"amount_table": [],
"qb_table_type": 4
},
{
"id": 9909,
"name": "sencond2",
"priority": 0,
"status": 1,
"apply_to": 0,
"product_condition_type": 0,
"customer_ids": [],
"customer_tags": [],
"product_ids": [],
"product_collections": [],
"product_tags": [],
"variant_ids": [],
"exc_customer_tags": "",
"exclude_from": 0,
"exc_customers": "",
"exc_product_type": 2,
"exc_specific_products": [],
"exc_product_collections": [265680552111, 318279188655, 318279254191, 318279221423, 265681010863],
"exc_product_tags": [],
"rule_type": 2,
"rule_setting": 0,
"qty_table": [
{ "qty_from": 1, "qty_to": 4, "discount_type": 0, "discount_value": 10 },
{ "qty_from": 6, "qty_to": 8, "discount_type": 1, "discount_value": 11 }
],
"amount_table": [],
"qb_table_type": 4
}
]
}Response 200
{
"success": true,
"message": [
"Rule second1 has been created successfully",
"Rule second2 has been updated successfully"
]
}Delete rule
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/deleteHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"id": 79
}Response 200
{
"success": true,
"message": "Deleted rule successfully"
}Delete multiple rules
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/mass-deleteHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"ids": [79, 80, 81]
}Response 200
{
"success": true,
"message": "Deleted multiple qb rule successfully"
}Get Applied Rules for Products
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/get-products-applied-rulesHeaders
Content-Type: application/jsonBehavior
If customer_id is null, the system checks rules that apply to All customers or Not-logged-in customers.
Body
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"product_ids": [6103930831040, 6103930929344],
"customer_id": 5110452355264
}Response 200 (excerpt)
{
"success": true,
"productsAppliedRule": [
{
"id": "6103930831040",
"rule_name": "first",
"rule_id": 51,
"qty_table": [
{ "id": 47, "qty_from": 1, "qty_to": 3, "discount_type": 0, "discount_value": 10,
"createdAt": "2021-09-16T08:41:14.000Z", "updatedAt": "2021-09-16T08:41:14.000Z" },
{ "id": 48, "qty_from": 6, "qty_to": 7, "discount_type": 1, "discount_value": 10,
"createdAt": "2021-09-16T08:41:14.000Z", "updatedAt": "2021-09-16T08:41:14.000Z" }
]
}
]
}Get Price List of Variants based on Applied Rules
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/qb/get-variants-price-listHeaders
Content-Type: application/jsonBehavior
If customer_id is null, the system checks Custom Pricing rules that apply to All or Not-logged-in customers.
Body
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"product_ids": [6103930831040, 6103930929344],
"customer_id": 5110452355264
}Response 200 (excerpt)
{
"success": true,
"priceList": [
{
"id": "6103930831040",
"rule_name": "first",
"rule_id": 52,
"variants": [
{
"id": "37682508955840",
"price": "36.00",
"compareAtPrice": null,
"appliedRulePrice": [
{ "qty_from": 6, "qty_to": 7, "discount_type": 1, "discount_value": 10, "modifiedPrice": 90 },
{ "qty_from": 1, "qty_to": 3, "discount_type": 0, "discount_value": 10, "modifiedPrice": 10 }
]
}
]
}
]
}🧭 Product Endpoints
Search products
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/product/searchHeaders
Content-Type: application/jsonCursoring
afterIndex is a cursor. If afterIndex is null, search starts from the beginning. Example:
eyJsYXN0X2lkIjo2NjU1NDU2Mzc5MDUzLCJsYXN0X3ZhbHVlIjo2NjU1NDU2Mzc5MDUzfQ==Body
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"afterIndex": null,
"first": 20,
"searchQuery": "ocean"
}Response 200 (excerpt)
{
"success": true,
"productList": {
"edges": [ { "node": { "id": "gid://shopify/Product/6586580271277", "title": "Ocean Blue Shirt", ... },
"cursor": "eyJsYXN0X2lkIjo2NTg2NTgwMjcxMjc3LCJsYXN0X3ZhbHVlIjo2NTg2NTgwMjcxMjc3fQ==" } ],
"pageInfo": { "hasNextPage": false, "hasPreviousPage": false }
}
}Get Product Tags
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/product/get-tagsHeaders
Content-Type: application/jsonBody
{ "domain": "abc.myshopify.com", "accessKey": "xxx" }Response 200 (excerpt)
{
"success": true,
"productTags": { "tags": ["cotton blouse","Couch","cowl","cpace","Crane","cream","crepe wool","crew","crew neck","crewneck","crisp"],
"last_cursor": "Y3Jpc3A=" }
}Get Products by Tags
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/product/get-by-tagsHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"afterIndex": null,
"first": 20,
"tags": ["tag1","tags2","t3"],
"operation": "AND"
}Operation
"AND"→ returned products contain all tags"OR"→ returned products contain any of the tags
Response 200 (excerpt)
{
"success": true,
"productList": [
{
"id": "gid://shopify/Product/6586590625965",
"title": "Anchor Bracelet Mens",
"productType": "Bracelet",
...
}
]
}Get Products by IDs
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/product/get-by-idsHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"ids": [6586590625965]
}Response 200 (excerpt)
{
"success": true,
"productList": [
{ "id": "gid://shopify/Product/6586590625965", "title": "Anchor Bracelet Mens", ... }
]
}👥 Customer Endpoints
Search Customers
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/customer/searchHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"afterIndex": null,
"first": 20,
"searchQuery": "nta"
}Response 200 (excerpt)
{
"success": true,
"customers": [
{
"node": {
"id": "gid://shopify/Customer/5127974846637",
"displayName": "nta",
"email": "[email protected]",
"firstName": "n",
"lastName": "ta",
"phone": null,
"tags": ["wholesale"],
"note": ""
},
"cursor": "eyJsYXN0X2lkIjo1MTI3OTc0ODQ2NjM3LCJsYXN0X3ZhbHVlIjo1MTI3OTc0ODQ2NjM3fQ=="
}
]
}Get Customer Tags
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/customer/get-tagsHeaders
Content-Type: application/jsonBody
{ "domain": "abc.myshopify.com", "accessKey": "xxx" }Response 200
{
"success": true,
"customerTags": [
{ "node": "wholesale", "cursor": "d2hvbGVzYWxl" }
]
}Get Customers by IDs
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/customer/get-by-idsHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"ids": [5127974846637]
}Response 200
{
"success": true,
"customerList": [
{
"id": "gid://shopify/Customer/5127974846637",
"displayName": "nta",
"email": "[email protected]",
"firstName": "n",
"lastName": "ta"
}
]
}Get Customers by Tags
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/customer/get-by-tagsHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"afterIndex": null,
"first": 20,
"tags": ["tag1", "tags2"],
"operation": "AND"
}Operation
"AND"→ returned customers must contain all tags"OR"→ returned customers need any one tag
Response 200 (excerpt)
{
"success": true,
"customers": [
{
"node": {
"id": "gid://shopify/Customer/5127974846637",
"displayName": "nta",
"email": "[email protected]",
"firstName": "n",
"lastName": "ta",
"phone": null,
"tags": ["wholesale"],
"note": ""
},
"cursor": "eyJsYXN0X2lkIjo1MTI3OTc0ODQ2NjM3LCJsYXN0X3ZhbHVlIjo1MTI3OTc0ODQ2NjM3fQ=="
}
]
}🗂️ Collection Endpoints
As provided: The “Get Collections” section uses the
/customer/searchendpoint and returns acustomerspayload. The following block is reproduced exactly.
Get Collections
POST https://b2b-solution-public-api.bsscommerce.com/api/v1/customer/searchHeaders
Content-Type: application/jsonBody
{
"domain": "abc.myshopify.com",
"accessKey": "xxx",
"afterIndex": null,
"first": 20,
"searchQuery": "nta"
}Response 200 (excerpt)
{
"success": true,
"customers": [
{
"node": {
"id": "gid://shopify/Customer/5127974846637",
"displayName": "nta",
"email": "[email protected]",
"firstName": "n",
"lastName": "ta",
"phone": null,
"tags": ["wholesale"],
"note": ""
},
"cursor": "eyJsYXN0X2lkIjo1MTI3OTc0ODQ2NjM3LCJsYXN0X3ZhbHVlIjo1MTI3OTc0ODQ2NjM3fQ=="
}
]
}⚙️ Request Handling Policy
The system handles one request at a time. After a request completes, the next one is processed.
In case of a server error, recovery may take up to 3 minutes before a new request can be processed.
Last updated
Was this helpful?