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). |
Request Body
Content-Type: application/json
Example
json
{
"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
bash
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
200
Saved search created
json
{
"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"
}
200
Duplicate search detected
json
{
"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"
}
200
Max searches reached
json
{
"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. |