Create an account ruleset rule

Adds a new rule to an account 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 an account ruleset rule
8
 * Adds a new rule to an account 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
  account_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/accounts/${account_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