Create Saved Search
Save a property search for a contact with filters, frequency, and notifications
Creates a saved property search for a contact. The search stores filter criteria (city, property type, price range, bedrooms, bathrooms, size), a notification frequency, and an optional notification email. On creation, it can run a baseline snapshot to capture the current matching listings — subsequent runs detect new listings against this baseline. The contact is automatically tagged with RESO_SAVED_SEARCH and an engagement signal is logged.
Requires a valid api_key in the JSON request body
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
api_key |
body | string |
Yes | Your Zyntro API key |
org_id |
body | string |
Yes | Your organization UUID |
brand_id |
body | integer |
No | Your brand ID. Default: 1 |
member_id |
body | string |
No | The member UUID. Used to record who created the search. |
contact_id |
body | string |
Yes | The UUID of the contact to create the saved search for. Must exist in the organization. |
search_name |
body | string |
Yes | A human-readable name for the search (e.g., "Barrie Detached 3+ BR") |
filters |
body | object |
Yes | Search criteria object. Must contain at least one valid filter. See Filter Fields below. |
frequency |
body | string |
No | How often the search should run. One of: daily, every_3_days, weekly, every_2_weeks, monthly. Default: weekly |
notification_email |
body | string |
No | Email address for notifications. Defaults to the contact's primary email if omitted. |
created_by |
body | string |
No | Who created the search: member or contact. Default: member |
skip_baseline |
body | boolean |
No | Set to true to skip the baseline snapshot on creation. Default: false (baseline runs immediately). |
Filter Fields (filters object)
| Field | Type | Required | Description |
|---|---|---|---|
city |
string | Single city name (e.g., "Barrie") | |
cities |
array | Array of city names for multi-city searches (e.g., ["Barrie", "Innisfil"]) |
|
postal_code |
string | Postal code or prefix (e.g., "L4N") | |
property_type |
string | Property type (e.g., "Residential", "Commercial") | |
property_sub_type |
string | Single sub-type (e.g., "Detached", "Condo") | |
property_sub_types |
array | Array of sub-types (e.g., ["Detached", "Semi-Detached"]) |
|
transaction_type |
string | Transaction type: for_sale or for_rent |
|
min_price |
number | Minimum price | |
max_price |
number | Maximum price | |
min_beds |
number | Minimum bedrooms | |
max_beds |
number | Maximum bedrooms | |
min_baths |
number | Minimum bathrooms | |
max_baths |
number | Maximum bathrooms | |
min_size |
number | Minimum size (sq ft) | |
max_size |
number | Maximum size (sq ft) |
Request Body
Content-Type: application/json
Example
{
"org_id": "YOUR_ORG_ID",
"api_key": "YOUR_API_KEY",
"filters": {
"city": "Barrie",
"min_beds": 3,
"max_price": 1000000,
"min_baths": 2,
"min_price": 500000,
"property_type": "Residential",
"transaction_type": "for_sale",
"property_sub_type": "Detached"
},
"brand_id": 1,
"frequency": "weekly",
"member_id": "YOUR_MEMBER_ID",
"contact_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"created_by": "member",
"search_name": "Barrie Detached 3+ BR under $1M",
"skip_baseline": false,
"notification_email": "[email protected]"
}
Code Samples
curl -X POST https://app.zyntrohq.com/public/real_estate/createSavedSearch \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"org_id": "YOUR_ORG_ID",
"contact_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"search_name": "Barrie Detached 3+ BR under $1M",
"filters": {
"city": "Barrie",
"property_type": "Residential",
"property_sub_type": "Detached",
"min_price": 500000,
"max_price": 1000000,
"min_beds": 3
},
"frequency": "weekly"
}'
Response
{
"data": {
"name": "Barrie Detached 3+ BR under $1M",
"uuid": "e7f8a9b0-c1d2-3456-e7f8-a9b0c1d23456",
"filters": {
"city": "Barrie",
"min_beds": 3,
"max_price": 1000000,
"min_price": 500000,
"property_type": "Residential",
"property_sub_type": "Detached"
},
"frequency": "weekly",
"contact_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"next_run_at": "2026-04-10 14:30:00",
"baseline_results": 42,
"saved_search_url": "https://app.zyntrohq.com/public/real_estate/saved_searches/32/org-uuid?contact_id=a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"notification_email": "[email protected]"
},
"status": "success",
"message": "Saved search created"
}
{
"status": "error",
"message": "Duplicate search \u2014 contact already has a saved search with identical filters",
"existing_name": "Barrie Detached 3+ BR",
"existing_uuid": "d4e5f6a7-b8c9-0123-defg-456789012345"
}
{
"status": "error",
"message": "Contact has reached the maximum of 10 saved searches"
}
Info: On creation, the contact is automatically tagged with RESO_SAVED_SEARCH and an engagement signal (reso_saved_search_created) is logged to the signals tracker. SI uses this signal to understand the contact's property search intent.
Tip: Unless you have a reason to skip it, leave skip_baseline as false (the default). The baseline snapshot captures the current matching listings so that subsequent scheduled runs can detect new listings — which is the primary value of saved searches for contacts.
Errors
| Code | Message | Resolution |
|---|---|---|
MISSING_FIELDS |
api_key / org_id / contact_id / search_name / filters is required One or more required fields are missing. |
Include all required fields. |
INVALID_API_KEY |
Invalid API key No active user matches the key. |
Verify your key. |
INACTIVE_USER |
User account is not active The account is deactivated. |
Contact your admin. |
CONTACT_NOT_FOUND |
Contact not found No contact with that ID exists in the organization. |
Verify contact_id and org_id. |
EMPTY_FILTERS |
At least one valid filter is required The filters object is empty or all values are null/empty. |
Include at least one filter criterion. |
DUPLICATE |
Duplicate search — contact already has a saved search with identical filters A non-deleted saved search with the exact same filters already exists for this contact. |
Use the existing search (UUID returned in the error) or modify the filters. |
MAX_REACHED |
Contact has reached the maximum of 10 saved searches Each contact can have at most 10 active saved searches. |
Delete an existing search before creating a new one. |
INSERT_FAILED |
Failed to save search: ... Database insert failed. |
Check the error details and retry. |