> ## Documentation Index
> Fetch the complete documentation index at: https://sendmux.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Replace domain-wide sender filters

> Atomically replaces the sender-filter mode and rule set for an entire sending and receiving domain. Applies to every mailbox under the domain unless that mailbox has its own per-mailbox rules (which take precedence). Maximum 1000 rules per request.

For optimistic concurrency, send `If-Match: <etag>` using the ETag from a prior GET. A mismatched `If-Match` returns `409 conflict` (the server's ETag is echoed back so you can decide whether to re-fetch). Responses carry the new ETag so chained edits can pipeline without a re-GET.



## OpenAPI

````yaml /openapi-app.json put /domains/{public_id}/filters
openapi: 3.1.0
info:
  description: Programmatic access to your Sendmux email infrastructure.
  title: Sendmux API
  version: 1.0.0
servers:
  - description: API v1
    url: https://app.sendmux.ai/api/v1
security:
  - bearerAuth: []
paths:
  /domains/{public_id}/filters:
    put:
      tags:
        - Domain Filters
      summary: Replace domain-wide sender filters
      description: >-
        Atomically replaces the sender-filter mode and rule set for an entire
        sending and receiving domain. Applies to every mailbox under the domain
        unless that mailbox has its own per-mailbox rules (which take
        precedence). Maximum 1000 rules per request.


        For optimistic concurrency, send `If-Match: <etag>` using the ETag from
        a prior GET. A mismatched `If-Match` returns `409 conflict` (the
        server's ETag is echoed back so you can decide whether to re-fetch).
        Responses carry the new ETag so chained edits can pipeline without a
        re-GET.
      operationId: managementSetDomainFilters
      parameters:
        - in: path
          name: public_id
          required: true
          schema:
            description: Domain public ID
            type: string
        - in: header
          name: If-Match
          required: false
          schema:
            description: >-
              Weak ETag from a prior GET. Reject with 409 conflict when the
              server's current ETag differs.
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SetFilterStateBody'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FilterStateResponse'
          description: Updated filter state
          headers:
            ETag:
              description: Weak ETag for the post-update resource.
              schema:
                type: string
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Invalid request body
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Domain not found
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: >-
            `If-Match` ETag does not match the server's current version, or the
            domain is send-only.
        '413':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Request body too large
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Rule cap exceeded or invalid rule pattern
        '503':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiError'
          description: Filter service temporarily unavailable
      security:
        - bearerAuth: []
components:
  schemas:
    SetFilterStateBody:
      additionalProperties: false
      properties:
        mode:
          enum:
            - 'off'
            - allowlist
            - denylist
          type: string
        rules:
          description: >-
            Replacement rule set. Maximum 1000 rules per request. An empty array
            is valid (no rules).
          items:
            $ref: '#/components/schemas/FilterRule'
          maxItems: 1000
          type: array
      required:
        - mode
        - rules
      type: object
    FilterStateResponse:
      allOf:
        - $ref: '#/components/schemas/SuccessEnvelope'
        - properties:
            data:
              $ref: '#/components/schemas/FilterState'
            meta:
              $ref: '#/components/schemas/ResponseMeta'
          required:
            - data
          type: object
      unevaluatedProperties: false
    ApiError:
      additionalProperties: false
      properties:
        error:
          additionalProperties: false
          properties:
            code:
              description: Machine-readable error code
              enum:
                - invalid_parameter
                - missing_parameter
                - authentication_required
                - insufficient_permissions
                - not_found
                - conflict
                - limit_exceeded
                - idempotency_conflict
                - payload_too_large
                - validation_error
                - rate_limit_exceeded
                - service_unavailable
                - internal_error
              example: invalid_parameter
              type: string
            doc_url:
              description: Link to relevant documentation
              type: string
            errors:
              description: >-
                Accumulated per-field issues for validation errors. Only present
                on 400/422 responses.
              items:
                $ref: '#/components/schemas/ApiErrorDetail'
              type: array
            message:
              description: Human-readable error description
              type: string
            param:
              description: The parameter that caused the error
              type: string
            retryable:
              description: >-
                Whether the caller may safely retry this request. 4xx are
                typically false (except 429); 5xx are typically true.
              example: false
              type: boolean
          required:
            - code
            - message
            - retryable
          type: object
        meta:
          additionalProperties: false
          properties:
            request_id:
              example: req_clxxxxxxxxxxxxxxxxxxxxxxxxx
              type: string
          required:
            - request_id
          type: object
        ok:
          enum:
            - false
          type: boolean
      required:
        - ok
        - error
        - meta
      type: object
    FilterRule:
      additionalProperties: false
      properties:
        note:
          description: >-
            Free-form caption for the rule (≤255 chars). UI-only metadata —
            never consulted at match time. `null` when absent.
          example: billing webhooks
          maxLength: 255
          type:
            - string
            - 'null'
        pattern:
          description: >-
            Email address or bare domain name. Validated against RFC 5321/1035
            regexes. The `*@domain` wildcard spelling is accepted and normalised
            to the bare domain (matching is by exact address or sender domain).
          example: partner.com
          type: string
        type:
          description: Rule type
          enum:
            - allow
            - deny
          type: string
      required:
        - type
        - pattern
      type: object
    SuccessEnvelope:
      properties:
        meta:
          additionalProperties: {}
          properties: {}
          type: object
        ok:
          enum:
            - true
          type: boolean
      required:
        - ok
        - meta
      type: object
    FilterState:
      additionalProperties: false
      properties:
        mode:
          description: >-
            Active filtering mode. `off` disables filtering (all senders
            accepted). `allowlist` only accepts senders matching a rule.
            `denylist` blocks senders matching a rule.
          enum:
            - 'off'
            - allowlist
            - denylist
          type: string
        rules:
          description: Current rules, sorted by pattern ascending
          items:
            $ref: '#/components/schemas/FilterRule'
          type: array
      required:
        - mode
        - rules
      type: object
    ResponseMeta:
      additionalProperties: false
      properties:
        request_id:
          example: req_clxxxxxxxxxxxxxxxxxxxxxxxxx
          type: string
      required:
        - request_id
      type: object
    ApiErrorDetail:
      additionalProperties: false
      properties:
        code:
          description: >-
            Machine-readable issue code from the validator (e.g. zod issue
            code).
          example: invalid_string
          type: string
        field:
          description: Dot-path of the offending request field.
          example: recipient.email
          type: string
        message:
          description: Human-readable issue description.
          type: string
      required:
        - field
        - code
        - message
      type: object
  securitySchemes:
    bearerAuth:
      bearerFormat: API Key
      description: >-
        Sendmux API key. Use a root API key for Management API routes, or a
        mailbox credential for Mailbox API routes. Obtain keys from the
        dashboard under API Keys.
      scheme: bearer
      type: http

````