Create a zone ruleset rule

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

by hugo697 ยท 11/16/2023

The script

Submitted by hugo697 Typescript (fetch-only)
Verified 383 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