Add rule to ruleset
Adds a single rule to an existing ruleset. Use this endpoint to add a rule without having to include all the existing ruleset rules in the request.
Use one of the following API endpoints:
Operation | Method + Endpoint |
---|---|
Create an account ruleset rule | POST /accounts/{account_id}/rulesets/{ruleset_id}/rules |
Create a zone ruleset rule | POST /zones/{zone_id}/rulesets/{ruleset_id}/rules |
Include the rule definition in the request body.
By default, the rule will be added to the end of the existing list of rules in the ruleset. To define a specific position for the rule, include a position
object in the request body according to the guidelines in Change the order of a rule in a ruleset.
Invoking this method creates a new version of the ruleset.
The following POST
request adds a rule to ruleset $RULESET_ID
of zone $ZONE_ID
. The ruleset ID was previously obtained using the List zone rulesets operation, and corresponds to the entry point ruleset for the http_request_firewall_custom
phase.
The response will include the complete ruleset after adding the rule.
Required API token permissions
At least one of the following token permissions
is required:
Response Compression Write
Config Settings Write
Dynamic URL Redirects Write
Cache Settings Write
Custom Errors Write
Origin Write
Managed headers Write
Zone Transform Rules Write
Mass URL Redirects Write
Magic Firewall Write
L4 DDoS Managed Ruleset Write
HTTP DDoS Managed Ruleset Write
Sanitize Write
Transform Rules Write
Select Configuration Write
Bot Management Write
Zone WAF Write
Account WAF Write
Account Rulesets Write
Logs Write
Logs Write
curl https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules \ --request POST \ --header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \ --json '{ "action": "js_challenge", "expression": "(ip.src.country eq \"GB\" or ip.src.country eq \"FR\") or cf.threat_score > 0", "description": "challenge GB and FR or based on IP Reputation" }'
{ "result": { "id": "<RULESET_ID>", "name": "Zone Ruleset 1", "description": "My phase entry point ruleset at the zone level", "kind": "zone", "version": "11", "rules": [ { "id": "<RULE_ID_1>", "version": "1", "action": "challenge", "expression": "not http.request.uri.path matches \"^/api/.*$\"", "last_updated": "2023-11-23T11:36:24.192361Z", "ref": "<RULE_REF_1>", "enabled": true }, { "id": "<NEW_RULE_ID>", "version": "1", "action": "js_challenge", "expression": "(ip.src.country eq \"GB\" or ip.src.country eq \"FR\") or cf.threat_score > 0", "description": "challenge GB and FR or based on IP Reputation", "last_updated": "2024-06-22T12:35:58.144683Z", "ref": "<NEW_RULE_REF>", "enabled": true } ], "last_updated": "2024-06-22T12:35:58.144683Z", "phase": "http_request_firewall_custom" }, "success": true, "errors": [], "messages": []}
To define the position of the new rule in the ruleset, include a position
object in the request, containing one of the following:
-
"before": "<RULE_ID>"
— Places the rule before rule<RULE_ID>
. Use this argument with an empty rule ID value (""
) to set the rule as the first rule in the ruleset. -
"after": "<RULE_ID>"
— Places the rule after rule<RULE_ID>
. Use this argument with an empty rule ID value (""
) to set the rule as the last rule in the ruleset. -
"index": <POSITION_NUMBER>
— Places the rule in the exact position specified by the integer number<POSITION_NUMBER>
. Position numbers start with1
. Existing rules in the ruleset from the specified position number onward are shifted one position (no rule is overwritten). For example, when you place a rule in position n usingindex
, existing rules with index n, n+1, n+2, and so on, are shifted one position — their new position will be n+1, n+2, n+3, and so forth. If the index is out of range, the method returns a400
HTTP status code.
For examples of using a position
object, refer to Update a rule in a ruleset.
Was this helpful?
- Resources
- API
- New to Cloudflare?
- Products
- Sponsorships
- Open Source
- Support
- Help Center
- System Status
- Compliance
- GDPR
- Company
- cloudflare.com
- Our team
- Careers
- 2025 Cloudflare, Inc.
- Privacy Policy
- Terms of Use
- Report Security Issues
- Trademark