---
title: "Get Estimates By Filter"
method: POST
path: "/estimate/filter"
---

# Get Estimates By Filter

`POST /estimate/filter`

## Request

- Base URL: `https://dc-region.zuperpro.com/api`
- URL: `https://dc-region.zuperpro.com/api/estimate/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. Get the field key enum for filter_rules from the corresponding Meta Filter endpoint. `fields_to_select` is restricted to a fixed allowlist of fields: `estimate_uid`, `estimate_no`, `prefix`, `associations`, `reference_no`, `job`, `customer`, `customer_name`, `estimate_date`, `estimate_date_dt`, `total`, `tags`, `expiry_date`, `expiry_date_dt`, `accepted_date`, `sent_date`, `converted_date`, `estimate_status`, `deposit`, `is_expired`, `is_deleted`, `is_active`, `is_converted`, `custom_fields`, `custom_field_internal_object`, `total_discount`, `is_proposal`, `proposal_title`, `proposal_template`, `proposal_options`, `created_by`, `sold_by_user`, `created_at`, `updated_at`, `external_id`, `external_status`, `business_unit`, `waiting_on_po`, `waiting_on_po_uids`, `waiting_on_mr`, `waiting_on_mr_uids`, `cpq_status`, `pending_option_selection`, `payment_methods`. Supports cursor pagination — pass `cursor_pagination: true` (or any of `cursor`/`prev_cursor`/`last_page`) to switch response modes.

## Request body

- object
  - `page` integer
  - `limit` integer: Max 1000 — larger values are rejected.
  - `sort` 'ASC' | 'DESC'
  - `sort_by` 'estimate_no' | 'reference_no' | 'created_at' | 'estimate_date' | 'expiry_date' | 'accepted_date' | 'sent_date' | 'total'
  - `filter_rules` object[]: Rule-engine filter conditions, ANDed/ORed per filter_rule_operator. `type` must match the type this module's Meta Filter endpoint declares for that `key` (`fieldDataKey`) — sending the wrong `type` is rejected. Some shared keys require `module: "ESTIMATE"` since the query engine branches on it directly.
    - `key` 'estimate_no' | 'reference_no' | 'proposal_title' | 'estimate_date' | 'expiry_date' | 'customer_uid' | 'estimate_status' | 'total' | 'is_converted' | 'created_at' | 'keyword': Get the full current list from this module's Meta Filter endpoint.
    - `operator` 'EQUAL_TO' | 'NOT_EQUAL_TO' | 'CONTAINS' | 'NOT_CONTAINS' | 'GREATER_THAN' | 'LESS_THAN' | 'BETWEEN' | 'IS_EMPTY' | 'IS_NOT_EMPTY'
    - `value` unknown
    - `type` 'default_field' | 'nested_field' | 'custom_field'
    - `module` string
  - `filter_rule_operator` 'AND' | 'OR'
  - `fields_to_select` string: Sparse fieldset selector.
  - `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[]: Estimate documents — same shape as GET /estimate.
  - `total_records` integer
  - `current_page` integer: 0 in cursor-paginated mode.
  - `total_pages` integer: 0 in cursor-paginated mode.
  - `paging` object, nullable: Populated only in cursor-paginated mode.
    - `next` string, nullable
    - `previous` string, nullable
    - `has_more` boolean

## Other responses

- `400`: 400

## Changes

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

[Operation history](https://skmtc.dev/zuper/apis/zuper-pro-api/changes/estimate/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)
