AutomationFlowsSlack & Telegram › Auto-send Zillow Real Estate Listings to Telegram Using Scrapegraphai

Auto-send Zillow Real Estate Listings to Telegram Using Scrapegraphai

Byvinci-king-01 @vinci-king-01 on n8n.io

This workflow automatically scrapes real estate listings from Zillow and sends them to a Telegram channel. Scheduled Trigger - Runs the workflow at specified intervals to find new listings. AI-Powered Scraping - Uses ScrapeGraphAI to extract property information from Zillow.…

Cron / scheduled trigger★★★★☆ complexity8 nodesN8N Nodes ScrapegraphaiTelegram
Slack & Telegram Trigger: Cron / scheduled Nodes: 8 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #6310 — we link there as the canonical source.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "cmnzMjCOzadRrYT9",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Real estate",
  "tags": [],
  "nodes": [
    {
      "id": "6a1fbe16-eb98-4106-b88a-9a069ac78a15",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        700,
        820
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "0c1aa147-5e3f-4a59-9f0f-2a115f03ffb7",
      "name": "ScrapegraphAI",
      "type": "n8n-nodes-scrapegraphai.scrapegraphAi",
      "position": [
        1380,
        820
      ],
      "parameters": {
        "userPrompt": "Extract real estate listings from this site. Use the following schema for response { \"address\": \"123 Main St, Columbus, OH 43215\", \"price\": \"$450,000\", \"beds\": \"3\", \"baths\": \"2\", \"sqft\": \"1,850\", \"lot_size\": \"0.25 acres\", \"year_built\": \"1995\", \"property_type\": \"Single Family\", \"listing_url\": \"https://www.zillow.com/homedetails/123-Main-St...\" }",
        "websiteUrl": "https://www.zillow.com/homes/?category=SEMANTIC&searchQueryState=%7B%22filterState%22%3A%7B%22isRecentlySold%22%3A%7B%22value%22%3Afalse%7D%2C%22isPreMarketPreForeclosure%22%3A%7B%22value%22%3Afalse%7D%2C%22isPreMarketForeclosure%22%3A%7B%22value%22%3Afalse%7D%2C%22isForRent%22%3A%7B%22value%22%3Afalse%7D%2C%22isForSaleByAgent%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleByOwner%22%3A%7B%22value%22%3Atrue%7D%2C%22isAuction%22%3A%7B%22value%22%3Atrue%7D%2C%22isComingSoon%22%3A%7B%22value%22%3Atrue%7D%2C%22isForSaleForeclosure%22%3A%7B%22value%22%3Atrue%7D%2C%22isNewConstruction%22%3A%7B%22value%22%3Atrue%7D%2C%22sortSelection%22%3A%7B%22value%22%3A%22globalrelevanceex%22%7D%7D%2C%22regionSelection%22%3A%5B%7B%22regionId%22%3A44%7D%5D%2C%22usersSearchTerm%22%3A%22Ohio%22%7D"
      },
      "credentials": {
        "scrapegraphAIApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b9523259-cabb-41a4-9e55-9a106c4abc28",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "notes": "Hey this is where \nyou \nformat results ",
      "position": [
        2140,
        820
      ],
      "parameters": {
        "jsCode": "// Get the input data\nconst inputData = $input.all()[0].json;\n// Extract listings array from result - FIXED: use real_estate_listings\nconst listings = inputData.result.real_estate_listings || inputData.result.listings || inputData.result.properties || inputData.listings || [];\n\nfunction formatForTelegram(listing) {\n  const {\n    address,\n    price,\n    beds,\n    baths,\n    sqft,\n    lot_size,\n    year_built,\n    year_bult, // Note: there's a typo in your data (year_bult instead of year_built)\n    property_type,\n    listing_url\n  } = listing;\n\n  // Handle null/undefined values\n  const safeAddress = address || 'Address not available';\n  const safePrice = price || 'Price not listed';\n  const safeBeds = beds || 'N/A';\n  const safeBaths = baths || 'N/A';\n  const safeSqft = sqft || 'N/A';\n  const safeLotSize = lot_size && lot_size !== '[null]' ? lot_size : null;\n  // Handle both year_built and year_bult (typo in data)\n  const safeYearBuilt = (year_built || year_bult) && (year_built || year_bult) !== 'N/A' ? (year_built || year_bult) : null;\n  const safePropertyType = property_type || 'Property';\n  const safeUrl = listing_url || '#';\n\n  let message = `\ud83c\udfe0 **NEW ${safePropertyType.toUpperCase()} LISTING**\n\n\ud83d\udccd **Address:** ${safeAddress}\n\ud83d\udcb0 **Price:** ${safePrice}\n\ud83d\udecf\ufe0f **Beds:** ${safeBeds} | \ud83d\udebf **Baths:** ${safeBaths}\n\ud83d\udcd0 **Size:** ${safeSqft} sqft`;\n\n  // Add optional fields if available\n  if (safeLotSize) {\n    message += `\\n\ud83c\udf31 **Lot Size:** ${safeLotSize}`;\n  }\n  \n  if (safeYearBuilt) {\n    message += `\\n\ud83d\uddd3\ufe0f **Year Built:** ${safeYearBuilt}`;\n  }\n\n  message += `\\n\\n\ud83d\udd17 [View Full Details](${safeUrl})\n\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\ud83d\udd50 Listed: ${new Date().toLocaleString()}`;\n\n  return message;\n}\n\n// Debug log\nconsole.log(`Found ${listings.length} listings`);\n\n// Return each listing as separate execution with formatted Telegram text\nreturn listings.map(listing => ({\n  json: {\n    text: formatForTelegram(listing),\n    // Keep original data for reference if needed\n    address: listing.address,\n    price: listing.price,\n    beds: listing.beds,\n    baths: listing.baths,\n    sqft: listing.sqft,\n    lot_size: listing.lot_size,\n    year_built: listing.year_built || listing.year_bult, // Handle typo\n    property_type: listing.property_type,\n    listing_url: listing.listing_url\n  }\n}));"
      },
      "notesInFlow": true,
      "typeVersion": 2
    },
    {
      "id": "19302435-3112-4136-a8a3-95ff5da1c8ef",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1180,
        460
      ],
      "parameters": {
        "color": 5,
        "width": 574.9363634768473,
        "height": 530.4701664623029,
        "content": "# Step 2: ScrapeGraphAI Node \ud83e\udd16\n\nThis is the core node which will scrape the website that you want.\n\n## How to Use\n- Simply mention the website URL\n- Describe what you want to extract in natural language\n\n## Example\n- **Website**: `https://www.example.com`\n- **Instruction**: \"Extract all article titles and URLs from this news site\""
      },
      "typeVersion": 1
    },
    {
      "id": "0e801cc4-a853-4fb1-a0c6-330943996f63",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1920,
        460
      ],
      "parameters": {
        "color": 5,
        "width": 574.9363634768473,
        "height": 530.4701664623029,
        "content": "# Step 3: Format the response \ud83e\uddf1\n\nThis node will format the results for sheets.\n\n## What it does\n- Prepares data for Telegram compatibility\n- Each listing is formatted in beautiful message\n- Maintains all important metadata\n- Easy to filter and analyze data"
      },
      "typeVersion": 1
    },
    {
      "id": "76a1aff0-92cc-4bb0-84ec-525ed7a0cdf2",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        460,
        460
      ],
      "parameters": {
        "color": 5,
        "width": 574.9363634768473,
        "height": 530.4701664623029,
        "content": "# Step 1: Trigger \u23f1\ufe0f\n\nThis trigger will invoke the workflow on the mentioned time.\n\n## Configuration Options\n- You can mention your custom time for trigger\n- Or even choose a different trigger"
      },
      "typeVersion": 1
    },
    {
      "id": "151eaaf9-a11f-42dc-8f08-3d4e6c7a5a03",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2680,
        460
      ],
      "parameters": {
        "color": 5,
        "width": 574.9363634768473,
        "height": 530.4701664623029,
        "content": "# Step 4:Telegram Node \ud83d\udce7\nThis node will send the listings to your given channel or chat\n\n## What it does\n- Connects to your Telegram account\n- Sends the message using the created bot \n\n\n## Configuration\n- Create a bot using @botfather in Telegram\n- Add the given api key in config\n- Add your chat/channel username in config\n"
      },
      "typeVersion": 1
    },
    {
      "id": "37d06314-47d4-4705-a52e-501caff0817f",
      "name": "Telegram",
      "type": "n8n-nodes-base.telegram",
      "maxTries": 5,
      "position": [
        2920,
        820
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "chatId": "@housingprices",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "executeOnce": false,
      "retryOnFail": true,
      "typeVersion": 1.2,
      "alwaysOutputData": false,
      "waitBetweenTries": 5000
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "6a32d4c5-dad4-442c-a6d6-19743b661a8c",
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram": {
      "main": [
        []
      ]
    },
    "ScrapegraphAI": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "ScrapegraphAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow automatically scrapes real estate listings from Zillow and sends them to a Telegram channel. Scheduled Trigger - Runs the workflow at specified intervals to find new listings. AI-Powered Scraping - Uses ScrapeGraphAI to extract property information from Zillow.…

Source: https://n8n.io/workflows/6310/ — original creator credit. Request a take-down →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

This workflow automatically analyzes real estate market sentiment by scraping investment forums and news sources, then provides AI-powered market predictions and investment recommendations. Scheduled

N8N Nodes Scrapegraphai, Telegram
Slack & Telegram

IT operations and infrastructure teams IoT system administrators and engineers Facility and building management teams Manufacturing and industrial operations managers Smart city and public infrastruct

N8N Nodes Scrapegraphai, Telegram
Slack & Telegram

This workflow automates the process of monitoring Amazon product prices and sending alerts when a product’s price drops below a defined threshold.

N8N Nodes Scrapegraphai, Google Sheets, Telegram
Slack & Telegram

Intellectual property lawyers and legal teams Brand protection specialists Content creators and publishers Marketing and brand managers Digital rights management teams Copyright enforcement agencies M

N8N Nodes Scrapegraphai, Telegram
Slack & Telegram

Solo founders and spreadsheet gremlins who track everything in Notion and want crisp Telegram pings without opening a single page.

Telegram, Notion