# Create a business ruleset

> For the complete machine-readable documentation index, see [llms.txt](https://apidocs.chargebee.com/llms.txt).


[Idempotency Supported](/docs/api/idempotency)

Creates a business ruleset. A ruleset groups business rules so that they can be evaluated together, in the priority order you assign, using the strategy set in `execute_mode`.

Use this operation when a decision is made by several rules that belong together, such as all the checks that a quote must pass or the ladder of discounts that can apply to it. Once the ruleset exists, a single call to [Apply business rules](/docs/api/business_rules/apply-business-rules) with its `ruleset_id` evaluates all of its rules.

Passing `rules` is optional. You can create an empty ruleset and fill it later with [Add business rules to a ruleset](/docs/api/business_rulesets/add-business-rules-to-a-ruleset).

### Prerequisites & Constraints

-   Business rules must be enabled for the site.
-   Each rule referenced in `rules` must already exist.

### Impacts

**

Business ruleset

**

A business ruleset is created with `active` set to `false` and with the rules you passed in `rules` as its membership.

Nothing is evaluated yet. A rule is evaluated through a ruleset only when both the ruleset and the rule itself are `active`, so each one has to be activated separately.

### Implementation Notes

-   Create the rules first with [Create a business rule](/docs/api/business_rules/create-a-business-rule), then reference their identifiers in `rules`. A `rule_id` that does not resolve to an existing rule is rejected.
-   Call [Activate a business ruleset](/docs/api/business_rulesets/activate-a-business-ruleset) once the membership is in place, so that Chargebee starts evaluating the ruleset.

### Use Cases

Evaluate every rule in the group

Leave `execute_mode` at its default of `execute_all`, or set it to `execute_all_true` if you only want the rules that matched to be returned. Use this when the rules are independent of one another, such as a set of validations that should all be reported.

Pick the first rule that matches

Set `execute_mode` to `stop_on_first_true` and assign the priorities so that the most specific rule is evaluated first. Evaluation stops at the first rule that matches, which makes the ruleset behave like an ordered list of alternatives.

Stop at the first failed check

Set `execute_mode` to `stop_on_first_false` so that evaluation stops at the first rule that is not satisfied. Use this when later rules only make sense if the earlier ones passed.

## Sample Request

#### cURL

```bash
curl  https://{site}.chargebee.com/api/v2/business_rulesets \
     -u {site_api_key}:\
     -d id="quote_create_rules" \
     -d name="Quote creation rules" \
     -d description="Rules evaluated when a quote is created." \
     -d execute_mode="EXECUTE_ALL" \
     -d rules='[{"rule_id":"custom-uuid-1","priority":1},{"rule_id":"custom-uuid-2","priority":2}]'
```

#### .NET

```dotnet
using ChargeBee.Api;
using ChargeBee.Models;
using Newtonsoft.Json.Linq;

ApiConfig.Configure("{site}","{site_api_key}");
EntityResult result = BusinessRuleset.Create()
		.Id("quote_create_rules")
		.Name("Quote creation rules")
		.Description("Rules evaluated when a quote is created.")
		.ExecuteMode(BusinessRuleset.ExecuteModeEnum.ExecuteAll)
		.Rules(new JArray { "{\"rule_id\":\"custom-uuid-1\",\"priority\":1}", "{\"rule_id\":\"custom-uuid-2\",\"priority\":2}" })
		.Request();

BusinessRuleset businessRuleset = result.BusinessRuleset;
```

#### Go

```go
package main
import (
    "fmt"
    "github.com/chargebee/chargebee-go/v3"
    businessrulesetAction "github.com/chargebee/chargebee-go/v3/actions/businessruleset"
    "github.com/chargebee/chargebee-go/v3/models/businessruleset"
    businessRulesetEnum "github.com/chargebee/chargebee-go/v3/models/businessruleset/enum"
)
func main() {
    chargebee.Configure("{site_api_key}","{site}");
    res,err := businessrulesetAction.Create(&businessruleset.CreateRequestParams{
        Id : "quote_create_rules",
        Name : "Quote creation rules",
        Description : "Rules evaluated when a quote is created.",
        ExecuteMode : businessRulesetEnum.ExecuteModeExecuteAll,
        Rules : []*businessruleset.CreateRuleParams{
            {
                RuleId : "custom-uuid-1",
                Priority : chargebee.Int32(1),
            },
            {
                RuleId : "custom-uuid-2",
                Priority : chargebee.Int32(2),
            },
        },
    }).Request()
    if err != nil {
        fmt.Println(err)
    } else {
        BusinessRuleset := res.BusinessRuleset
    }
}
```

#### Go

```go
package main

import (
  "fmt"
  "github.com/chargebee/chargebee-go/v4"
)

func main() {
  config := &chargebee.ClientConfig{
    SiteName: "{site}",
    ApiKey: "{site_api_key}",
  }    
  client := chargebee.NewClient(config)
  req := &chargebee.BusinessRulesetCreateRequest{
    Id : "quote_create_rules",
    Name : "Quote creation rules",
    Description : "Rules evaluated when a quote is created.",
    ExecuteMode : chargebee.BusinessRulesetExecuteModeExecuteAll,
    Rules : []*chargebee.BusinessRulesetCreateRule{
        {
            RuleId : "custom-uuid-1",
            Priority : chargebee.Int32(1),
        },
        {
            RuleId : "custom-uuid-2",
            Priority : chargebee.Int32(2),
        },
    },
}
  res, err := client.BusinessRuleset.Create(req)
      if err != nil {
        fmt.Println(err)
    } else {
        BusinessRuleset := res.BusinessRuleset
    }
}
```

#### Java

```java
import com.chargebee.*;
import com.chargebee.ListResult;
import com.chargebee.models.*;
import com.chargebee.models.enums.*;
import java.io.IOException;
import java.util.List;
import com.chargebee.org.json.JSONArray;
import com.chargebee.org.json.JSONObject;

public class Sample {

    public static void main(String args[]) throws IOException, Exception {
        Environment.configure("{site}", "{site_api_key}");
        Result result = BusinessRuleset.create()
            .id("quote_create_rules")
            .name("Quote creation rules")
            .description("Rules evaluated when a quote is created.")
            .executeMode(BusinessRuleset.ExecuteMode.EXECUTE_ALL)
            .rules(new JSONArray("[{\"rule_id\":\"custom-uuid-1\",\"priority\":1},{\"rule_id\":\"custom-uuid-2\",\"priority\":2}]"))
            .request();

        BusinessRuleset businessRuleset = result.businessRuleset();
    }
}
```

#### Java

```java
import com.chargebee.v4.client.ChargebeeClient;
import com.chargebee.v4.models.businessRuleset.BusinessRuleset;
import com.chargebee.v4.models.businessRuleset.params.BusinessRulesetCreateParams;
import com.chargebee.v4.models.businessRuleset.responses.BusinessRulesetCreateResponse;
import java.util.List;

public class BusinessRulesetCreate {

    public static void main(String[] args) {
        ChargebeeClient client = ChargebeeClient.builder()
            .apiKey("{site_api_key}")
            .siteName("{site}")
            .build();

        BusinessRulesetCreateParams params = BusinessRulesetCreateParams.builder()
            .id("quote_create_rules")
            .name("Quote creation rules")
            .description("Rules evaluated when a quote is created.")
            .executeMode(BusinessRulesetCreateParams.ExecuteMode.EXECUTE_ALL)
            .rules(List.of("[{\"rule_id\":\"custom-uuid-1\",\"priority\":1},{\"rule_id\":\"custom-uuid-2\",\"priority\":2}]"))
            .build();

        BusinessRulesetCreateResponse response = client.businessRulesets().create(params);

        BusinessRuleset businessRuleset = response.getBusinessRuleset();
    }
}
```

#### Node.js

```node
import Chargebee from "chargebee";

const chargebee = new Chargebee({
    site: "{site}",
    apiKey: "{site_api_key}",
});

try {
    const result = await chargebee.businessRuleset.create({
        id: "quote_create_rules",
        name: "Quote creation rules",
        description: "Rules evaluated when a quote is created.",
        execute_mode: "execute_all",
        rules: [
            {
                rule_id: "custom-uuid-1",
                priority: 1
            },
            {
                rule_id: "custom-uuid-2",
                priority: 2
            }
        ]
    });

    console.log(result);
    const businessRuleset = result.business_ruleset;
} catch (err) {
    console.log(err);
}
```

#### PHP

```php
<?php

require __DIR__ . '/vendor/autoload.php';

use Chargebee\ChargebeeClient;

$chargebee = new ChargebeeClient(options: [
    "site" => "{site}",
    "apiKey" => "{site_api_key}",
]);
$result = $chargebee->businessRuleset()->create([
    "id" => "quote_create_rules",
    "name" => "Quote creation rules",
    "description" => "Rules evaluated when a quote is created.",
    "execute_mode" => "execute_all",
    "rules" => [
        [
            "rule_id" => "custom-uuid-1",
            "priority" => 1
        ],
        [
            "rule_id" => "custom-uuid-2",
            "priority" => 2
        ]
    ]
]);
$businessRuleset = $result->business_ruleset;
```

#### Python

```python
import chargebee
from chargebee import Chargebee

cb_client = Chargebee(api_key="{site_api_key}", site="{site}")
response = cb_client.BusinessRuleset.create(
    cb_client.BusinessRuleset.CreateParams(
        id="quote_create_rules",
        name="Quote creation rules",
        description="Rules evaluated when a quote is created.",
        execute_mode=chargebee.BusinessRuleset.ExecuteMode.EXECUTE_ALL,
        rules=[
            cb_client.BusinessRuleset.CreateRuleParams(
              rule_id="custom-uuid-1",
              priority=1
            ),
            cb_client.BusinessRuleset.CreateRuleParams(
              rule_id="custom-uuid-2",
              priority=2
            )
        ]
    )
)
business_ruleset = response.business_ruleset
```

#### Ruby

```ruby
require 'chargebee'

ChargeBee.configure(:site => "{site}",
  :api_key => "{site_api_key}")

result = ChargeBee::BusinessRuleset.create({
  :id => "quote_create_rules",
  :name => "Quote creation rules",
  :description => "Rules evaluated when a quote is created.",
  :execute_mode => "EXECUTE_ALL",
  :rules => "[{\"rule_id\":\"custom-uuid-1\",\"priority\":1},{\"rule_id\":\"custom-uuid-2\",\"priority\":2}]"
})

business_ruleset = result.business_ruleset
```

## Sample Response

```json
{
  "business_ruleset": {
    "id": "quote_create_rules",
    "name": "Quote creation rules",
    "description": "Rules evaluated when a quote is created.",
    "active": false,
    "execute_mode": "execute_all",
    "updated_at": 1788510782,
    "updated_by": "full_access_key_v1",
    "created_by": "full_access_key_v1",
    "created_at": 1788510782,
    "resource_version": 1788510782918,
    "object": "business_ruleset"
  }
}
```

## URL Format

**POST** https://[site].chargebee.com/api/v2/business_rulesets

## Input Parameters

- `id` (optional, string, max chars=100)
  Unique identifier for the business ruleset. If not provided, Chargebee generates one.

- `name` (required, string, max chars=500)
  Display name of the business ruleset.

- `description` (optional, string, max chars=1000)
  Description of what the business ruleset does.

- `execute_mode` (optional, enumerated string, default=execute_all)
  Strategy that determines how the rules in the ruleset are evaluated and when evaluation stops.
  
  **Default value**
  
  -   `execute_all`.
  Possible enum values:
    - `stop_on_first_true`
      Evaluation stops as soon as a rule evaluates to `true`. The rules that come later in the evaluation order are not evaluated.
    - `stop_on_first_false`
      Evaluation stops as soon as a rule evaluates to `false`. The rules that come later in the evaluation order are not evaluated.
    - `execute_all`
      Every rule in the ruleset is evaluated and all the results are returned. This is the default.
    - `execute_all_true`
      Every rule in the ruleset is evaluated, and only the rules that evaluated to `true` are returned.

- `rules` (optional)
  The [business rules](/docs/api/business_rules) that make up the ruleset, along with the priorities that determine their positions in its evaluation order. Each entry takes the `rule_id` of an existing business rule and an optional `priority`; when `priority` is omitted, it is assigned from the position of the entry in the array. Pass the list as a JSON array.
  
  **Constraints**
  
  -   Each `rule_id` must belong to a business rule that already exists.
  -   A `priority` can be used by only one rule in the ruleset. Two entries that carry the same `priority` are rejected.
  
  **Example →** `rules = [{"rule_id":"custom-uuid-1","priority":1},{"rule_id":"custom-uuid-2","priority":2}]`

## Returns

- `business_ruleset` (Business ruleset object)
  The newly created business ruleset, with `active` set to `false` and with the rules you passed in `rules` as its membership.
