Update/Edit Volume Pricing using APIs
Update an existing Volume Pricing rule via the Public API, including the full request body reference.
This document explains how to update an existing Volume Pricing rule using the Public API.
1. Endpoint
Section titled “1. Endpoint”To update an existing Volume Pricing record, use the following endpoint:
PUT https://wholesale.samita.io/api/v1/volume-pricings/{id}{id}is the ID of the Volume Pricing record- The ID can be obtained from the app interface (without the “#” symbol)
- Example reference:

Example:
Section titled “Example:”PUT https://wholesale.samita.io/api/v1/volume-pricings/12. Request Headers
Section titled “2. Request Headers”All API requests must include the following required headers:
| Header | Description | Required |
|---|---|---|
X-SAMITA-API-KEY |
API key provided in the Wholesale app | Yes |
X-SAMITA-SHOP-URL |
Shopify shop domain in format xxx.myshopify.com | Yes |
CONTENT-TYPE |
Must be application/json |
Yes |
If any required header is missing, the request will be rejected.
3. Request Body
Section titled “3. Request Body”_ The data used to update Volume Pricing must be sent in JSON format. A sample JSON structure is provided at the end of this document.
_ Only the fields that need to be updated are required in the request. It is not mandatory to send all fields like in the Create API method.
_ Unspecified fields will remain unchanged
Sample Request JSON:
{ "title": "New Volume Pricing", "status": true, "type": "quantity", "apply_customer": { "type": "all", "tags": [] }, "exclude_customer": { "type": "none", "tags": [] }, "apply_product": { "type": "all", "product_ids": [], "product_tags": [], "collection_ids": [], "apply_for_variants": false }, "exclude_product": { "type": "none", "product_ids": [], "collection_ids": [] }, "discount_for_variants": [ { "id": 8516448190631, "duplicated": false, "variant_pricing": true, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ], "variants": [ { "id": 46747346763943, "duplicated": false, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ] } ] } ], "apply_market": { "type": "all", "handle": [] }, "discount_method": "variant", "discount_groups": [ { "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "type": "percent", "value": "10" } ], "active_date": { "types": ["start date", "end date"], "start_at": "2026-01-15T10:00:00", "end_at": "2026-01-15T10:00:00" }}b. title
Section titled “b. title”- The name used to identify the Volume Pricing record
- Must be a string
- Maximum length: 255 characters
c. status
Section titled “c. status”- Defines whether the record is active or not
- Accepts only the following values:
| Value | Description |
|---|---|
true |
Pricing rule is active |
false |
Pricing rule is inactive |
d. type
Section titled “d. type”Defines whether volume pricing is calculated by quantity or amount.
Accepted values:
quantityamount
e. apply_customer
Section titled “e. apply_customer”Defines which customers are eligible for this pricing rule.
Structure:
"apply_customer": { "type": "all", "tags": []}type
Accepted values (only one of the following):
all– Apply to all customerslogged– Apply only to logged-in customersnon-logged– Apply only to guest customerscustomer-tags– Apply only to customers with specific tags
tags
- Required only when
type == customer-tags - Must be a comma-separated array
- Example:
["wholesale","b2b"]
If type is not customer-tags, this field can be ignored.
f. exclude_customer
Section titled “f. exclude_customer”Used to exclude specific customers from the pricing rule.
Structure:
"exclude_customer": { "type": "none", "tags": []}type
- Default value:
none - Accepted values:
| Value | Description |
|---|---|
none |
Do not exclude any customer |
customer-tags |
Exclude customers by tags |
tags
- Required only when
type == customer-tags - Comma-separated array
- Example:
["vip","internal"]
g. apply_product
Section titled “g. apply_product”Defines which products the pricing rule will be applied to.
Structure:
"apply_product": { "type": "all", "product_ids": [], "product_tags": [], "collection_ids": [], "apply_for_variants": false },type
Accepted values:
allproductscollectionsproduct-tags
product_ids
- Required only when
type == products - Comma-separated list of product IDs
- Example:
[1,2,3]
product_tags
- Required only when
type == product-tags - Example:
["tag1","tag2"]
collection_ids
- Required only when
type == collections - Example:
[1,2,3]
apply_for_variants
- Determines whether discounts can be configured per variant
- Accepted values:
trueorfalse - Default value:
false
h. exclude_product
Section titled “h. exclude_product”Defines products to be excluded from the rule.
Structure:
"exclude_product": { "type": "none", "product_ids": [], "collection_ids": [] },type
- Default:
none - Accepted values:
| Value | Description |
|---|---|
none |
Do not exclude any product |
products |
Exclude specific products |
collections |
Exclude specific collections |
Other fields are required only depending on the selected type.
i. discount_for_variants
Section titled “i. discount_for_variants”Defines discount configuration at the product and/or variant level.
- Leave this field empty if
apply_product.apply_for_variants == false. - If
apply_product.apply_for_variants == true, this field is required. - The structure must be an array of product configurations.
Structure:
"discount_for_variants": [ { "id": 8516448190631, "duplicated": false, "variant_pricing": true, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ], "variants": [ { "id": 46747346763943, "duplicated": false, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ] } ] } ],i.1. id (required)
- Product ID.
- Must match an existing product.
i.2. duplicated
Indicates whether the product has multiple quantity/amount ranges.
Accepted values:
truefalse
Rules:
- If
true: the product contains multiple quantity/amount ranges. - If
false: the product has only one quantity/amount range.
i.3. from_qty / from_amount
Starting quantity or amount of the range.
Rules:
- The first item may be empty (defaults to 1).
- All subsequent items are required.
i.4. to_qty / to_amount
Ending quantity or amount of the range.
Rules:
- Can be empty (will automatically be calculated as the next item’s
fromvalue minus 1). - If provided, it must be less than the next item’s
fromvalue.
Examples:
- Item 1: 0–10 → Item 2: 11–20
- Item 1: 0–blank → Item 2: 10–blank
- Item 1: blank–10 → Item 2: 11–blank
i.5. discount_groups (Product Level)
Defines discount configuration for each quantity/amount range at the product level.
- Required if
variant_pricing == false. - Leave empty if
variant_pricing == true. - Must be an array of discount objects corresponding to the configured
apply_customer.type.
Structure:
{ "name": "all", "type": "percent", "value": "10"}+ name
Accepted values:
all(ifapply_customer.type == all)logged(ifapply_customer.type == logged)non-logged(ifapply_customer.type == non-logged)
If another value is provided, it will be treated as a customer tag, and it must match one of the tags defined in apply_customer.tags.
+ type
Defines the discount type.
Accepted values:
percent– Percentage discountamount– Fixed amount deducted from the pricefixed-amount– Final fixed price
+ value
- Must be a number
- Must be greater than 0
- If
type == percent, value must be less than 100
i.6. variant_pricing
Indicates whether discount is applied at the variant level.
Accepted values:
truefalse
i.7. variants
Defines variant-level discount configuration.
- Required if
variant_pricing == true - Leave empty if
variant_pricing == false - Must be an array of variant configurations
Structure:
{ "id": 46747346763943, "duplicated": false, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ]}+ id (required)
- Variant ID.
+ duplicate
Indicates whether the variant has multiple quantity/amount ranges.
Accepted values:
truefalse
Rules:
- If
true: the variant contains multiple ranges. - If
false: the variant has only one range.
+ from_qty / from_amount
Starting quantity or amount.
Rules:
- First item may be empty (defaults to 1).
- All subsequent items are required.
+ to_qty / to_amount
Ending quantity or amount.
Rules:
- Can be empty (auto-calculated as next item’s
fromminus 1). - If provided, must be less than the next item’s
fromvalue.
Examples:
- Item 1: 0–10 → Item 2: 11–20
- Item 1: 0–blank → Item 2: 10–blank
- Item 1: blank–10 → Item 2: 11–blank
+ discount_groups (Variant Level)
Defines discount configuration per quantity/amount range at the variant level.
Rules:
- If
apply_customer.typeis:allloggednon-logged
→ The array must contain only one item.
- If
apply_customer.type == customer-tags
→ The array must contain multiple items (one per customer tag).
name
Accepted values:
allloggednon-logged
If another value is provided, it will be treated as a customer tag and must match a tag defined in apply_customer.tags.
type
Accepted values:
percentamountfixed-amount
value
- Must be a number
- Must be greater than 0
- If
type == percent, value must be less than 100
j. apply_market
Section titled “j. apply_market”Defines which Shopify markets the rule applies to.
Structure:
"apply_market": { "type": "all", "handle": []}type
Accepted values:
allspecific-market
handle
- Required only when
type == specific-market - Comma-separated list of market handles
- Example:
["japan","us"]
k. discount_methods
Section titled “k. discount_methods”Accepted values:
variant→ Same Variantacross_group→ Mix Variantswithin_each_group→ Mix Products
These correspond to the options available in the app.
Example:
"discount_method": "variant",l. discount_group
Section titled “l. discount_group”Defines quantity/amount ranges and discount values.
from_qty / from_amount
to_qty / to_amount
Same validation rules as described above.
Accepted “type” values:
percentamountfixed-amount
value:
- Must be > 0
- If percent → must be < 100
Structure:
"discount_groups": [ { "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "type": "percent", "value": "10" } ],Rules are the same as described above for discount types and values.
m. active_date
Section titled “m. active_date”Used to configure start and end time for the pricing rule.
Structure:
"active_date": { "types": ["start_date", "end_date"], "start_at": "2026-01-15 10:00:00", "end_at": "2026-01-15 10:00:00"}types
- Optional
- Accepted values:
start_date,end_date - Can include one or both, separated by comma
- Example:
["start_date","end_date"]
start_at
- Required if
typesincludesstart_date - Format:
YYYY-MM-DD HH:MM:SS
end_at
- Required if
typesincludesend_date - Format:
YYYY-MM-DD HH:MM:SS
4. API Response
Section titled “4. API Response”a. Error Responses
Section titled “a. Error Responses”401 – Unauthorized
Possible reasons:
- Missing shop URL
- Missing API key
- Invalid shop URL
- Invalid API key
- API key does not match the shop
403 – This action is unauthorized
- API key does not have Update permission
- Each API key can have: View, Create, Update, Delete permissions
- This API requires Update permission
- Also returned when the provided ID does not exist
429 – Too Many Requests
Rate limit exceeded:
- Maximum 1 request per 5 minutes
- Maximum 50 requests per day
b. Success Response
Section titled “b. Success Response”200 – API Success
- Volume Pricing record updated successfully
- Response returned in JSON format
Sample Response JSON:
{ "id": 1, "title": "New Volume Pricing", "status": true, "type": "quantity", "apply_customer": { "type": "all", "tags": [] }, "exclude_customer": { "type": "none", "tags": [] }, "apply_product": { "type": "all", "product_ids": [], "product_tags": [], "collection_ids": [], "apply_for_variants": false }, "exclude_product": { "type": "none", "product_ids": [], "collection_ids": [] }, "discount_for_variants": [ { "id": 8516448190631, "duplicated": false, "variant_pricing": true, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ], "variants": [ { "id": 46747346763943, "duplicated": false, "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "discount_groups": [ { "name": "all", "type": "percent", "value": "10" } ] } ] } ], "apply_market": { "type": "all", "handle": [] }, "discount_method": "variant", "discount_groups": [ { "from_qty": "0", "from_amount": "0", "to_qty": "10", "to_amount": "0", "type": "percent", "value": "10" } ], "active_date": { "types": [], "start_at": "", "end_at": "" }, "created_at": "2026-01-15T10:00:00", "updated_at": "2026-01-15T10:00:00"}