> This page is for Developer.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.bigcommerce.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.bigcommerce.com/_mcp/server.

# Create Complex Rule

POST https://api.bigcommerce.com/stores/{store_hash}/v3/catalog/products/{product_id}/complex-rules
Content-Type: application/json

Creates a product *Complex Rule*.

**Required Fields**
- conditions
- modifier_id
- modifier_value_id
- variant_id

**Read-Only Fields**
- complex_rule_id
- conditions_id
- rule_id
- combination_id
- id

Reference: https://docs.bigcommerce.com/developer/api-reference/rest/admin/catalog/products/complex-rules/create-product-complex-rule

## Authentication

- `X-Auth-Token` header (required) — ### OAuth scopes | UI Name | Permission | Parameter | |:--------|:-----------|:----------| | Products | modify | `store_v2_products` | | Products | read-only | `store_v2_products_read_only` | ### Authentication header | Header | Argument | Description | |:-------|:---------|:------------| | `X-Auth-Token` | `access_token` | For more about API accounts that generate `access_token`s, see our [Guide to API Accounts](/developer/docs/overview/api-fundamentals/api-accounts#api-accounts). | ### Further reading For example requests and more information about authenticating BigCommerce APIs, see [Authentication and Example Requests](/developer/docs/overview/api-fundamentals/api-accounts#x-auth-token-header-example-requests). For more about BigCommerce OAuth scopes, see our [Guide to API Accounts](/developer/docs/overview/api-fundamentals/api-accounts#oauth-scopes). For a list of API status codes, see [API Status Codes](/developer/api-reference/rest/overview#rest-http-status-codes).

## Request

### Path parameters

- `product_id` (integer, required) — The ID of the `Product` to which the resource belongs.
- `store_hash` (string, required) — Permanent ID of the BigCommerce store.

### Headers

- `Accept` (string, required, default: application/json) — The [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types) of the response body.

### Body (application/json)

This endpoint expects an object.

- `conditions` (list of ConditionsRequestItems, required)
- `sort_order` (integer, optional) — The priority to give this rule when making adjustments to the product properties.
- `enabled` (boolean, optional) — Flag for determining whether the rule is to be used when adjusting a productʼs price, weight, image, or availabilty.
- `stop` (boolean, optional) — Flag for determining whether other rules should not be applied after this rule has been applied.
- `purchasing_disabled` (boolean, optional) — Flag for determining whether the rule should disable purchasing of a product when the conditions are applied.
- `purchasing_disabled_message` (string, optional) — Message displayed on the storefront when a rule disables the purchasing of a product.
- `purchasing_hidden` (boolean, optional) — Flag for determining whether the rule should hide purchasing of a product when the conditions are applied.
- `image_url` (string, optional) — The URL for an image displayed on the storefront when the conditions are applied. Limit of 8MB per file.
- `price_adjuster` (CatalogProductsProductIdComplexRulesPostRequestBodyContentApplicationJsonSchemaPriceAdjuster, optional) — Adjuster for Complex Rules.
- `weight_adjuster` (CatalogProductsProductIdComplexRulesPostRequestBodyContentApplicationJsonSchemaWeightAdjuster, optional) — Adjuster for Complex Rules.

## Response

### 200

OK

- `data` (CatalogProductsProductIdComplexRulesPostResponsesContentApplicationJsonSchemaData, optional) — Common ComplexRule properties.
- `meta` (metaEmpty_Full, optional) — Response metadata.

## Errors

### 409 Conflict Error

The `ComplexRule` was in conflict with another `ComplexRule`. This is the result of duplicate conditions.

- `errors` (CatalogProductsProductIdComplexRulesPostResponsesContentApplicationJsonSchemaErrors, optional)
- `instance` (string, optional)
- `status` (integer, optional) — The HTTP status code.
- `title` (string, optional) — The error title describing the particular error.
- `type` (string, optional)

### 422 Unprocessable Entity Error

The `ComplexRule` was not valid. This is the result of missing required fields, or of invalid data. See the response for more details.

- `errors` (CatalogProductsProductIdComplexRulesPostResponsesContentApplicationJsonSchemaErrors, optional)
- `instance` (string, optional)
- `status` (integer, optional) — The HTTP status code.
- `title` (string, optional) — The error title describing the particular error.
- `type` (string, optional)

## Types

### ConditionsRequestItems

### CatalogProductsProductIdComplexRulesPostRequestBodyContentApplicationJsonSchemaPriceAdjuster

Adjuster for Complex Rules.

- `adjuster` (enum, optional, nullable) — The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront.
  - Allowed values: `relative`, `percentage`
- `adjuster_value` (double, optional) — The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront.

### CatalogProductsProductIdComplexRulesPostRequestBodyContentApplicationJsonSchemaWeightAdjuster

Adjuster for Complex Rules.

- `adjuster` (enum, optional, nullable) — The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront.
  - Allowed values: `relative`, `percentage`
- `adjuster_value` (double, optional) — The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront.

### CatalogProductsProductIdComplexRulesPostResponsesContentApplicationJsonSchemaData

Common ComplexRule properties.

- `id` (integer, optional) — The unique numeric ID of the rule; increments sequentially. Read-Only
- `product_id` (integer, optional, nullable) — The unique numeric ID of the product with which the rule is associated; increments sequentially.
- `sort_order` (integer, optional) — The priority to give this rule when making adjustments to the product properties.
- `enabled` (boolean, optional) — Flag for determining whether the rule is to be used when adjusting a productʼs price, weight, image, or availabilty.
- `stop` (boolean, optional) — Flag for determining whether other rules should not be applied after this rule has been applied.
- `purchasing_disabled` (boolean, optional) — Flag for determining whether the rule should disable purchasing of a product when the conditions are applied.
- `purchasing_disabled_message` (string, optional) — Message displayed on the storefront when a rule disables the purchasing of a product.
- `purchasing_hidden` (boolean, optional) — Flag for determining whether the rule should hide purchasing of a product when the conditions are applied.
- `image_url` (string, optional) — The URL for an image displayed on the storefront when the conditions are applied. Limit of 8MB per file.
- `price_adjuster` (CatalogProductsProductIdComplexRulesPostResponsesContentApplicationJsonSchemaDataPriceAdjuster, optional) — Adjuster for Complex Rules.
- `weight_adjuster` (CatalogProductsProductIdComplexRulesPostResponsesContentApplicationJsonSchemaDataWeightAdjuster, optional) — Adjuster for Complex Rules.
- `conditions` (list of complexRuleConditionBase, optional)

### metaEmpty_Full

Response metadata.

### CatalogProductsProductIdComplexRulesPostResponsesContentApplicationJsonSchemaErrors

### modifierCondition

- `modifier_id` (integer, optional) — Use the [get all product modifiers](/developer/api-reference/rest/admin/catalog/product-modifiers/get-product-modifiers) endpoint to determine the `option_values` `id`. The `option_values` `id` is the `modifier_value_id`.
- `modifier_value_id` (integer, optional) — Use the [get all product modifiers](/developer/api-reference/rest/admin/catalog/product-modifiers/get-product-modifiers) endpoint to determine the `option_values` `option_id`. The `option_values` `option_id` is the same as the `modifier_id`.

### variantCondition

- `variant_id` (integer, optional) — Use the [get all product variants](/developer/api-reference/rest/admin/catalog/product-variants/get-product-variants) endpoint to determine the variant `id`.

### CatalogProductsProductIdComplexRulesPostResponsesContentApplicationJsonSchemaDataPriceAdjuster

Adjuster for Complex Rules.

- `adjuster` (enum, optional, nullable) — The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront.
  - Allowed values: `relative`, `percentage`
- `adjuster_value` (double, optional) — The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront.

### CatalogProductsProductIdComplexRulesPostResponsesContentApplicationJsonSchemaDataWeightAdjuster

Adjuster for Complex Rules.

- `adjuster` (enum, optional, nullable) — The type of adjuster for either the price or the weight of the variant, when the modifier value is selected on the storefront.
  - Allowed values: `relative`, `percentage`
- `adjuster_value` (double, optional) — The numeric amount by which the adjuster will change either the price or the weight of the variant, when the modifier value is selected on the storefront.

### complexRuleConditionBase

Complex rules may return with conditions that apply to one or more variants, or with a single modifier value (if the rules were created using the v2 API or the control panel). Complex rules created or updated in the v3 API must have conditions that either reference multiple `modifier_value_id`’s, or else reference a `modifier_value_id` and a `variant_id`.

- `modifier_id` (integer, required, nullable) — The unique numeric ID of the modifier with which the rule condition is associated. Required in /POST.
- `modifier_value_id` (integer, required, nullable) — The unique numeric ID of the modifier value with which the rule condition is associated. Required in /POST.
- `variant_id` (integer, required, nullable) — The unique numeric ID of the variant with which the rule condition is associated. Required in /POST.
- `id` (integer, optional, nullable) — The unique numeric ID of the rule condition; increments sequentially. Read-Only
- `rule_id` (integer, optional, nullable) — The unique numeric ID of the rule with which the condition is associated. Read-Only
- `combination_id` (integer, optional) — (READ-ONLY:) The unique numeric ID of the SKU (v2 API), or Combination, with which the rule condition is associated. This is to maintain cross-compatibility between v2 and v3.

## Examples

**Request**

```json
{
  "conditions": [
    {}
  ]
}
```

**Response**

```json
{
  "data": {
    "id": 5,
    "product_id": 67,
    "sort_order": 0,
    "enabled": true,
    "stop": true,
    "purchasing_disabled": true,
    "purchasing_disabled_message": "This product is not available at this time.",
    "purchasing_hidden": true,
    "image_url": "https://cdn8.bigcommerce.com/s-123456/product_images/d/fakeimage.png",
    "price_adjuster": {
      "adjuster": "relative",
      "adjuster_value": 5
    },
    "weight_adjuster": {
      "adjuster": "relative",
      "adjuster_value": 5
    },
    "conditions": [
      {
        "modifier_id": 55,
        "modifier_value_id": 256,
        "variant_id": 1,
        "id": 3,
        "rule_id": 4,
        "combination_id": 1
      }
    ]
  },
  "meta": {}
}
```

**SDK Code**

```python
import requests

url = "https://api.bigcommerce.com/stores/store_hash/v3/catalog/products/1/complex-rules"

payload = { "conditions": [{}] }
headers = {
    "Accept": "application/json",
    "X-Auth-Token": "<apiKey>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.bigcommerce.com/stores/store_hash/v3/catalog/products/1/complex-rules';
const options = {
  method: 'POST',
  headers: {
    Accept: 'application/json',
    'X-Auth-Token': '<apiKey>',
    'Content-Type': 'application/json'
  },
  body: '{"conditions":[{}]}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.bigcommerce.com/stores/store_hash/v3/catalog/products/1/complex-rules"

	payload := strings.NewReader("{\n  \"conditions\": [\n    {}\n  ]\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Accept", "application/json")
	req.Header.Add("X-Auth-Token", "<apiKey>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.bigcommerce.com/stores/store_hash/v3/catalog/products/1/complex-rules")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Accept"] = 'application/json'
request["X-Auth-Token"] = '<apiKey>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"conditions\": [\n    {}\n  ]\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.bigcommerce.com/stores/store_hash/v3/catalog/products/1/complex-rules")
  .header("Accept", "application/json")
  .header("X-Auth-Token", "<apiKey>")
  .header("Content-Type", "application/json")
  .body("{\n  \"conditions\": [\n    {}\n  ]\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.bigcommerce.com/stores/store_hash/v3/catalog/products/1/complex-rules', [
  'body' => '{
  "conditions": [
    {}
  ]
}',
  'headers' => [
    'Accept' => 'application/json',
    'Content-Type' => 'application/json',
    'X-Auth-Token' => '<apiKey>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.bigcommerce.com/stores/store_hash/v3/catalog/products/1/complex-rules");
var request = new RestRequest(Method.POST);
request.AddHeader("Accept", "application/json");
request.AddHeader("X-Auth-Token", "<apiKey>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"conditions\": [\n    {}\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Accept": "application/json",
  "X-Auth-Token": "<apiKey>",
  "Content-Type": "application/json"
]
let parameters = ["conditions": [[]]] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.bigcommerce.com/stores/store_hash/v3/catalog/products/1/complex-rules")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```