Real Estate Property Monitoring

Monitor real estate markets in real-time to capture price changes, new listings, and market opportunities before your competition. This guide shows you how to build automated property monitoring systems for investment, sales, and market research.

Prerequisites

  • Supacrawler API key
  • Real estate website URLs to monitor
  • Email or webhook endpoint for notifications

Quick example

Monitor a property listing page for price changes and new inventory:

curl -X POST https://api.supacrawler.com/api/v1/watch \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://realty-site.com/austin-condos",
    "frequency": "hourly",
    "selector": ".property-price, .listing-card",
    "notify_email": "[email protected]",
    "notification_preference": "changes_only"
  }'

Common monitoring scenarios

Price change detection

Monitor specific properties for price reductions or increases:

import requests

# Monitor luxury properties for price changes
luxury_properties = [
    "https://luxury-homes.com/beverly-hills/123-mansion-dr",
    "https://luxury-homes.com/malibu/456-ocean-view",
    "https://luxury-homes.com/hollywood-hills/789-sunset-blvd"
]

for property_url in luxury_properties:
    response = requests.post("https://api.supacrawler.com/api/v1/watch",
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={
            "url": property_url,
            "frequency": "hourly",
            "selector": ".price, .listing-price, .property-price",
            "notify_email": "[email protected]",
            "webhook_url": "https://realestate.com/api/price-alerts",
            "include_image": True
        }
    )
    
    print(f"Monitoring: {property_url}")

New listing alerts

Get notified immediately when new properties are listed:

# Monitor market areas for new inventory
market_areas = [
    {
        "name": "Downtown Austin",
        "url": "https://austin-realty.com/downtown-condos",
        "selector": ".new-listing, .just-listed"
    },
    {
        "name": "Miami Beach",
        "url": "https://miami-luxury.com/beach-properties", 
        "selector": ".property-card[data-status='new']"
    }
]

for area in market_areas:
    requests.post("https://api.supacrawler.com/api/v1/watch",
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={
            "url": area["url"],
            "frequency": "every_30_minutes",  # Fast for new listings
            "selector": area["selector"],
            "notify_email": f"{area['name'].lower().replace(' ', '-')}@realestate.com",
            "notification_preference": "changes_only"
        }
    )

Market trend monitoring

Track overall market statistics and trends:

# Monitor market overview pages
market_stats = [
    {
        "market": "Denver Commercial",
        "url": "https://denver-commercial.com/market-stats",
        "selector": ".market-metrics, .inventory-count, .average-price"
    },
    {
        "market": "Portland Rentals", 
        "url": "https://portland-rentals.com/market-overview",
        "selector": ".rental-rates, .vacancy-rate, .market-trends"
    }
]

for market in market_stats:
    requests.post("https://api.supacrawler.com/api/v1/watch",
        headers={"Authorization": f"Bearer {API_KEY}"},
        json={
            "url": market["url"],
            "frequency": "daily",
            "selector": market["selector"],
            "notify_email": "[email protected]",
            "webhook_url": f"https://realestate.com/api/market-data/{market['market']}"
        }
    )

CSS selectors for real estate sites

  • Name
    Property cards
    Type
    .property-card, .listing-item, .home-card
    Description

    Main property listing containers

  • Name
    Price elements
    Type
    .price, .listing-price, .property-price
    Description

    Property price displays

  • Name
    New listings
    Type
    .new-listing, .just-listed, [data-status='new']
    Description

    Recently added properties

  • Name
    Property details
    Type
    .beds, .baths, .sqft, .lot-size
    Description

    Key property specifications

  • Name
    Status indicators
    Type
    .status, .availability, .listing-status
    Description

    Sale/rental status displays

Best practices

Monitoring frequency

Choose appropriate frequencies based on market speed and property type:

  • Every 15-30 minutes: Hot markets, luxury properties, investment opportunities
  • Hourly: Standard residential monitoring, price change detection
  • Daily: Market statistics, commercial properties, rental markets
  • Weekly: Market trends, comparative analysis, research data

Reliable selectors

  • Use stable CSS classes that identify core property information
  • Avoid selectors dependent on dynamic content or advertising
  • Test selectors across multiple page loads to ensure consistency
  • Have backup selectors ready for when sites update their designs

Alert management

  • Use different email addresses for different property types or markets
  • Set up webhook endpoints for integration with CRM or notification systems
  • Enable screenshots to provide visual confirmation of changes
  • Filter notifications to avoid alert fatigue from minor updates

Integration examples

CRM integration

Set up property monitoring with automatic CRM lead creation:

import requests
import os

# Step 1: Create property monitoring with webhook
def setup_property_monitoring_with_crm():
    """Setup property monitoring that feeds directly into CRM"""
    
    api_key = os.environ['SUPACRAWLER_API_KEY']
    
    # Monitor high-value properties for your CRM
    property_monitors = [
        {
            "url": "https://luxury-homes.com/beverly-hills-estates",
            "market": "Beverly Hills Luxury",
            "webhook_url": "https://your-crm.com/api/supacrawler-webhook"
        },
        {
            "url": "https://investment-properties.com/multi-family-deals", 
            "market": "Investment Properties",
            "webhook_url": "https://your-crm.com/api/supacrawler-webhook"
        }
    ]
    
    for monitor_config in property_monitors:
        # Create Supacrawler watch job
        response = requests.post("https://api.supacrawler.com/api/v1/watch",
            headers={
                "Authorization": f"Bearer {api_key}",
                "Content-Type": "application/json"
            },
            json={
                "url": monitor_config["url"],
                "frequency": "hourly",
                "selector": ".property-card, .new-listing, .price-change",
                "notification_preference": "changes_only",
                
                # CRM integration via webhook
                "webhook_url": monitor_config["webhook_url"],
                "webhook_headers": {
                    "X-Market": monitor_config["market"],
                    "X-Source": "property-monitoring",
                    "Authorization": "Bearer YOUR_CRM_API_KEY"
                },
                
                # Include rich data for CRM
                "include_image": True,
                "include_html": True,
                "full_page": False
            }
        )
        
        result = response.json()
        if result.get('success'):
            print(f"✅ {monitor_config['market']}: {result['watch_id']}")
        else:
            print(f"❌ Failed: {result.get('error')}")

# Step 2: CRM webhook handler
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/api/supacrawler-webhook', methods=['POST'])
def handle_property_alert():
    """Process Supacrawler property alerts into CRM leads"""
    
    data = request.json
    
    # Extract property details from Supacrawler data
    property_info = {
        'source_url': data.get('url'),
        'change_type': data.get('change_type', 'unknown'),
        'screenshot_url': data.get('screenshot_url'),
        'market': data.get('headers', {}).get('X-Market', 'Unknown'),
        'detected_at': data.get('timestamp'),
        'changes': data.get('changes', [])
    }
    
    # Determine lead priority based on change type
    if any('price' in change.lower() for change in property_info['changes']):
        priority = 'high'
        lead_type = 'price_reduction'
    elif any('new' in change.lower() for change in property_info['changes']):
        priority = 'urgent'
        lead_type = 'new_listing'
    else:
        priority = 'normal'
        lead_type = 'market_update'
    
    # Create CRM lead
    crm_lead = {
        'source': 'property_monitoring',
        'lead_type': lead_type,
        'priority': priority,
        'property_url': property_info['source_url'],
        'market': property_info['market'],
        'screenshot_evidence': property_info['screenshot_url'],
        'notes': f"Automated alert: {', '.join(property_info['changes'])}",
        'follow_up_date': property_info['detected_at']
    }
    
    # Send to CRM
    crm_response = create_crm_lead(crm_lead)
    
    return jsonify({
        'status': 'processed',
        'crm_lead_id': crm_response.get('id'),
        'priority': priority
    })

def create_crm_lead(lead_data):
    """Create lead in CRM system"""
    return requests.post('https://your-crm.com/api/leads', 
        headers={'Authorization': 'Bearer YOUR_CRM_API_KEY'},
        json=lead_data
    )

# Step 3: Run the setup
setup_property_monitoring_with_crm()

Next steps

  • Multi-market monitoring: Scale monitoring across different cities and property types
  • Price analysis: Build historical price tracking and trend analysis
  • Competitive intelligence: Monitor competitor listings and market activity
  • Investment analysis: Automate ROI calculations and investment opportunity scoring
  • Client alerts: Create custom client notification systems for specific criteria

Was this page helpful?