0

Create a zone ruleset rule

by
Published Nov 16, 2023

Adds a new rule to a zone ruleset. The rule will be added to the end of the existing list of rules in the ruleset by default.

Script cloudflare Verified

The script

Submitted by hugo697 Typescript (fetch-only)
Verified 403 days ago
1
type Cloudflare = {
2
  token: string;
3
  email: string;
4
  key: string;
5
};
6
/**
7
 * Create a zone ruleset rule
8
 * Adds a new rule to a zone ruleset. The rule will be added to the end of the existing list of rules in the ruleset by default.
9
 */
10
export async function main(
11
  auth: Cloudflare,
12
  ruleset_id: string,
13
  zone_id: string,
14
  body: (
15
    | ({
16
        action?: string;
17
        action_parameters?: { [k: string]: unknown };
18
        categories?: string[];
19
        description?: string;
20
        enabled?: boolean;
21
        expression?: string;
22
        id?: string;
23
        last_updated: string;
24
        logging?: { enabled: boolean; [k: string]: unknown };
25
        ref?: string;
26
        version: string;
27
        [k: string]: unknown;
28
      } & {
29
        action?: "block";
30
        action_parameters?: {
31
          response?: {
32
            content: string;
33
            content_type: string;
34
            status_code: number;
35
            [k: string]: unknown;
36
          };
37
          [k: string]: unknown;
38
        };
39
        description?: { [k: string]: unknown };
40
        [k: string]: unknown;
41
      })
42
    | ({
43
        action?: string;
44
        action_parameters?: { [k: string]: unknown };
45
        categories?: string[];
46
        description?: string;
47
        enabled?: boolean;
48
        expression?: string;
49
        id?: string;
50
        last_updated: string;
51
        logging?: { enabled: boolean; [k: string]: unknown };
52
        ref?: string;
53
        version: string;
54
        [k: string]: unknown;
55
      } & {
56
        action?: "execute";
57
        action_parameters?: {
58
          id: string & { [k: string]: unknown };
59
          matched_data?: { public_key: string; [k: string]: unknown };
60
          overrides?: {
61
            action?: string & { [k: string]: unknown };
62
            categories?: {
63
              action?: string & { [k: string]: unknown };
64
              category: string & { [k: string]: unknown };
65
              enabled?: boolean & { [k: string]: unknown };
66
              sensitivity_level?:
67
                | "default"
68
                | "medium"
69
                | "low"
70
                | ("eoff" & { [k: string]: unknown });
71
              [k: string]: unknown;
72
            }[];
73
            enabled?: boolean & { [k: string]: unknown };
74
            rules?: {
75
              action?: string & { [k: string]: unknown };
76
              enabled?: boolean & { [k: string]: unknown };
77
              id: string & { [k: string]: unknown };
78
              score_threshold?: number;
79
              sensitivity_level?:
80
                | "default"
81
                | "medium"
82
                | "low"
83
                | ("eoff" & { [k: string]: unknown });
84
              [k: string]: unknown;
85
            }[];
86
            sensitivity_level?:
87
              | "default"
88
              | "medium"
89
              | "low"
90
              | ("eoff" & { [k: string]: unknown });
91
            [k: string]: unknown;
92
          };
93
          [k: string]: unknown;
94
        };
95
        description?: { [k: string]: unknown };
96
        [k: string]: unknown;
97
      })
98
    | ({
99
        action?: string;
100
        action_parameters?: { [k: string]: unknown };
101
        categories?: string[];
102
        description?: string;
103
        enabled?: boolean;
104
        expression?: string;
105
        id?: string;
106
        last_updated: string;
107
        logging?: { enabled: boolean; [k: string]: unknown };
108
        ref?: string;
109
        version: string;
110
        [k: string]: unknown;
111
      } & {
112
        action?: "log";
113
        action_parameters?: {};
114
        description?: { [k: string]: unknown };
115
        [k: string]: unknown;
116
      })
117
    | ({
118
        action?: string;
119
        action_parameters?: { [k: string]: unknown };
120
        categories?: string[];
121
        description?: string;
122
        enabled?: boolean;
123
        expression?: string;
124
        id?: string;
125
        last_updated: string;
126
        logging?: { enabled: boolean; [k: string]: unknown };
127
        ref?: string;
128
        version: string;
129
        [k: string]: unknown;
130
      } & {
131
        action?: "skip";
132
        action_parameters?: {
133
          phases?: (
134
            | "ddos_l4"
135
            | "ddos_l7"
136
            | "http_config_settings"
137
            | "http_custom_errors"
138
            | "http_log_custom_fields"
139
            | "http_ratelimit"
140
            | "http_request_cache_settings"
141
            | "http_request_dynamic_redirect"
142
            | "http_request_firewall_custom"
143
            | "http_request_firewall_managed"
144
            | "http_request_late_transform"
145
            | "http_request_origin"
146
            | "http_request_redirect"
147
            | "http_request_sanitize"
148
            | "http_request_sbfm"
149
            | "http_request_select_configuration"
150
            | "http_request_transform"
151
            | "http_response_compression"
152
            | "http_response_firewall_managed"
153
            | "http_response_headers_transform"
154
            | "magic_transit"
155
            | "magic_transit_ids_managed"
156
            | ("magic_transit_managed" & { [k: string]: unknown })
157
          )[];
158
          products?:
159
            | "bic"
160
            | "hot"
161
            | "rateLimit"
162
            | "securityLevel"
163
            | "uaBlock"
164
            | "waf"
165
            | "zoneLockdown"[];
166
          rules?: { [k: string]: (string & { [k: string]: unknown })[] };
167
          ruleset?: "current";
168
          rulesets?: (string & { [k: string]: unknown })[];
169
          [k: string]: unknown;
170
        };
171
        description?: { [k: string]: unknown };
172
        [k: string]: unknown;
173
      })
174
  ) & {
175
    position?:
176
      | ({ [k: string]: unknown } & { before?: string; [k: string]: unknown })
177
      | ({ [k: string]: unknown } & { after?: string; [k: string]: unknown })
178
      | ({ [k: string]: unknown } & { index?: number; [k: string]: unknown });
179
    [k: string]: unknown;
180
  }
181
) {
182
  const url = new URL(
183
    `https://api.cloudflare.com/client/v4/zones/${zone_id}/rulesets/${ruleset_id}/rules`
184
  );
185

186
  const response = await fetch(url, {
187
    method: "POST",
188
    headers: {
189
      "X-AUTH-EMAIL": auth.email,
190
      "X-AUTH-KEY": auth.key,
191
      "Content-Type": "application/json",
192
      Authorization: "Bearer " + auth.token,
193
    },
194
    body: JSON.stringify(body),
195
  });
196
  if (!response.ok) {
197
    const text = await response.text();
198
    throw new Error(`${response.status} ${text}`);
199
  }
200
  return await response.json();
201
}
202