---
title: "List search profiles, including Commercial criteria and recipients"
method: GET
path: "/saved_queries"
tags: ["saved_queries"]
---

# List search profiles, including Commercial criteria and recipients

`GET /saved_queries`

## Request

- Base URL: `https://api.propstack.de/v2`
- URL: `https://api.propstack.de/v2/saved_queries`
- Auth: API key in header `X-Api-Key`

Search profiles support Commercial and Residential criteria. All operations are scoped to the API key's shop.

## Endpoints and permissions

| Operation | Permission |
| --- | --- |
| `GET /v2/saved_queries` | `v2_saved_queries#index` |
| `GET /v2/saved_queries/options` | `v2_saved_queries#index` |
| `GET /v2/saved_queries/:id` | `v2_saved_queries#show` |
| `POST /v2/saved_queries` | `v2_saved_queries#create` |
| `PUT /v2/saved_queries/:id` | `v2_saved_queries#update` |
| `DELETE /v2/saved_queries/:id` | `v2_saved_queries#destroy` |

Send `X-Api-Key` and JSON request bodies. List responses contain `data`; pass `with_total=true` for `total`, and `page`/`per` for pagination. Lists can filter by `client_id`, `broker_id`, `team_id` and `active`. Individual reads and writes return the profile directly. Delete returns HTTP 204.

## Create a Commercial search profile

```json
{
  "client_id": 123,
  "marketing_type": "RENT",
  "rs_type_categories": [["OFFICE", "OFFICE"]],
  "net_floor_space": 100,
  "net_floor_space_to": 500,
  "industrial_area": 70,
  "recipient_id": 456,
  "to_client_ids": [456],
  "cc_client_ids": [789],
  "broker_id": 12
}
```

Replace example IDs with records in your shop. `client_id` identifies the profile owner. It is required unless `is_master_template` is true. A profile needs at least one criterion; Commercial area criteria count. `recipient_id`, `to_client_ids` and `cc_client_ids` configure recipients. Recipient arrays are returned as empty arrays after clearing. The domain removes archived recipients and deactivates profiles whose owner is archived.

Set either `broker_id` or `team_id` as the supervisor, never both. To change from a broker to a team, send both `broker_id: null` and the new `team_id`. Client, property, recipient and supervisor references must belong to the same shop; invalid assignments return HTTP 422. Access to another shop's profile returns HTTP 404. Missing API permissions return HTTP 403.

New property assignments must reference a non-deleted property. A profile with an existing link to a subsequently deleted property remains editable.

## Criteria, clearing and options

`GET /v2/saved_queries/options?locale=de` returns the same grouped form metadata as GraphQL `shop.queryFormSchema`: field key, label, field type, conditions and selectable values. Types ending in `_from_to` have a lower-bound field and an upper-bound field with `_to` appended, such as `net_floor_space` and `net_floor_space_to`. Existing numeric, selection, geometry and category normalization rules apply. `rs_type_categories` uses nested type/category arrays; `polygon` uses the existing array of coordinate pairs.

`PUT` changes only supplied fields. Explicit `null` clears nullable values; `[]` clears recipient or multi-select arrays. Clearing all criteria is rejected. The API also exposes notes, custom fields, `perfect_match_settings` and `expires_at`. Use `partial_custom_fields` to merge individual custom-field values instead of replacing the complete `custom_fields` object.

Both custom-field payloads must be objects or `null`. Keys must reference the current shop's property custom fields enabled for search profiles and supported by the search-profile form. Numeric fields additionally accept `<field_name>_to` for the upper bound. Unknown, foreign, disabled or unsupported keys return HTTP 400 before any changes are saved; GraphQL reports the same validation as an execution error.

`custom_fields: null` or `custom_fields: {}` clears custom-field values. `partial_custom_fields: null` or `partial_custom_fields: {}` leaves them unchanged; use `{ "<field_name>": null }` to clear one allowed field. Only submitted keys are validated, so unrelated updates and valid partial updates remain possible when stored data still contains a previously removed field.

The existing `/api/v1/saved_queries` contract remains available. GraphQL uses the equivalent camelCase fields on `SavedQueryAttributes` with `createSavedQuery`, `updateSavedQuery`, `destroySavedQuery`, and `savedQuery(id:)`.

## Query parameters

- `page` integer
- `per` integer
- `with_total` boolean
- `client_id` integer
- `broker_id` integer
- `team_id` integer
- `active` boolean

## Response `200`

List search profiles, including Commercial criteria and recipients

- SavedQueryEntity: SavedQueryEntity model
  - `id` integer
  - `living_space` number, float
  - `living_space_to` number, float
  - `number_of_rooms` number, float
  - `number_of_rooms_to` number, float
  - `number_of_bed_rooms` integer
  - `number_of_bed_rooms_to` integer
  - `number_of_bath_rooms` integer
  - `number_of_bath_rooms_to` integer
  - `price` number, float
  - `price_to` number, float
  - `base_rent` number, float
  - `base_rent_to` number, float
  - `floor` integer
  - `floor_to` integer
  - `plot_area` number, float
  - `plot_area_to` number, float
  - `construction_year` integer
  - `construction_year_to` integer
  - `condition` string[]
  - `energy_efficiency_class` string[]
  - `lift` string
  - `balcony` string
  - `balcony_space` number, float
  - `balcony_space_to` number, float
  - `garden` string
  - `swimming_pool` string
  - `built_in_kitchen` string
  - `cellar` string
  - `rented` string
  - `parking_space` string
  - `barrier_free` string
  - `monument` string
  - `net_floor_space` number, float
  - `net_floor_space_to` number, float
  - `min_divisible` number, float
  - `total_floor_space` number, float
  - `total_floor_space_to` number, float
  - `industrial_area` number, float
  - `industrial_area_to` number, float
  - `price_per_sqm` number, float
  - `price_per_sqm_to` number, float
  - `price_multiplier` integer
  - `price_multiplier_to` integer
  - `yield_actual` number, float
  - `yield_actual_to` number, float
  - `investment_category` string[]
  - `purchase_form` string[]
  - `tenant_structure` string
  - `walt` string
  - `single_rooms_quota` number, float
  - `single_rooms_quota_to` number, float
  - `occupancy_rate` number, float
  - `occupancy_rate_to` number, float
  - `conservation_areas` string
  - `number_of_parking_spaces` integer
  - `number_of_parking_spaces_to` integer
  - `number_of_apartments` integer
  - `number_of_apartments_to` integer
  - `number_of_commercials` integer
  - `number_of_commercials_to` integer
  - `number_of_units` integer
  - `number_of_units_to` integer
  - `gfz` number, float
  - `gfz_to` number, float
  - `grz` number, float
  - `grz_to` number, float
  - `building_permission` string
  - `demolition` string
  - `bgf` number, float
  - `bgf_to` number, float
  - `recommended_use_types` string[]
  - `utilization_trade_site` string[]
  - `short_term_constructible` string
  - `site_development_type` string[]
  - `preliminary_enquiry` string
  - `client_id` integer
  - `property_id` integer
  - `broker_id` integer
  - `team_id` integer
  - `recipient_id` integer
  - `to_client_ids` integer[]
  - `cc_client_ids` integer[]
  - `marketing_type` string
  - `active` boolean
  - `guarded` boolean
  - `is_master_template` boolean
  - `location_ids` integer[]
  - `cities` string[]
  - `regions` string[]
  - `countries` string[]
  - `group_ids` integer[]
  - `rs_type_categories` object
  - `lat` number, float
  - `lng` number, float
  - `radius` integer
  - `polygon` object
  - `note` string
  - `public_note` string
  - `custom_fields` object
  - `perfect_match_settings` object
  - `expires_at` unknown
  - `rs_types` string[]
  - `rs_categories` string[]
  - `created_at` string
  - `updated_at` string

## Other responses

- `400`: validation_error
- `401`: authentication_error
- `403`: authorization_error
- `404`: not_found_error
- `422`: validation_error
- `429`: rate_limit_exceeded
- `500`: internal_server_error

## Changes

- **2026-11-04** `b68ea1933caa`: 1 info
  - added the non-success response with the status `429`
- **2026-10-09** `66a565c0ca01`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/propstack/apis/propstack-api-v2-beta/changes/saved_queries/get.md)

---

[API](https://skmtc.dev/propstack/apis/propstack-api-v2-beta.md) - [All operations](https://skmtc.dev/propstack/apis/propstack-api-v2-beta/llms.txt) - [OpenAPI document](https://skmtc.dev/propstack/apis/propstack-api-v2-beta/revisions/b68ea1933caa?raw)
