Rules Management API: CRUD, Test, & Validate WooCommerce Automation

Order Daemon Docs

Rules Management API

The Rules API provides complete CRUD operations for automation rules, plus component discovery endpoints for building rule management interfaces.

Base URL

/wp-json/odcm/v1/rule-builder

Authentication: Requires manage_woocommerce capability and proper WordPress authentication.

Endpoints

GET /rule-builder/components

Get available triggers, conditions, and actions for building rules.

Parameters:

  • rule_id (int, optional) – Current rule ID for state detection

Example Request:

curl "https://yoursite.com/wp-json/odcm/v1/rule-builder/components" \
  -H "Authorization: Bearer YOUR_TOKEN"

Example Response:

{
  "triggers": [
    {
      "id": "order_processing",
      "label": "Order Processing",
      "description": "Triggered when order status changes to Processing",
      "schema": {
        "type": "object",
        "properties": {},
        "required": []
      },
      "capability": "default",
      "accessible": true,
      "state": "available",
      "already_in_rule": false,
      "is_default": true,
      "priority": 1
    }
  ],
  "conditions": [
    {
      "id": "product_type",
      "label": "Product Type",
      "description": "Match orders by product type",
      "schema": {
        "type": "object",
        "properties": {
          "types": {
            "type": "array",
            "items": {"type": "string"}
          },
          "match_all": {"type": "boolean"}
        },
        "required": ["types"]
      },
      "capability": "default",
      "accessible": true,
      "state": "available",
      "already_in_rule": false,
      "is_default": false,
      "priority": 4
    }
  ],
  "primaryActions": [
    {
      "id": "change_status_to_completed",
      "label": "Change Status to Completed",
      "description": "Changes order status to Completed",
      "schema": {
        "type": "object",
        "properties": {
          "send_emails": {"type": "boolean"},
          "update_stock": {"type": "boolean"}
        }
      },
      "capability": "default",
      "accessible": true,
      "state": "available",
      "already_in_rule": false,
      "is_default": true,
      "priority": 1
    }
  ],
  "secondaryActions": [
    {
      "id": "send_notification",
      "label": "Send Notification",
      "description": "Send email notification",
      "schema": {
        "type": "object",
        "properties": {
          "recipient": {"type": "string"},
          "template": {"type": "string"}
        },
        "required": ["recipient", "template"]
      },
      "capability": "default",
      "accessible": true,
      "state": "available",
      "already_in_rule": false,
      "is_default": false,
      "priority": 2
    }
  ],
  "actions": [], // Legacy compatibility
  "meta": {
    "execution_time": 0.123,
    "timestamp": "2026-01-18T14:30:00Z"
  }
}

GET /rule/{id}

Get a specific rule by ID.

Parameters:

  • id (int, required) – Rule post ID

Example Request:

curl "https://yoursite.com/wp-json/odcm/v1/rule/123" \
  -H "Authorization: Bearer YOUR_TOKEN"

Example Response:

{
  "trigger": {
    "id": "order_processing",
    "settings": {}
  },
  "conditions": [
    {
      "id": "product_type",
      "settings": {
        "types": ["virtual", "downloadable"],
        "match_all": false
      }
    }
  ],
  "primaryAction": {
    "id": "change_status_to_completed",
    "settings": {
      "send_emails": true,
      "update_stock": false
    }
  },
  "secondaryActions": [
    {
      "id": "send_notification",
      "settings": {
        "recipient": "admin@example.com",
        "template": "order_completed"
      }
    }
  ]
}

POST /rule/{id}

Save a rule’s data.

Parameters:

  • id (int, required) – Rule post ID

Request Body:

{
  "rule": {
    "trigger": {
      "id": "order_processing",
      "settings": {}
    },
    "conditions": [
      {
        "id": "product_type",
        "settings": {
          "types": ["virtual"],
          "match_all": false
        }
      }
    ],
    "primaryAction": {
      "id": "change_status_to_completed",
      "settings": {
        "send_emails": true,
        "update_stock": false
      }
    },
    "secondaryActions": []
  },
  "audit": {
    "action": "rule_modified",
    "before_data": {...},
    "user_context": {
      "user_agent": "Mozilla/5.0",
      "page_url": "https://yoursite.com/wp-admin/..."
    }
  }
}

Example Request:

curl -X POST "https://yoursite.com/wp-json/odcm/v1/rule/123" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{"rule": {...}, "audit": {...}}'

Example Response:

{
  "success": true,
  "message": "Rule saved successfully",
  "rule_id": 123,
  "audit_logged": true
}

GET /rule-builder/search-content

Search for dynamic content for rule building.

Parameters:

  • source (string, required) – Data source: products, categories, posts, users, order_statuses, payment_methods, shipping_methods, product_tags
  • search (string, optional) – Search query
  • limit (int, optional) – Maximum results (default: 50, max: 100)

Example Request:

curl "https://yoursite.com/wp-json/odcm/v1/rule-builder/search-content?source=products&search=shirt&limit=10" \
  -H "Authorization: Bearer YOUR_TOKEN"

Example Response:

{
  "results": [
    {
      "value": "456",
      "label": "T-Shirt (SKU: TS-100) (ID: 456)",
      "meta": {
        "id": 456,
        "title": "T-Shirt",
        "sku": "TS-100"
      }
    }
  ],
  "meta": {
    "source": "products",
    "search_term": "shirt",
    "count": 5,
    "execution_time": 0.045
  }
}

Component Discovery API

GET /rule-builder/components

Get available triggers, conditions, and actions for building rules.

Parameters:

  • type (string, optional) – Filter by component type: triggers, conditions, actions

Example Request:

curl "https://yoursite.com/wp-json/odcm/v1/rule-builder/components" \
  -H "Authorization: Bearer YOUR_TOKEN"

Example Response:

{
  "success": true,
  "data": {
    "triggers": [
      {
        "id": "order_processing",
        "label": "Order Processing",
        "description": "Triggered when order status changes to Processing",
        "capability": "core",
        "settings_schema": {
          "type": "object",
          "properties": {},
          "required": []
        }
      }
    ],
    "conditions": [
      {
        "id": "product_type",
        "label": "Product Type",
        "description": "Match orders by product type",
        "capability": "core",
        "settings_schema": {
          "type": "object",
          "properties": {
            "product_types": {
              "type": "array",
              "items": {"type": "string"}
            },
            "match_type": {
              "type": "string",
              "enum": ["all", "any"]
            }
          },
          "required": ["product_types"]
        }
      }
    ],
    "actions": [
      {
        "id": "complete_order",
        "label": "Complete Order",
        "description": "Set order status to Completed",
        "capability": "core",
        "settings_schema": {
          "type": "object",
          "properties": {},
          "required": []
        }
      }
    ]
  }
}

GET /rule-builder/search

Search for products, categories, or other entities for rule building.

Parameters:

  • type (string, required) – Search type: products, categories, customers
  • search (string, required) – Search query
  • limit (int, optional) – Maximum results (default: 10, max: 50)

Example Request:

curl "https://yoursite.com/wp-json/odcm/v1/rule-builder/search?type=categories&search=digital&limit=5" \
  -H "Authorization: Bearer YOUR_TOKEN"

Example Response:

{
  "success": true,
  "data": [
    {
      "id": 45,
      "name": "Digital Downloads",
      "slug": "digital-downloads",
      "type": "category"
    },
    {
      "id": 67,
      "name": "Digital Courses", 
      "slug": "digital-courses",
      "type": "category"
    }
  ]
}

Validation and Testing

POST /rules/validate

Validate a rule configuration without saving.

Request Body: Same format as rule creation.

Example Response:

{
  "success": true,
  "data": {
    "valid": true,
    "warnings": [
      "This trigger may fire frequently on busy stores"
    ],
    "errors": []
  }
}

POST /rules/{id}/test

Test a rule against a specific order.

Parameters:

  • id (int, required) – Rule ID
  • order_id (int, required) – WooCommerce order ID to test against

Example Request:

curl -X POST "https://yoursite.com/wp-json/odcm/v1/rules/123/test" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -d '{"order_id": 456}'

Example Response:

{
  "success": true,
  "data": {
    "would_trigger": true,
    "conditions_passed": [
      {
        "condition": "product_type",
        "passed": true,
        "message": "All products are virtual"
      }
    ],
    "actions_would_execute": [
      {
        "action": "complete_order",
        "message": "Would change order status to Completed"
      }
    ]
  }
}

Error Responses

Validation Errors (400):

{
  "success": false,
  "message": "Validation failed",
  "code": "validation_error",
  "data": {
    "errors": [
      {
        "field": "trigger.type",
        "message": "Invalid trigger type"
      }
    ]
  }
}

Premium Feature Error (403):

{
  "success": false,
  "message": "This trigger requires Order Daemon Pro",
  "code": "odcm_premium_blocked"
}

Rule Not Found (404):

{
  "success": false,
  "message": "Rule not found",
  "code": "rule_not_found"
}

Integration Examples

JavaScript – Create Rule:

const ruleData = {
  name: "Complete High-Value Orders",
  trigger: { type: "order_processing", settings: {} },
  conditions: [{
    type: "order_total",
    settings: { operator: ">=", amount: 100 }
  }],
  actions: [{ type: "complete_order", settings: {} }]
};

wp.apiFetch({
  path: '/odcm/v1/rules/',
  method: 'POST',
  data: ruleData
}).then(response => {
  console.log('Rule created:', response.data.id);
});

PHP – List Rules:

$request = new WP_REST_Request('GET', '/odcm/v1/rules/');
$request->set_param('status', 'publish');
$response = rest_do_request($request);

if ($response->is_success()) {
    $rules = $response->get_data()['data']['items'];
    foreach ($rules as $rule) {
        echo "Rule: " . $rule['name'] . "\n";
    }
}

Rate Limits and Best Practices

  • Bulk operations: Use pagination for large rule sets
  • Testing: Use validate endpoint before saving rules
  • Component discovery: Cache component data, it changes infrequently
  • Search: Implement debouncing for search-as-you-type features

What’s Next

Was this article helpful?

  • Loading...
Table of Contents
  • Loading...