Skip to content

Public API v2: Price List

A price list: who it is for and when, plus a list of products or variants, each with its own price.

Scopes price-list:read, price-list:write
Plan Plans with Price List; otherwise 403
Takes effect Saved in the app; reaches the storefront at the next upload.

Every response has the same envelope (success, status, data, meta; see Responses). Returns below describes data. The examples are real calls; the rules were created disabled.

  • GET /rules/{id} returns the rule and items_count; read the items from GET /rules/{id}/items page by page, or count them with /items/count.
  • POST and PUT carry every item; PUT removes the items left out. A request holds up to about 5,890 items (its cost must stay at 600 or below); add more with POST /rules/{id}/items/bulk-upsert, 250 at a time.
  • There is no bulk-upsert of rules: create or replace them one by one. To change only the name, status, priority or schedule, use PATCH.
  • On checkout versions 1, 3 and 5 (shown as Checkout version in Settings), a set_fixed_price can be lower or higher than the product’s original price.
  • A price list priced by cost (Cost + Markup in the app) keeps its items: changing them is a 422; its name, status and schedule can still change.
  • While the app updates a price list to its new options, writes to it answer 409 RESOURCE_CONFLICT; send them again later.

What every read returns. Lists come back as [] when empty, never null.

idstringread-only

Rule id.

namestring

Rule name.

priorityinteger

Lower number wins; see Rules.

statusenum

disabled rules are kept but not applied. One of disabled, enabled.

CustomersCommon object

Who gets the rule.

Show fields

apply_toenum

all everyone, logged in or not · logged_in any logged-in customer · non_logged_in visitors who are not logged in · customer_ids the listed customers · customer_tags customers with any of the tags · company_location the listed B2B company locations. Accepted here: all, logged_in, non_logged_in, customer_ids, customer_tags, company_location.

customer_ids[string]

Used when apply_to is customer_ids; required and not empty then.

customer_tags[string]

Used when apply_to is customer_tags; required and not empty then.

company_location_ids[string]

Used when apply_to is company_location; required and not empty then.

exclude_fromenum

none (default) · customer_tags · customer_ids · company_location. Excluded customers stay out even when apply_to includes them. Accepted here: none, customer_tags, customer_ids, company_location.

exc_customer_tags[string]

Used when exclude_from is customer_tags.

exc_customers[string]

Used when exclude_from is customer_ids.

exc_company_location_ids[string]

Used when exclude_from is company_location.

apply_atenum

One of product, variant.

exc_product_type, exc_product_variantssee link

Products — see Common objects. exc_product_type: none, by_ids, by_collections, by_tags, by_variants.

Show fields

exc_product_typeenum

none (default) or one of the types above: these products are left out. Accepted here: none, by_ids, by_collections, by_tags, by_variants.

exc_product_variants[string]

Used when exc_product_type is by_variants.

MarketsCommon object

Which markets the rule covers.

Show fields

market_condition_typeenum

all (default) every market · by_ids the listed markets. Accepted here: all, by_ids.

market_ids[string]

Shopify market ids.

ScheduleCommon object

When the rule applies.

Show fields

start_atstring

UTC date and time ending in Z; null or left out: starts at once.

end_atstring

After start_at; null or left out: never ends.

items_countintegerread-only

Items GET .../items returns when walked to the end.

created_atstring or nullread-only

UTC, ending in Z.

updated_atstring or nullread-only

UTC, ending in Z.

The rule object
{
"id": "25117",
"name": "Wholesale",
"priority": 1,
"status": "disabled",
"apply_to": "all",
"customer_ids": [],
"customer_tags": [],
"company_location_ids": [],
"exclude_from": "none",
"exc_customer_tags": [],
"exc_customers": [],
"exc_company_location_ids": [],
"apply_at": "product",
"exc_product_type": "none",
"exc_product_variants": [],
"market_condition_type": "all",
"market_ids": [],
"start_at": null,
"end_at": null,
"items_count": 2,
"created_at": "2026-10-21T09:32:58.000Z",
"updated_at": "2026-10-21T09:32:58.000Z"
}

product_idstring

variant_idstring or null

discount_typeenum

apply_fixed and apply_increased_fixed appear only on items created before these discount types were retired.

  • decrease_fixed: Take a fixed amount off the price.
  • decrease_percentage: Take a percentage off (at most 100).
  • increase_fixed: Add a fixed amount.
  • increase_percentage: Add a percentage.
  • set_fixed_price: The price becomes exactly the value.
  • apply_fixed, apply_increased_fixed: Older items only; read-only. Write set_fixed_price instead.

discount_valuestring

The item object
{
"product_id": "8123456788001",
"variant_id": null,
"discount_type": "decrease_percentage",
"discount_value": "10.00"
}

List rules

GET/api/v2/price-list/rules

Scope price-list:readCost 10

List rules, newest first, without their items.

limitinteger

1–250, default 50. See Paging.

cursorstring

next_cursor or prev_cursor of the last page; leave out for the first page. Keep the same filters on every page.

filter_statusenum

One of disabled, enabled.

filter_namestring

Part of the name, any case. 1–200 characters.

data[Rule]

The rules of this page; [] when there are none.

meta.paginationobject

limit, next_cursor, prev_cursor and links to the next and previous pages.

cURL
curl -X GET "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules?limit=2&filter_name=Wholesale" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com"

Create a rule

POST/api/v2/price-list/rules

Scope price-list:writeCost ceil(10.4 + 0.1 × items)

Create a rule with its items.

The body of POST /rules, PUT /rules/{id} and each element of bulk-upsert (add id to replace a rule). PUT replaces the whole rule: optional fields left out go back to their defaults. Fields not listed here are refused with 422.

namestringrequired

Rule name. 1–200 characters.

priorityintegerrequired

Lower number wins; see Rules. 0–99.

statusenum

disabled rules are kept but not applied. One of disabled, enabled. Default "enabled".

CustomersCommon objectrequired

Who gets the rule.

Show fields

apply_toenum

all everyone, logged in or not · logged_in any logged-in customer · non_logged_in visitors who are not logged in · customer_ids the listed customers · customer_tags customers with any of the tags · company_location the listed B2B company locations. Accepted here: all, logged_in, non_logged_in, customer_ids, customer_tags, company_location.

customer_ids[string]

Used when apply_to is customer_ids; required and not empty then.

customer_tags[string]

Used when apply_to is customer_tags; required and not empty then.

company_location_ids[string]

Used when apply_to is company_location; required and not empty then.

exclude_fromenum

none (default) · customer_tags · customer_ids · company_location. Excluded customers stay out even when apply_to includes them. Accepted here: none, customer_tags, customer_ids, company_location.

exc_customer_tags[string]

Used when exclude_from is customer_tags.

exc_customers[string]

Used when exclude_from is customer_ids.

exc_company_location_ids[string]

Used when exclude_from is company_location.

apply_atenum

Default "product".

  • product: Items are products: every variant of the product gets the price. Send selected_products.
  • variant: Items are variants. Send selected_variants.

exc_product_type, exc_product_variantssee link

Products — see Common objects. exc_product_type: none, by_variants.

Show fields

exc_product_typeenum

none (default) or one of the types above: these products are left out. Accepted here: none, by_variants.

exc_product_variants[string]

Used when exc_product_type is by_variants.

MarketsCommon object

Which markets the rule covers.

Show fields

market_condition_typeenum

all (default) every market · by_ids the listed markets. Accepted here: all, by_ids.

market_ids[string]

Shopify market ids.

ScheduleCommon object

When the rule applies.

Show fields

start_atstring

UTC date and time ending in Z; null or left out: starts at once.

end_atstring

After start_at; null or left out: never ends.

selected_products[object]

Show fields

product_idstringrequired

Numeric id as a string.

variant_idstring

Numeric id as a string.

discount_typeenumrequired

  • decrease_fixed: Take a fixed amount off the price.
  • decrease_percentage: Take a percentage off (at most 100).
  • increase_fixed: Add a fixed amount.
  • increase_percentage: Add a percentage.
  • set_fixed_price: The price becomes exactly the value.
  • apply_fixed, apply_increased_fixed: Older items only; read-only. Write set_fixed_price instead.

discount_valuestringrequired

Decimal string, up to 2 decimals.

selected_variants[object]

Show fields

product_idstringrequired

Numeric id as a string.

variant_idstring

Numeric id as a string.

discount_typeenumrequired

  • decrease_fixed: Take a fixed amount off the price.
  • decrease_percentage: Take a percentage off (at most 100).
  • increase_fixed: Add a fixed amount.
  • increase_percentage: Add a percentage.
  • set_fixed_price: The price becomes exactly the value.
  • apply_fixed, apply_increased_fixed: Older items only; read-only. Write set_fixed_price instead.

discount_valuestringrequired

Decimal string, up to 2 decimals.

dataRule

The new rule.

cURL
curl -X POST "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com" \
-H "Content-Type: application/json" \
-d '{
"name": "Wholesale",
"priority": 1,
"apply_to": "all",
"selected_products": [
{
"product_id": "8123456788001",
"discount_type": "decrease_percentage",
"discount_value": "10"
},
{
"product_id": "8123456788002",
"discount_type": "set_fixed_price",
"discount_value": "19.90"
}
],
"status": "disabled"
}'

Get a rule

GET/api/v2/price-list/rules/{id}

Scope price-list:readCost 10

Get a rule with its item count; read the items from .../items.

idstringrequired

Rule id.

dataRule

The rule. An id that does not exist answers 404 RESOURCE_NOT_FOUND.

cURL
curl -X GET "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/25117" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com"

Replace a rule

PUT/api/v2/price-list/rules/{id}

Scope price-list:writeCost ceil(10.4 + 0.1 × items)

Replace a rule and all its items; items left out are removed.

idstringrequired

Rule id.

The same fields as Create a rule.

dataRule

The rule after the change.

cURL
curl -X PUT "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/25117" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com" \
-H "Content-Type: application/json" \
-d '{
"name": "Wholesale (updated)",
"priority": 2,
"apply_to": "all",
"selected_products": [
{
"product_id": "8123456788001",
"discount_type": "decrease_percentage",
"discount_value": "10"
},
{
"product_id": "8123456788002",
"discount_type": "set_fixed_price",
"discount_value": "19.90"
}
],
"status": "disabled"
}'

Update a rule

PATCH/api/v2/price-list/rules/{id}

Scope price-list:writeCost 11

Change the header fields sent; items and the rest stay.

idstringrequired

Rule id.

namestring

1–200 characters.

priorityinteger

0–99.

statusenum

One of disabled, enabled.

apply_toenum

One of all, logged_in, non_logged_in, customer_ids, customer_tags, company_location.

customer_ids[string]

customer_tags[string]

company_location_ids[string]

exclude_fromenum

One of none, customer_tags, customer_ids, company_location.

exc_customer_tags[string]

exc_customers[string]

exc_company_location_ids[string]

apply_atenum

  • product: Items are products: every variant of the product gets the price. Send selected_products.
  • variant: Items are variants. Send selected_variants.

exc_product_typeenum

One of none, by_variants.

exc_product_variants[string]

market_condition_typeenum

One of all, by_ids.

market_ids[string]

start_atstring

UTC; null or left out applies the rule at once. UTC, ending in Z.

end_atstring

UTC, after start_at; null or left out never ends. UTC, ending in Z.

dataRule

The rule after the change.

cURL
curl -X PATCH "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/25117" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com" \
-H "Content-Type: application/json" \
-d '{
"name": "Wholesale 2026",
"priority": 3
}'

Delete a rule

DEL/api/v2/price-list/rules/{id}

Scope price-list:writeCost 11

Delete a rule and its items.

idstringrequired

Rule id.

data.idstring

Id of the deleted rule.

data.deletedboolean

true.

cURL
curl -X DELETE "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/25117" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com"

Delete rules in bulk

POST/api/v2/price-list/rules/bulk-delete

Scope price-list:writeCost ceil(10 + 0.4 × rules)

Delete up to 250 rules; an unknown id fails on its own.

See Bulk & idempotency.

ids[string]required

1–250 rule ids.

data.results[object]

One entry per id: index, id, result (deleted or error) and error (code, message) when it failed.

data.summaryobject

total, succeeded, failed.

cURL
curl -X POST "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/bulk-delete" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"999999999"
]
}'

Upload rules to the storefront

POST/api/v2/price-list/rules/upload

Scope price-list:writeCost 20

Upload the rules to the storefront, as the app does.

The body is empty. See Upload.

data.statusenum

uploaded, or partial_success when some rules did not reach the storefront.

data.skippedobject

capacity_exceeded, write_failed and rule_id_range; see Upload.

cURL
curl -X POST "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/upload" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com"

List a rule's items

GET/api/v2/price-list/rules/{id}/items

Scope price-list:readCost 10

List a rule’s items in the order they were written.

idstringrequired

Rule id.

data[Item]

The items of this page.

meta.paginationobject

limit, next_cursor, prev_cursor and links to the next and previous pages.

cURL
curl -X GET "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/25117/items?limit=2" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com"

Count a rule's items

GET/api/v2/price-list/rules/{id}/items/count

Scope price-list:readCost 10

Count a rule’s items without reading them.

idstringrequired

Rule id.

data.idstring

Rule id.

data.items_countinteger

Number of items the rule has.

cURL
curl -X GET "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/25117/items/count" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com"

Add or reprice items in bulk

POST/api/v2/price-list/rules/{id}/items/bulk-upsert

Scope price-list:writeCost ceil(10 + 0.1 × items)

Add or reprice up to 250 items; the other items stay.

idstringrequired

Rule id.

items[object]required

1–250 items.

Show fields

product_idstringrequired

Numeric id as a string.

variant_idstring

Numeric id as a string.

discount_typeenumrequired

  • decrease_fixed: Take a fixed amount off the price.
  • decrease_percentage: Take a percentage off (at most 100).
  • increase_fixed: Add a fixed amount.
  • increase_percentage: Add a percentage.
  • set_fixed_price: The price becomes exactly the value.
  • apply_fixed, apply_increased_fixed: Older items only; read-only. Write set_fixed_price instead.

discount_valuestringrequired

Decimal string, up to 2 decimals.

data.idstring

Rule id.

data.items_countinteger

Number of items the rule has.

cURL
curl -X POST "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/25117/items/bulk-upsert" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"product_id": "8123456788003",
"discount_type": "decrease_fixed",
"discount_value": "5"
}
]
}'

Remove items in bulk

POST/api/v2/price-list/rules/{id}/items/bulk-delete

Scope price-list:writeCost ceil(10 + 0.1 × items)

Remove up to 250 items by the key of the rule level; unknown ones are skipped.

idstringrequired

Rule id.

product_ids[string]

1–250 items.

variant_ids[string]

1–250 items.

data.idstring

Rule id.

data.items_countinteger

Number of items the rule has.

cURL
curl -X POST "https://solution-public-api.bss-b2b.solutions/api/v2/price-list/rules/25117/items/bulk-delete" \
-H "X-API-Key: $B2B_API_KEY" \
-H "X-Shop-Domain: your-store.myshopify.com" \
-H "Content-Type: application/json" \
-d '{
"product_ids": [
"8123456788003"
]
}'