Appwrite Firewall (WAF) API

Appwrite Firewall — traffic control and WAF rules for a project, announced 2026-09-04. 13 operations across 12 paths in the Appwrite 2.0.0 OpenAPI.

Operations 13

GET /waf/rules List WAF rules. #
POST /waf/rules/bypass Create a bypass WAF rule. #
PATCH /waf/rules/bypass/{ruleId} Update a bypass WAF rule. #
POST /waf/rules/challenge Create a challenge WAF rule. #
PATCH /waf/rules/challenge/{ruleId} Update a challenge WAF rule. #
POST /waf/rules/deny Create a deny WAF rule. #
PATCH /waf/rules/deny/{ruleId} Update a deny WAF rule. #
POST /waf/rules/rate-limit Create a rate-limit WAF rule. #
PATCH /waf/rules/rate-limit/{ruleId} Update a rate-limit WAF rule. #
POST /waf/rules/redirect Create a redirect WAF rule. #
PATCH /waf/rules/redirect/{ruleId} Update a redirect WAF rule. #
GET /waf/rules/{ruleId} Get a WAF rule. #
DELETE /waf/rules/{ruleId} Delete a WAF rule. #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/appwrite-waf-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

appwrite-waf-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: Appwrite Waf API
  description: Appwrite backend as a service cuts up to 70% of the time and costs required for building a modern application. We abstract and simplify common development tasks behind a REST APIs, to help you develop your app in a fast and secure way. For full API documentation and tutorials go to [https://appwrite.io/docs](https://appwrite.io/docs)
  version: 2.0.0
  termsOfService: https://appwrite.io/policy/terms
  contact:
    name: Appwrite Team
    url: https://appwrite.io/support
    email: team@appwrite.io
  license:
    name: BSD-3-Clause
    url: https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE
servers:
- url: https://cloud.appwrite.io/v1
  description: Appwrite Cloud endpoint.
- url: https://{region}.cloud.appwrite.io/v1
  description: Appwrite Cloud regional endpoint. Replace `{region}` with your project region.
  variables:
    region:
      default: fra
      description: Appwrite Cloud region.
tags:
- name: waf
  description: Appwrite waf service.
paths:
  /waf/rules:
    get:
      summary: List WAF rules.
      operationId: wafListRules
      tags:
      - waf
      description: 'List WAF rules for the current project.

        '
      responses:
        '200':
          description: WAF rule list
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/wafRuleList'
      deprecated: false
      x-appwrite:
        group: rules
        demo: waf/list-rules.md
        rate-limit: 0
        rate-time: 3600
        rate-key: url:{url},ip:{ip}
        scope: wafRules.read
        platforms:
        - console
        - server
        packaging: false
        public: true
        auth:
          console:
            Project: []
          server:
            Project: []
            Key: []
      security:
      - Project: []
        Key: []
      parameters:
      - name: queries
        description: Array of query strings generated using the Query class provided by the SDK. [Learn more about queries](https://appwrite.io/docs/queries). Maximum of 100 queries are allowed, each 4096 characters long.
        required: false
        schema:
          type: array
          items:
            type: string
          default: []
        in: query
      - name: search
        description: 'Search term to filter your list results. Max length: 256 chars.'
        required: false
        schema:
          type: string
          example: <SEARCH>
          default: ''
        in: query
      - name: total
        description: When set to false, the total count returned will be 0 and will not be calculated.
        required: false
        schema:
          type: boolean
          example: false
          default: true
        in: query
  /waf/rules/bypass:
    post:
      summary: Create a bypass WAF rule.
      operationId: wafCreateBypassRule
      tags:
      - waf
      description: 'Create a bypass WAF rule. Conditions can match request attributes including `ip` (plain IPs or CIDR blocks like `10.0.0.0/8`), `method`, `path`, `host`, `country`, `continent`, `headers.<name>`, `query.<key>`, `queryKeys`, `userAgent`, `os`, `osVersion`, `browser`, and `browserVersion`. Conditions on `city` and `state` require the premium Geo DB addon.

        '
      responses:
        '201':
          description: WafRuleBypass
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/wafRuleBypass'
      deprecated: false
      x-appwrite:
        group: rules
        demo: waf/create-bypass-rule.md
        rate-limit: 0
        rate-time: 3600
        rate-key: url:{url},ip:{ip}
        scope: wafRules.write
        platforms:
        - console
        - server
        packaging: false
        public: true
        auth:
          console:
            Project: []
          server:
            Project: []
            Key: []
      security:
      - Project: []
        Key: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ruleId:
                  description: Rule ID. Choose a custom ID or pass `ID.unique()` to generate a unique one.
                  type: string
                  example: <RULE_ID>
                  x-appwrite:
                    idGenerator: ID.unique
                resourceType:
                  description: Resource type the rule applies to.
                  type: string
                  example: api
                resourceId:
                  description: Resource identifier. Leave empty for the API resource type.
                  type: string
                  example: <RESOURCE_ID>
                  nullable: true
                name:
                  description: Rule name.
                  type: string
                  example: <NAME>
                description:
                  description: Optional description for the rule.
                  type: string
                  default: ''
                  example: <DESCRIPTION>
                priority:
                  description: Evaluation priority. Lower numbers run earlier.
                  type: integer
                  default: 0
                  example: -100000
                  format: int32
                enabled:
                  description: Set to false to create the rule in a disabled state.
                  type: boolean
                  default: true
                  example: false
                conditions:
                  description: Array of condition strings generated using the WAF Condition builder. Maximum of 100 conditions are allowed, each 4096 characters long.
                  type: string
                  default: []
              required:
              - ruleId
              - resourceType
              - name
  /waf/rules/bypass/{ruleId}:
    patch:
      summary: Update a bypass WAF rule.
      operationId: wafUpdateBypassRule
      tags:
      - waf
      description: 'Update a bypass WAF rule. Conditions can match request attributes including `ip` (plain IPs or CIDR blocks like `10.0.0.0/8`), `method`, `path`, `host`, `country`, `continent`, `headers.<name>`, `query.<key>`, `queryKeys`, `userAgent`, `os`, `osVersion`, `browser`, and `browserVersion`. Conditions on `city` and `state` require the premium Geo DB addon.

        '
      responses:
        '200':
          description: WafRuleBypass
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/wafRuleBypass'
      deprecated: false
      x-appwrite:
        group: rules
        demo: waf/update-bypass-rule.md
        rate-limit: 0
        rate-time: 3600
        rate-key: url:{url},ip:{ip}
        scope: wafRules.write
        platforms:
        - console
        - server
        packaging: false
        public: true
        auth:
          console:
            Project: []
          server:
            Project: []
            Key: []
      security:
      - Project: []
        Key: []
      parameters:
      - name: ruleId
        description: Rule ID.
        required: true
        schema:
          type: string
          example: <RULE_ID>
        in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                resourceType:
                  description: Resource type the rule applies to.
                  type: string
                  example: api
                  nullable: true
                resourceId:
                  description: Resource identifier. Required for functions and sites.
                  type: string
                  example: <RESOURCE_ID>
                  nullable: true
                name:
                  description: Rule name.
                  type: string
                  example: <NAME>
                  nullable: true
                description:
                  description: Optional description for the rule.
                  type: string
                  example: <DESCRIPTION>
                  nullable: true
                priority:
                  description: Evaluation priority. Lower numbers run earlier.
                  type: integer
                  example: -100000
                  format: int32
                  nullable: true
                enabled:
                  description: Set to false to disable the rule.
                  type: boolean
                  example: false
                  nullable: true
                conditions:
                  description: Array of condition strings generated using the WAF Condition builder. Maximum of 100 conditions are allowed, each 4096 characters long.
                  type: string
                  nullable: true
  /waf/rules/challenge:
    post:
      summary: Create a challenge WAF rule.
      operationId: wafCreateChallengeRule
      tags:
      - waf
      description: 'Create a challenge WAF rule. Use `difficulty` (1 easiest to 5 hardest) to tune the client-side proof-of-work cost, and `ttl` to control how long, in seconds, a visitor stays cleared after passing the challenge before being challenged again. Conditions can match request attributes including `ip` (plain IPs or CIDR blocks like `10.0.0.0/8`), `method`, `path`, `host`, `country`, `continent`, `headers.<name>`, `query.<key>`, `queryKeys`, `userAgent`, `os`, `osVersion`, `browser`, and `browserVersion`. Conditions on `city` and `state` require the premium Geo DB addon.

        '
      responses:
        '201':
          description: WafRuleChallenge
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/wafRuleChallenge'
      deprecated: false
      x-appwrite:
        group: rules
        demo: waf/create-challenge-rule.md
        rate-limit: 0
        rate-time: 3600
        rate-key: url:{url},ip:{ip}
        scope: wafRules.write
        platforms:
        - console
        - server
        packaging: false
        public: true
        auth:
          console:
            Project: []
          server:
            Project: []
            Key: []
      security:
      - Project: []
        Key: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ruleId:
                  description: Rule ID. Choose a custom ID or pass `ID.unique()` to generate a unique one.
                  type: string
                  example: <RULE_ID>
                  x-appwrite:
                    idGenerator: ID.unique
                resourceType:
                  description: Resource type the rule applies to.
                  type: string
                  example: api
                resourceId:
                  description: Resource identifier. Required for functions and sites.
                  type: string
                  example: <RESOURCE_ID>
                  nullable: true
                name:
                  description: Rule name.
                  type: string
                  example: <NAME>
                description:
                  description: Optional description for the rule.
                  type: string
                  default: ''
                  example: <DESCRIPTION>
                challengeType:
                  description: Challenge type enforced by the rule.
                  type: string
                  default: compute
                  example: compute
                priority:
                  description: Evaluation priority. Lower numbers run earlier.
                  type: integer
                  default: 0
                  example: -100000
                  format: int32
                enabled:
                  description: Set to false to create the rule in a disabled state.
                  type: boolean
                  default: true
                  example: false
                conditions:
                  description: Array of condition strings generated using the WAF Condition builder. Maximum of 100 conditions are allowed, each 4096 characters long.
                  type: string
                  default: []
                difficulty:
                  description: Challenge difficulty from 1 (easiest) to 5 (hardest). Higher values demand more client-side proof-of-work.
                  type: integer
                  default: 3
                  example: 1
                  format: int32
                ttl:
                  description: How long, in seconds, a visitor stays cleared after passing the challenge before being challenged again.
                  type: integer
                  default: 1800
                  example: 900
                  format: int32
              required:
              - ruleId
              - resourceType
              - name
  /waf/rules/challenge/{ruleId}:
    patch:
      summary: Update a challenge WAF rule.
      operationId: wafUpdateChallengeRule
      tags:
      - waf
      description: 'Update a challenge WAF rule. Use `difficulty` (1 easiest to 5 hardest) to tune the client-side proof-of-work cost, and `ttl` to control how long, in seconds, a visitor stays cleared after passing the challenge before being challenged again. Conditions can match request attributes including `ip` (plain IPs or CIDR blocks like `10.0.0.0/8`), `method`, `path`, `host`, `country`, `continent`, `headers.<name>`, `query.<key>`, `queryKeys`, `userAgent`, `os`, `osVersion`, `browser`, and `browserVersion`. Conditions on `city` and `state` require the premium Geo DB addon.

        '
      responses:
        '200':
          description: WafRuleChallenge
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/wafRuleChallenge'
      deprecated: false
      x-appwrite:
        group: rules
        demo: waf/update-challenge-rule.md
        rate-limit: 0
        rate-time: 3600
        rate-key: url:{url},ip:{ip}
        scope: wafRules.write
        platforms:
        - console
        - server
        packaging: false
        public: true
        auth:
          console:
            Project: []
          server:
            Project: []
            Key: []
      security:
      - Project: []
        Key: []
      parameters:
      - name: ruleId
        description: Rule ID.
        required: true
        schema:
          type: string
          example: <RULE_ID>
        in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                resourceType:
                  description: Resource type the rule applies to.
                  type: string
                  example: api
                  nullable: true
                resourceId:
                  description: Resource identifier. Required for functions and sites.
                  type: string
                  example: <RESOURCE_ID>
                  nullable: true
                name:
                  description: Rule name.
                  type: string
                  example: <NAME>
                  nullable: true
                description:
                  description: Optional description for the rule.
                  type: string
                  example: <DESCRIPTION>
                  nullable: true
                challengeType:
                  description: Challenge type enforced by the rule.
                  type: string
                  example: compute
                  nullable: true
                priority:
                  description: Evaluation priority. Lower numbers run earlier.
                  type: integer
                  example: -100000
                  format: int32
                  nullable: true
                enabled:
                  description: Set to false to disable the rule.
                  type: boolean
                  example: false
                  nullable: true
                conditions:
                  description: Array of condition strings generated using the WAF Condition builder. Maximum of 100 conditions are allowed, each 4096 characters long.
                  type: string
                  nullable: true
                difficulty:
                  description: Challenge difficulty from 1 (easiest) to 5 (hardest). Higher values demand more client-side proof-of-work.
                  type: integer
                  example: 1
                  format: int32
                  nullable: true
                ttl:
                  description: How long, in seconds, a visitor stays cleared after passing the challenge before being challenged again.
                  type: integer
                  example: 900
                  format: int32
                  nullable: true
  /waf/rules/deny:
    post:
      summary: Create a deny WAF rule.
      operationId: wafCreateDenyRule
      tags:
      - waf
      description: 'Create a deny WAF rule. Conditions can match request attributes including `ip` (plain IPs or CIDR blocks like `10.0.0.0/8`), `method`, `path`, `host`, `country`, `continent`, `headers.<name>`, `query.<key>`, `queryKeys`, `userAgent`, `os`, `osVersion`, `browser`, and `browserVersion`. Conditions on `city` and `state` require the premium Geo DB addon.

        '
      responses:
        '201':
          description: WafRuleDeny
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/wafRuleDeny'
      deprecated: false
      x-appwrite:
        group: rules
        demo: waf/create-deny-rule.md
        rate-limit: 0
        rate-time: 3600
        rate-key: url:{url},ip:{ip}
        scope: wafRules.write
        platforms:
        - console
        - server
        packaging: false
        public: true
        auth:
          console:
            Project: []
          server:
            Project: []
            Key: []
      security:
      - Project: []
        Key: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ruleId:
                  description: Rule ID. Choose a custom ID or pass `ID.unique()` to generate a unique one.
                  type: string
                  example: <RULE_ID>
                  x-appwrite:
                    idGenerator: ID.unique
                resourceType:
                  description: Resource type the rule applies to.
                  type: string
                  example: api
                resourceId:
                  description: Resource identifier. Required for functions and sites.
                  type: string
                  example: <RESOURCE_ID>
                  nullable: true
                name:
                  description: Rule name.
                  type: string
                  example: <NAME>
                description:
                  description: Optional description for the rule.
                  type: string
                  default: ''
                  example: <DESCRIPTION>
                priority:
                  description: Evaluation priority. Lower numbers run earlier.
                  type: integer
                  default: 0
                  example: -100000
                  format: int32
                enabled:
                  description: Set to false to create the rule in a disabled state.
                  type: boolean
                  default: true
                  example: false
                conditions:
                  description: Array of condition strings generated using the WAF Condition builder. Maximum of 100 conditions are allowed, each 4096 characters long.
                  type: string
                  default: []
              required:
              - ruleId
              - resourceType
              - name
  /waf/rules/deny/{ruleId}:
    patch:
      summary: Update a deny WAF rule.
      operationId: wafUpdateDenyRule
      tags:
      - waf
      description: 'Update a deny WAF rule. Conditions can match request attributes including `ip` (plain IPs or CIDR blocks like `10.0.0.0/8`), `method`, `path`, `host`, `country`, `continent`, `headers.<name>`, `query.<key>`, `queryKeys`, `userAgent`, `os`, `osVersion`, `browser`, and `browserVersion`. Conditions on `city` and `state` require the premium Geo DB addon.

        '
      responses:
        '200':
          description: WafRuleDeny
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/wafRuleDeny'
      deprecated: false
      x-appwrite:
        group: rules
        demo: waf/update-deny-rule.md
        rate-limit: 0
        rate-time: 3600
        rate-key: url:{url},ip:{ip}
        scope: wafRules.write
        platforms:
        - console
        - server
        packaging: false
        public: true
        auth:
          console:
            Project: []
          server:
            Project: []
            Key: []
      security:
      - Project: []
        Key: []
      parameters:
      - name: ruleId
        description: Rule ID.
        required: true
        schema:
          type: string
          example: <RULE_ID>
        in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                resourceType:
                  description: Resource type the rule applies to.
                  type: string
                  example: api
                  nullable: true
                resourceId:
                  description: Resource identifier. Required for functions and sites.
                  type: string
                  example: <RESOURCE_ID>
                  nullable: true
                name:
                  description: Rule name.
                  type: string
                  example: <NAME>
                  nullable: true
                description:
                  description: Optional description for the rule.
                  type: string
                  example: <DESCRIPTION>
                  nullable: true
                priority:
                  description: Evaluation priority. Lower numbers run earlier.
                  type: integer
                  example: -100000
                  format: int32
                  nullable: true
                enabled:
                  description: Set to false to disable the rule.
                  type: boolean
                  example: false
                  nullable: true
                conditions:
                  description: Array of condition strings generated using the WAF Condition builder. Maximum of 100 conditions are allowed, each 4096 characters long.
                  type: string
                  nullable: true
  /waf/rules/rate-limit:
    post:
      summary: Create a rate-limit WAF rule.
      operationId: wafCreateRateLimitRule
      tags:
      - waf
      description: 'Create a rate limit WAF rule. Use `key` to choose the counter: `ip` limits per client IP, while `userId` limits per authenticated user (requests without an authenticated user skip `userId` rules). Conditions can match request attributes including `ip` (plain IPs or CIDR blocks like `10.0.0.0/8`), `method`, `path`, `host`, `country`, `continent`, `headers.<name>`, `query.<key>`, `queryKeys`, `userAgent`, `os`, `osVersion`, `browser`, and `browserVersion`. Conditions on `city` and `state` require the premium Geo DB addon.

        '
      responses:
        '201':
          description: WafRuleRateLimit
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/wafRuleRateLimit'
      deprecated: false
      x-appwrite:
        group: rules
        demo: waf/create-rate-limit-rule.md
        rate-limit: 0
        rate-time: 3600
        rate-key: url:{url},ip:{ip}
        scope: wafRules.write
        platforms:
        - console
        - server
        packaging: false
        public: true
        auth:
          console:
            Project: []
          server:
            Project: []
            Key: []
      security:
      - Project: []
        Key: []
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                ruleId:
                  description: Rule ID. Choose a custom ID or pass `ID.unique()` to generate a unique one.
                  type: string
                  example: <RULE_ID>
                  x-appwrite:
                    idGenerator: ID.unique
                resourceType:
                  description: Resource type the rule applies to.
                  type: string
                  example: api
                resourceId:
                  description: Resource identifier. Required for functions and sites.
                  type: string
                  example: <RESOURCE_ID>
                  nullable: true
                name:
                  description: Rule name.
                  type: string
                  example: <NAME>
                description:
                  description: Optional description for the rule.
                  type: string
                  default: ''
                  example: <DESCRIPTION>
                limit:
                  description: Maximum number of matching requests allowed in the configured interval.
                  type: integer
                  example: 1
                  format: int32
                interval:
                  description: Interval in seconds used for rate limiting.
                  type: integer
                  example: 1
                  format: int32
                key:
                  description: Rate limit key. Use `ip` to limit per client IP or `userId` to limit per authenticated user. Requests without an authenticated user skip `userId` rules.
                  type: string
                  default: ip
                  example: ip
                strategy:
                  description: Rate limit strategy. `fixedWindow` counts requests in discrete intervals, `slidingWindow` weights the previous interval for smoother limiting, and `tokenBucket` refills allowance continuously to permit short bursts.
                  type: string
                  default: fixedWindow
                  example: fixedWindow
                maxBucketSize:
                  description: Maximum number of tokens the bucket can hold for the `tokenBucket` strategy, controlling how large a burst is allowed. The sustained refill rate is `limit / interval`. Defaults to `limit` when omitted. Ignored by other strategies.
                  type: integer
                  example: 1
                  format: int32
                  nullable: true
                priority:
                  description: Evaluation priority. Lower numbers run earlier.
                  type: integer
                  default: 0
                  example: -100000
                  format: int32
                enabled:
                  description: Set to false to create the rule in a disabled state.
                  type: boolean
                  default: true
                  example: false
                conditions:
                  description: Array of condition strings generated using the WAF Condition builder. Maximum of 100 conditions are allowed, each 4096 characters long.
                  type: string
                  default: []
              required:
              - ruleId
              - resourceType
              - name
              - limit
              - interval
  /waf/rules/rate-limit/{ruleId}:
    patch:
      summary: Update a rate-limit WAF rule.
      operationId: wafUpdateRateLimitRule
      tags:
      - waf
      description: 'Update a rate limit WAF rule. Use `key` to choose the counter: `ip` limits per client IP, while `userId` limits per authenticated user (requests without an authenticated user skip `userId` rules). Conditions can match request attributes including `ip` (plain IPs or CIDR blocks like `10.0.0.0/8`), `method`, `path`, `host`, `country`, `continent`, `headers.<name>`, `query.<key>`, `queryKeys`, `userAgent`, `os`, `osVersion`, `browser`, and `browserVersion`. Conditions on `city` and `state` require the premium Geo DB addon.

        '
      responses:
        '200':
          description: WafRuleRateLimit
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/wafRuleRateLimit'
      deprecated: false
      x-appwrite:
        group: rules
        demo: waf/update-rate-limit-rule.md
        rate-limit: 0
        rate-time: 3600
        rate-key: url:{url},ip:{ip}
        scope: wafRules.write
        platforms:
        - console
        - server
        packaging: false
        public: true
        auth:
          console:
            Project: []
          server:
            Project: []
            Key: []
      security:
      - Project: []
        Key: []
      parameters:
      - name: ruleId
        description: Rule ID.
        required: true
        schema:
          type: string
          example: <RULE_ID>
        in: path
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                resourceType:
                  description: Resource type the rule applies to.
                  type: string
                  example: api
                  nullable: true
                resourceId:
                  description: Resource identifier. Required for functions and sites.
                  type: string
                  example: <RESOURCE_ID>
                  nullable: true
                name:
                  description: Rule name.
                  type: string
                  example: <NAME>
                  nullable: true
                description:
                  description: Optional description for the rule.
                  type: string
                  example: <DESCRIPTION>
                  nullable: true
                limit:
                  description: Maximum number of matching requests allowed in the configured interval.
                  type: integer
                  example: 1
                  format: int32
                  nullable: true
                interval:
                  description: Interval in seconds used for rate limiting.
                  type: integer
                  example: 1
                  format: int32
                  nullable: true
                key:
                  description: Rate limit key. Use `ip` to limit per client IP or `userId` to limit per authenticated user. Requests without an authenticated user skip `userId` rules.
                  type: string
                  example: ip
                  nullable: true
                maxBucketSize:
                  description: Maximum number of tokens the bucket can hold for the `tokenBucket` strategy, controlling how large a burst is allowed. The sustained refill rate is `limit / interval`. Ignored by other strategies. The strategy itself cannot be changed after creation.
                  type: integer
                  example: 1
                  format: int32
                  nullable: true
                priority:
                  description: Evaluation priority. Lower numbers run earlier.
                  type: integer
                  example: -100000
                  format: int32
                  nullable: true
                enabled:
                  description: Set to false to disable the rule.
                  type: boolean
                  example: false
                  nullable: true
                conditions:
                  description: Array of condition strings generated using the WAF Condition builder. Maximum of 100 conditions are allowed, each 4096 characters long.
                  type: string
                  nullable: true
  /waf/rules/redirect:
    post:
      summary: Create a redirect WAF rule.
      operationId: wafCreateRedirectRule
      tags:
      - waf
      description: 'Create a redirect WAF rule. Conditions can match request attributes including `ip` (plain IPs or CIDR blocks like `10.0.0.0/8`), `method`, `path`, `host`, `country`, `continent`, `headers.<name>`, `query.<key>`, `queryKeys`, `userAgent`, `os`, `osVersion`, `browser`, and `

# --- truncated at 32 KB (63 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/appwrite/refs/heads/main/openapi/appwrite-waf-api-openapi.yml