---
title: "Get Properties By Filter"
method: POST
path: "/property/filter"
---

# Get Properties By Filter

`POST /property/filter`

## Request

- Base URL: `https://dc-region.zuperpro.com/api`
- URL: `https://dc-region.zuperpro.com/api/property/filter`
- Auth: API key in header `x-api-key`

Rule-engine-based list endpoint — an alternative to the simple `filter.*` query params on the plain list endpoint, for building complex AND/OR filter conditions. This endpoint is served by a separate microservice from most of the API (not `master_service`), and its filter schema differs in two ways from other modules' generic-filter endpoints: each `filter_rules` entry also carries an explicit `field_type`, and the `operator` enum is wider (adds `GREATER_THAN_EQUAL_TO`, `LESS_THAN_EQUAL_TO`, `IN`). `sort_by` only accepts `property_name` or `created_at` — the smallest allow-list of any filter endpoint in the API (note: the service's own 400 validation message text says "created_by", but the actual accepted value is `created_at` — a mismatch in the error message itself, not in behavior). A `filter_rules` entry with `key: "keyword"` is pulled out and used as a free-text search instead of going through the rule engine.

## Request body

- object
  - `page` integer
  - `limit` integer: Also accepted as `count`. Max 1000 — larger values return 400 `COUNT_LIMIT_EXCEEDED`.
  - `count` integer: Alias for `limit`.
  - `sort` 'ASC' | 'DESC'
  - `sort_by` 'property_name' | 'created_at'
  - `filter_rules` object[]: Rule-engine filter conditions. `field_type` must match the type this module's Meta Filter endpoint declares for that `key` (`fieldDataKey`) — it is validated separately from `type` (the default/nested/custom discriminator). `module` is only needed for keys shared across modules.
    - `type` 'default_field' | 'nested_field' | 'custom_field'
    - `key` string, required: Get the exact field key enum from this module's Meta Filter endpoint.
    - `operator` 'EQUAL_TO' | 'NOT_EQUAL_TO' | 'CONTAINS' | 'NOT_CONTAINS' | 'IS_EMPTY' | 'IS_NOT_EMPTY' | 'GREATER_THAN' | 'LESS_THAN' | 'GREATER_THAN_EQUAL_TO' | 'LESS_THAN_EQUAL_TO' | 'BETWEEN' | 'IN', required
    - `value` unknown
    - `field_type` 'SINGLE_LINE' | 'MULTI_LINE' | 'SINGLE_ITEM' | 'RADIO' | 'MULTI_ITEM' | 'NUMBER' | 'DATE' | 'TIME' | 'DATETIME' | 'LOOKUP' | 'FILE' | 'TEXT' | 'DROPDOWN' | 'TAGS', required
    - `rangeKey` string: Optional secondary key used by BETWEEN-style range conditions on some nested fields.
    - `operatorDisplayKey` string
    - `displayKeyValue` unknown[]
      - unknown
    - `module` 'JOB' | 'CUSTOMER' | 'USER' | 'ESTIMATES' | 'QUOTE' | 'INVOICE' | 'ASSETS' | 'PRODUCTS' | 'TIMESHEET' | 'EMPLOYEE' | 'MAPS' | 'REPORTS' | 'SCHEDULE' | 'ORGANIZATION' | 'PROPERTY': Required only for the handful of cross-module-shared keys.
  - `filter_rule_operator` 'AND' | 'OR'
  - `filter.module_uid` string: Comma-separated list of this module's own UIDs to restrict to.
  - `fields_to_select` string
  - `preferred_timezone` string
  - `cursor` string
  - `prev_cursor` string
  - `cursor_pagination` boolean: Switches the response to the cursor-paginated shape.
  - `last_page` boolean

## Response `200`

200

- object
  - `type` 'SUCCESS'
  - `data` object[]: Property documents — same shape as GET /property. Switches to the cursor-paginated shape (`{type, data, current_page_records, total_records, paging}` — this is the only one of the three modules that keeps `current_page_records` even in cursor mode) when `cursor_pagination`/`cursor`/`prev_cursor`/`last_page` is sent.
  - `current_page_records` integer: Length of the `data` array returned in this page.
  - `total_records` integer
  - `current_page` integer
  - `total_pages` integer

## Other responses

- `400`: 400

## Changes

- **2026-11-03** `3c21bc232e16`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zuper/apis/zuper-pro-api/changes/property/filter/post.md)

---

[API](https://skmtc.dev/zuper/apis/zuper-pro-api.md) - [All operations](https://skmtc.dev/zuper/apis/zuper-pro-api/llms.txt) - [OpenAPI document](https://skmtc.dev/zuper/apis/zuper-pro-api/revisions/3c21bc232e16?raw)
