> ## Documentation Index
> Fetch the complete documentation index at: https://zerodrift.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# List Rules

> List all default and custom rules with their active/deactivated status

Retrieve all rules for your account, including default rules (from rule packs and scenarios) and custom rules (from policy imports). Each rule includes an `active` field indicating whether it will run during validation.

## Response

<ResponseField name="customer_id" type="string">
  Your customer identifier
</ResponseField>

<ResponseField name="default_rules" type="array">
  Default rules from rule packs and scenarios

  <Expandable title="default rule properties">
    <ResponseField name="rule_id" type="string">
      Rule identifier (e.g., `signal_mnpi_leak`)
    </ResponseField>

    <ResponseField name="type" type="string">
      `AI_SIGNAL` or `REGEX`
    </ResponseField>

    <ResponseField name="source" type="string">
      Always `default` for built-in rules
    </ResponseField>

    <ResponseField name="active" type="boolean">
      Whether this rule is currently active for your account
    </ResponseField>

    <ResponseField name="rule_pack_id" type="string">
      Rule pack this rule belongs to (e.g., `sec_finra_comms_v2`)
    </ResponseField>

    <ResponseField name="rule_pack_scenario_ids" type="array">
      Scenarios this rule appears in
    </ResponseField>

    <ResponseField name="threshold" type="number">
      Confidence threshold for AI signals
    </ResponseField>

    <ResponseField name="operator" type="string">
      Threshold comparison operator (e.g., `>=`)
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="custom_rules" type="array">
  Custom rules from policy imports

  <Expandable title="custom rule properties">
    <ResponseField name="rule_id" type="string">
      Rule identifier (prefixed with `cust_`)
    </ResponseField>

    <ResponseField name="type" type="string">
      `AI_SIGNAL`, `REGEX`, or `REQUIRE_NEAR`
    </ResponseField>

    <ResponseField name="name" type="string">
      Human-readable rule name
    </ResponseField>

    <ResponseField name="source" type="string">
      Always `custom` for imported rules
    </ResponseField>

    <ResponseField name="active" type="boolean">
      Whether this rule is currently active
    </ResponseField>

    <ResponseField name="import_id" type="string">
      Import ID this rule was extracted from
    </ResponseField>

    <ResponseField name="severity" type="string">
      Rule severity level
    </ResponseField>

    <ResponseField name="action" type="string">
      Rule action type
    </ResponseField>

    <ResponseField name="window" type="string">
      Text window for evaluation
    </ResponseField>

    <ResponseField name="created_at" type="string">
      ISO 8601 creation timestamp
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="default_rules_count" type="integer">
  Total number of default rules (active + deactivated)
</ResponseField>

<ResponseField name="default_rules_active_count" type="integer">
  Number of active default rules
</ResponseField>

<ResponseField name="custom_rules_count" type="integer">
  Total number of custom rules (active + deactivated)
</ResponseField>

<ResponseField name="custom_rules_active_count" type="integer">
  Number of active custom rules
</ResponseField>

<ResponseField name="total_rules_count" type="integer">
  Total rules across default + custom
</ResponseField>

<ResponseField name="total_active_count" type="integer">
  Total active rules across default + custom
</ResponseField>

<ResponseExample>
  ```json 200 OK theme={null}
  {
    "customer_id": "abc-123",
    "default_rules": [
      {
        "rule_id": "signal_mnpi_leak",
        "type": "AI_SIGNAL",
        "source": "default",
        "active": true,
        "rule_pack_id": "sec_finra_comms_v2",
        "rule_pack_scenario_ids": ["scenario_email_general", "scenario_all_general"],
        "threshold": 0.60,
        "operator": ">="
      }
    ],
    "custom_rules": [
      {
        "rule_id": "cust_abc123_require_risk_disclosure",
        "type": "AI_SIGNAL",
        "name": "Risk Disclosure Required",
        "severity": "high",
        "source": "custom",
        "active": true,
        "import_id": "550e8400-e29b-41d4-a716-446655440000"
      }
    ],
    "default_rules_count": 119,
    "default_rules_active_count": 115,
    "custom_rules_count": 5,
    "custom_rules_active_count": 5,
    "total_rules_count": 124,
    "total_active_count": 120
  }
  ```
</ResponseExample>

## Example

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://{api-url}/api/policies/rules" \
    -H "x-api-key: YOUR_API_KEY"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://{api-url}/api/policies/rules",
      headers={"x-api-key": "YOUR_API_KEY"}
  )

  data = response.json()
  print(f"Active: {data['total_active_count']} / {data['total_rules_count']} rules")
  for rule in data["default_rules"]:
      if not rule["active"]:
          print(f"  Deactivated: {rule['rule_id']}")
  ```
</CodeGroup>
