Navigation

Create Saved Search

Save a property search for a contact with filters, frequency, and notifications

POST /public/real_estate/createSavedSearch

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.

Was this article helpful?

NotebookLM Overviews