ClickFunnels Refine Filter API

> Reusable audience filters that scope contacts for conditional splits, email broadcasts, workflow branches, and other ClickFunnels surfaces. A RefineFilter stores a named, conjunctive set of criteria (attribute + clause + value) scoped to a workspace. Once created, pass its `id` as `condition.filter_id` on a Conditional Split Step, or as `filter_id` on any other surface that accepts one. See the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md) for a full reference of supported attributes, clauses, and the safe-condition policy. The public API restricts filter conditions to a [safe whitelist](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#safe-condition-whitelist); requests outside it return 422 with a pointer to the dev community. For applying a filter to a Conditional Split Step, see [Applying filters to conditional split steps](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-filters-to-conditional-split-steps). For email broadcasts, see [Applying filters to email broadcasts](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#applying-filters-to-email-broadcasts).

Operations 5

GET /workspaces/{workspace_id}/refine_filters List Refine Filters #
POST /workspaces/{workspace_id}/refine_filters Create Refine Filter #
GET /refine_filters/{id} Fetch Refine Filter #
PATCH /refine_filters/{id} Update Refine Filter #
DELETE /refine_filters/{id} Destroy Refine Filter #

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/clickfunnels-refinefilter-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

clickfunnels-refinefilter-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: ClickFunnels Refine Filter API
  termsOfService: https://www.clickfunnels.com/terms-of-service
  contact:
    name: ClickFunnels API Team
    url: https://developers.myclickfunnels.com
  x-logo:
    url: https://statics.myclickfunnels.com/image/1126065/file/31edf05760fafe41a82f16a668ab251f.png
  description: The ClickFunnels REST API that powers webhooks, native integrations, and Zapier lets you manage your ClickFunnels data, automate your workflows, and recreate ClickFunnels functionality in your own apps.
  license:
    name: MIT
    url: https://opensource.org/licenses/MIT
  version: 2.0.0
servers:
- url: https://{subdomain}.myclickfunnels.com/api/v2
  description: ClickFunnels API
  variables:
    subdomain:
      default: myworkspace
security:
- BearerAuth: []
tags:
- name: RefineFilter
  description: '> Reusable audience filters that scope contacts for conditional splits, email broadcasts, workflow branches, and other ClickFunnels surfaces.'
paths:
  /workspaces/{workspace_id}/refine_filters:
    get:
      tags:
      - RefineFilter
      summary: List Refine Filters
      description: List saved filters in a workspace, ordered by id ascending. `after` is the switch between two modes. For backwards compatibility, omitting it returns the complete registry in one payload with no `Pagination-Next` header. Sending it returns bounded pages. For that bounded walk, pass `after=0` on the first request, then pass each `Pagination-Next` value on the next request until the header is absent, which marks the last page. `after=0` is the opt-in itself rather than a row id (real ids start at 1), and it means "start at the beginning" in whichever direction `sort_order` asks for, so it also bootstraps a `sort_order=desc` walk. An `after` value that is neither `0` nor a `Pagination-Next` cursor is not a real position and pages nothing. Results can include every filter class saved in the workspace, not only the ones this API authors; inspect `filter_class` before using the `id` or `public_id` as a resource's `stored_filter_id`. Treat returned order filters as read-only here and edit them in the ClickFunnels Orders UI. Create and update operations on this public endpoint author contact filters only. See Applying existing order filters in the Refine Filters Skill for passing an order filter to the orders list.
      operationId: listWorkspaceRefineFilters
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
      - $ref: '#/components/parameters/after'
      - $ref: '#/components/parameters/sort_order'
      - name: filter
        in: query
        description: 'Filter by available properties in query params, like this: `api/v2/resources?filter[name]=value`. Check our Filtering guide for examples and all about filtering [here](https://developers.myclickfunnels.com/docs/filtering).

          '
        required: false
        schema:
          type: object
          properties:
            name:
              type: string
              description: Exact-match filter on the saved filter's name (unique per workspace), to resolve a saved filter by name instead of id.
              example: VIP newsletter audience
        style: deepObject
        explode: true
      responses:
        '200':
          description: OK
          headers:
            Pagination-Next:
              $ref: '#/components/headers/PaginationNext'
            Link:
              $ref: '#/components/headers/Link'
          content:
            application/json:
              schema:
                type: object
                properties:
                  refine_filters:
                    type: array
                    items:
                      $ref: '#/components/schemas/RefineFilterAttributes'
              example:
                refine_filters:
                - id: 42
                  public_id: AbCdEf
                  workspace_id: 5
                  name: VIP newsletter audience
                  filter_class: ContactsFilter
                  conjunction: and
                  criteria:
                  - attribute: tags.id
                    clause: in
                    value:
                    - tag-pub-id-1
                  created_at: '2026-04-01T12:00:00.000Z'
                  updated_at: '2026-04-01T12:00:00.000Z'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: API key missing or invalid
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: 'Not found: Record missing'
    post:
      tags:
      - RefineFilter
      summary: Create Refine Filter
      description: 'Create a new contact RefineFilter in the workspace. This endpoint does not create order filters.

        The `criteria` array must contain at

        least one entry. Criteria are validated against the

        safe-condition whitelist —

        unsupported attributes/clauses return 422 with a pointer to the dev community.

        See the Refine Filters Skill

        for the full reference (attributes, clauses, worked examples).'
      operationId: createWorkspaceRefineFilter
      parameters:
      - name: workspace_id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefineFilterParametersCreate'
            example:
              refine_filter:
                name: VIP newsletter audience
                filter_class: ContactsFilter
                conjunction: and
                criteria:
                - attribute: tags.id
                  clause: in
                  value:
                  - tag-pub-id-1
                  - tag-pub-id-2
                - attribute: purchased_products.id
                  clause: equals
                  value: prod-pub-id
                - attribute: created_at
                  clause: gte
                  value: '2026-01-01T00:00:00Z'
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefineFilterAttributes'
              example:
                id: 42
                public_id: AbCdEf
                workspace_id: 5
                name: VIP newsletter audience
                filter_class: ContactsFilter
                conjunction: and
                criteria:
                - attribute: tags.id
                  clause: in
                  value:
                  - tag-pub-id-1
                  - tag-pub-id-2
                - attribute: purchased_products.id
                  clause: equals
                  value: prod-pub-id
                - attribute: created_at
                  clause: gte
                  value: '2026-01-01'
                created_at: '2026-04-01T12:00:00.000Z'
                updated_at: '2026-04-01T12:00:00.000Z'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: 'Bad request: HTTP body must be valid JSON'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: API key missing or invalid
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: 'Not found: Record missing'
        '422':
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: criteria must contain at least one entry
  /refine_filters/{id}:
    get:
      tags:
      - RefineFilter
      summary: Fetch Refine Filter
      description: Fetch a single saved filter by its public id. Inspect `filter_class` before applying it to contacts or orders. Treat order filters as read-only here and edit them in the ClickFunnels Orders UI; create and update operations on this public endpoint author contact filters only.
      operationId: getRefineFilter
      parameters:
      - name: id
        in: path
        required: true
        description: Public id of the RefineFilter (e.g. `AbCdEf`).
        schema:
          type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefineFilterAttributes'
              example:
                id: 42
                public_id: AbCdEf
                workspace_id: 5
                name: VIP newsletter audience
                filter_class: ContactsFilter
                conjunction: and
                criteria:
                - attribute: tags.id
                  clause: in
                  value:
                  - tag-pub-id-1
                - attribute: created_at
                  clause: gte
                  value: '2026-01-01'
                created_at: '2026-04-01T12:00:00.000Z'
                updated_at: '2026-04-01T12:00:00.000Z'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: API key missing or invalid
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: 'Not found: Record missing'
    patch:
      tags:
      - RefineFilter
      summary: Update Refine Filter
      description: 'Update an existing RefineFilter. All fields are optional — only provided fields are

        updated. When `criteria` is supplied it replaces the entire criteria set (must contain

        at least one entry). 422 covers shape errors and

        safe-condition policy violations.'
      operationId: updateRefineFilter
      parameters:
      - name: id
        in: path
        required: true
        description: Public id of the RefineFilter to update.
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefineFilterParametersUpdate'
            example:
              refine_filter:
                conjunction: and
                criteria:
                - attribute: tags.id
                  clause: in
                  value:
                  - tag-pub-id-1
                - attribute: created_at
                  clause: gte
                  value: '2026-01-01'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefineFilterAttributes'
              example:
                id: 42
                public_id: AbCdEf
                workspace_id: 5
                name: VIP newsletter audience
                filter_class: ContactsFilter
                conjunction: and
                criteria:
                - attribute: tags.id
                  clause: in
                  value:
                  - tag-pub-id-1
                - attribute: created_at
                  clause: gte
                  value: '2026-01-01'
                created_at: '2026-04-01T12:00:00.000Z'
                updated_at: '2026-04-02T09:00:00.000Z'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: 'Bad request: HTTP body must be valid JSON'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: API key missing or invalid
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: 'Not found: Record missing'
        '422':
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: criteria must contain at least one entry
    delete:
      tags:
      - RefineFilter
      summary: Destroy Refine Filter
      description: 'Delete a RefineFilter. Note that deleting a filter that is currently attached to a

        conditional split step or other surface will leave those surfaces without a filter

        (`condition.filter_id` will remain but the filter record will no longer exist).

        Detach the filter from all consumers before deleting.

        See Applying filters to consumers in the Refine Filters Skill for the surfaces that hold a filter id.'
      operationId: destroyRefineFilter
      parameters:
      - name: id
        in: path
        required: true
        description: Public id of the RefineFilter to delete.
        schema:
          type: string
      responses:
        '204':
          description: No Content
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: API key missing or invalid
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
              example:
                error: 'Not found: Record missing'
components:
  schemas:
    RefineFilterAttributes:
      type: object
      title: Refine Filter
      description: 'A reusable workspace-scoped audience filter composed of one or more criteria joined by a single conjunction.


        Public API requests are validated against a [safe-condition whitelist](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#safe-condition-whitelist); criteria outside the whitelist return 422 with a pointer to the developer community.

        '
      externalDocs:
        description: Refine Filters Skill - attributes, clauses, and worked examples
        url: https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md
      properties:
        id:
          type: integer
          description: Refine Filter ID
        public_id:
          type: string
          description: Obfuscated Refine Filter ID
        workspace_id:
          type: integer
          description: ID of the workspace this filter belongs to
        name:
          type:
          - string
          - 'null'
          description: Optional human-readable name for the filter. Must be unique within the workspace when set.
        filter_class:
          type:
          - string
          - 'null'
          description: 'The filter class recorded on the saved filter. This API authors `ContactsFilter` and applies `ContactsFilter` and `OrdersFilter`, but the list returns every saved filter in the workspace, and other ClickFunnels surfaces save their own classes here — `ContactsSegmentsFilter`, `ProductsFilter`, `FunnelsFilter` and `ContactUpsellsFilter` all appear in real workspaces. Treat this as an open set: match on the class you want rather than assuming the rest are absent. `null` for a legacy row whose stored state can no longer be decoded (such rows also return empty `criteria`; they can still be deleted).'
          example: ContactsFilter
        conjunction:
          type: string
          enum:
          - and
          - or
          description: How the criteria are joined — `and` (all must match) or `or` (any must match).
        criteria:
          type: array
          description: Ordered list of filter criteria.
          items:
            $ref: '#/components/schemas/RefineFilterCriterion'
        created_at:
          type: string
          format: date-time
          description: Created at
        updated_at:
          type: string
          format: date-time
          description: Updated at
      example:
        id: 42
        public_id: AbCdEf
        workspace_id: 5
        name: VIP newsletter audience
        filter_class: ContactsFilter
        conjunction: and
        criteria:
        - attribute: tags.id
          clause: in
          value:
          - tag-pub-id-1
        - attribute: created_at
          clause: gte
          value: '2026-01-01'
        created_at: '2026-04-01T12:00:00.000Z'
        updated_at: '2026-04-01T12:00:00.000Z'
      required:
      - conjunction
      - created_at
      - criteria
      - filter_class
      - id
      - name
      - public_id
      - updated_at
      - workspace_id
    RefineFilterCriterion:
      type: object
      title: Refine Filter Criterion
      description: A single filter criterion consisting of an attribute, a comparison clause, and a value.
      properties:
        attribute:
          type: string
          description: 'The contact attribute to filter on (e.g. `tags.id`, `created_at`, `email_address`).

            The public API restricts attributes to a [safe whitelist](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#safe-condition-whitelist) — see the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md) for the full reference.

            '
          example: tags.id
        clause:
          type: string
          description: 'The comparison operator for this criterion (e.g. `in`, `eq`, `gte`, `lte`, `st`, `nst`).

            Allowed clauses depend on the attribute. Text attributes (`email_address`, `first_name`, `last_name`) only accept `eq` and `sw` on the public API; see the [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#safe-condition-whitelist).

            '
          example: in
        value:
          description: "The comparison value. Type depends on the attribute and clause:\n- **Option conditions** (tags, products, etc.): a single opaque public id string, or an array of public id strings.\n- **Date/datetime conditions**: an ISO 8601 date string (`\"2026-01-01\"`) or datetime string (`\"2026-01-01T00:00:00Z\"`).\n  For `between`/`not_between` clauses supply an array of exactly two date strings.\n  For relative `gt`, `lt`, or `exct` clauses supply an object with `days` and a `modifier` of `ago` or `from_now`.\n- **Text/numeric conditions**: a plain string or number.\n- **Set/not-set clauses**: omit `value` entirely.\n"
          oneOf:
          - type: string
          - type: array
            items:
              type: string
          - type: object
            required:
            - days
            - modifier
            properties:
              days:
                oneOf:
                - type: string
                - type: integer
                description: Number of days used by a relative date clause.
              modifier:
                type: string
                enum:
                - ago
                - from_now
          example:
          - tag-pub-id-1
          - tag-pub-id-2
    RefineFilterParametersCreate:
      type: object
      title: Create Refine Filter
      description: 'Parameters for creating a new RefineFilter. The `criteria` array must contain at least one entry.

        Each criterion requires `attribute` and `clause`; `value` may be omitted for set/not-set clauses.


        ### Supported conditions (public API)


        The public API restricts criteria to the safe whitelist below. Requests

        outside this set return 422 with a pointer to the dev community for

        new-condition requests.


        | Condition                                                                        | Allowed clauses                                                  | Notes                                                              |

        |----------------------------------------------------------------------------------|-------------------------------------------------------------------|--------------------------------------------------------------------|

        | `email_address`, `first_name`, `last_name`                                       | `eq`, `sw`                                                        | Text — equals & starts_with only.                                  |

        | `anonymous`                                                                      | `eq`, `dne`                                                       | Boolean-style option.                                              |

        | `created_at`, `unsubscribed_at`, `last_activity`                                | All standard date clauses                                         | Indexed datetime columns.                                          |

        | `tags.id`                                                                        | `eq`, `dne`, `in`, `nin`                                          | Tag membership — must reference workspace-owned tag ids.           |

        | `has_affiliate_attribution`, `has_active_affiliate_attribution`, `referred_by_affiliate` | All standard clauses                                  | Affiliate attribution lookups.                                     |

        | `email_suppression`                                                              | `st`, `nst`, `eq`, `in`                                           | Email suppression set/not-set or membership.                       |

        | `received_broadcast`, `opened_broadcast`, `clicked_broadcast`                   | `eq`, `in`                                                        | **Must include a specific broadcast id.**                          |

        | `opted_in_funnel_step`, `opted_in_funnel_at`, `opted_in_on_standalone_page`     | `eq`, `in`                                                        | **Must include a specific funnel/step/page id.**                   |


        Conjunction is restricted to `and`. See the full reference at the

        [Refine Filters Skill](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#safe-condition-whitelist).

        '
      required:
      - refine_filter
      properties:
        refine_filter:
          type: object
          required:
          - criteria
          properties:
            name:
              type: string
              description: Optional human-readable name. Must be unique within the workspace when provided.
            filter_class:
              type: string
              description: Filter class. Defaults to `ContactsFilter` (the only supported class).
              default: ContactsFilter
            conjunction:
              type: string
              enum:
              - and
              - or
              description: Join operator for all criteria. Defaults to `and`.
              default: and
            criteria:
              type: array
              minItems: 1
              description: Non-empty array of filter criteria.
              items:
                type: object
                required:
                - attribute
                - clause
                properties:
                  attribute:
                    type: string
                    description: Contact attribute to filter on (e.g. `tags.id`, `created_at`, `email`).
                  clause:
                    type: string
                    description: Comparison operator (e.g. `in`, `equals`, `gte`, `set`).
                  value:
                    description: Comparison value. Relative date clauses use an object with `days` and `modifier`. Omit for set/not-set clauses.
                    oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                    - type: object
                      required:
                      - days
                      - modifier
                      properties:
                        days:
                          oneOf:
                          - type: string
                          - type: integer
                        modifier:
                          type: string
                          enum:
                          - ago
                          - from_now
      example:
        refine_filter:
          name: VIP newsletter audience
          filter_class: ContactsFilter
          conjunction: and
          criteria:
          - attribute: tags.id
            clause: in
            value:
            - tag-pub-id-1
            - tag-pub-id-2
          - attribute: purchased_products.id
            clause: equals
            value: prod-pub-id
          - attribute: created_at
            clause: gte
            value: '2026-01-01T00:00:00Z'
    RefineFilterParametersUpdate:
      type: object
      title: Update Refine Filter
      description: 'Parameters for updating an existing RefineFilter. All fields are optional — only provided

        fields are updated. When `criteria` is supplied it **replaces** the entire criteria set.


        Replacement criteria must satisfy the same safe-condition whitelist enforced on create.

        See [Safe condition whitelist](https://accounts.myclickfunnels.com/.well-known/refine-filters/skill.md#safe-condition-whitelist) for the full reference.

        '
      required:
      - refine_filter
      properties:
        refine_filter:
          type: object
          properties:
            name:
              type: string
              description: New name for the filter. Must be unique within the workspace.
            conjunction:
              type: string
              enum:
              - and
              - or
              description: Replacement join operator for all criteria.
            criteria:
              type: array
              minItems: 1
              description: Replacement criteria array. Must contain at least one entry.
              items:
                type: object
                required:
                - attribute
                - clause
                properties:
                  attribute:
                    type: string
                  clause:
                    type: string
                  value:
                    description: Comparison value. Relative date clauses use an object with `days` and `modifier`. Omit for set/not-set clauses.
                    oneOf:
                    - type: string
                    - type: array
                      items:
                        type: string
                    - type: object
                      required:
                      - days
                      - modifier
                      properties:
                        days:
                          oneOf:
                          - type: string
                          - type: integer
                        modifier:
                          type: string
                          enum:
                          - ago
                          - from_now
      example:
        refine_filter:
          conjunction: and
          criteria:
          - attribute: tags.id
            clause: in
            value:
            - tag-pub-id-1
          - attribute: created_at
            clause: gte
            value: '2026-01-01'
  parameters:
    after:
      name: after
      in: query
      required: false
      schema:
        type: string
      description: ID of item after which the collection should be returned. More examples and info about pagination [in our guides](https://developers.myclickfunnels.com/docs/pagination).
    sort_order:
      name: sort_order
      in: query
      description: Sort order of a list response. Use 'desc' to reverse the default 'asc' (ascending) sort order. Examples [in our guides](https://developers.myclickfunnels.com/docs/pagination).
      required: false
      schema:
        type: string
        enum:
        - asc
        - desc
  headers:
    Link:
      description: A direct link to the next page for the cursor-based pagination. It includes the `after` and the Pagination-Next ID value.
      schema:
        type: string
    PaginationNext:
      description: ID of the last item in the current response after which more records exist. You can use it in an `after` query parameter for cursor-based pagination to get to the next page.
      schema:
        type: string
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
externalDocs:
  description: More in-depth guides and further resources
  url: https://developers.myclickfunnels.com