AutomationFlowsData & Sheets › Zillow Property Scraper by Location via Bright Data & Google Sheets

Zillow Property Scraper by Location via Bright Data & Google Sheets

ByIncrementors @incrementors on n8n.io

This template requires a self-hosted n8n instance to run.

Event trigger★★★★☆ complexity16 nodesForm TriggerHTTP RequestGoogle Sheets
Data & Sheets Trigger: Event Nodes: 16 Complexity: ★★★★☆ Added:

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

This workflow follows the Form Trigger → Google Sheets recipe pattern — see all workflows that pair these two integrations.

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": "0eFmaRUQnmJfkcaI",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Zillow Property Listing Scraper by Location & Category Using Bright Data API & Google Sheets Integration",
  "tags": [],
  "nodes": [
    {
      "id": "3ac2c390-45ef-4c40-99ba-7c41e387f88c",
      "name": "\ud83d\udcdd Form Trigger - Start Property Search",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -2040,
        620
      ],
      "parameters": {
        "options": {},
        "formTitle": "Zillow Property Search",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Location",
              "requiredField": true
            },
            {
              "fieldType": "dropdown",
              "fieldLabel": "Listing Category",
              "fieldOptions": {
                "values": [
                  {
                    "option": "House for rent"
                  },
                  {
                    "option": "House for sale"
                  }
                ]
              }
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "e8976089-8572-45f0-b895-3517bf157801",
      "name": "\ud83d\udce4 Trigger Bright Data Scraping Job",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1800,
        620
      ],
      "parameters": {
        "url": "https://api.brightdata.com/datasets/v3/trigger",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"input\": [\n    {\n      \"location\": \"{{ $json.Location }}\",\n      \"listingCategory\": \"{{ $json['Listing Category'] }}\",\n      \"HomeType\": \"\",\n      \"days_on_zillow\": \"\"\n    }\n  ]\n}",
        "sendBody": true,
        "sendQuery": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "queryParameters": {
          "parameters": [
            {
              "name": "dataset_id",
              "value": "gd_lfqkr8wm13ixtbd8f5"
            },
            {
              "name": "include_errors",
              "value": "true"
            },
            {
              "name": "type",
              "value": "discover_new"
            },
            {
              "name": "discover_by",
              "value": "input_filters"
            },
            {
              "name": "limit_per_input",
              "value": "2"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "1a3a3572-b249-4ca0-9b18-0fc2341aea93",
      "name": "Form Submission Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2080,
        545
      ],
      "parameters": {
        "color": 7,
        "width": 180,
        "height": 240,
        "content": "Starts workflow when user submits location & category via form"
      },
      "typeVersion": 1
    },
    {
      "id": "902fe79f-8373-4a17-9e6a-a8449bcd48f5",
      "name": "API Trigger Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1850,
        545
      ],
      "parameters": {
        "color": 2,
        "width": 200,
        "height": 240,
        "content": "Sends search request to Bright Data API to trigger Zillow data scraping"
      },
      "typeVersion": 1
    },
    {
      "id": "eea4519d-eaca-4bba-b31b-67c12bdd943b",
      "name": "Status Check Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1610,
        545
      ],
      "parameters": {
        "color": 6,
        "width": 200,
        "height": 240,
        "content": "Monitors scraping job status and waits for completion"
      },
      "typeVersion": 1
    },
    {
      "id": "0992cf05-aa2c-449f-af0f-c4cbd4cb340d",
      "name": "\u23f3 Check Scraping Job Status",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1560,
        620
      ],
      "parameters": {
        "url": "=https://api.brightdata.com/datasets/v3/progress/{{ $json.snapshot_id }}",
        "options": {},
        "sendQuery": true,
        "sendHeaders": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "format",
              "value": "json"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "ce4357aa-e6de-4082-8cef-7cb3aa9727a2",
      "name": "Wait Timer Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1140,
        660
      ],
      "parameters": {
        "color": 6,
        "width": 220,
        "height": 220,
        "content": "Waits 1 minute before rechecking scraping job status"
      },
      "typeVersion": 1
    },
    {
      "id": "5be9e5cb-57d3-47db-ba39-543799a1ecad",
      "name": "\u23f1\ufe0f Wait Before Retry",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1100,
        720
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "60878135-aa34-4b71-98ca-ac9dccc6b7e9",
      "name": "Data Validation Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1140,
        420
      ],
      "parameters": {
        "color": 5,
        "width": 220,
        "height": 220,
        "content": "Validates if property data was found in scraping results"
      },
      "typeVersion": 1
    },
    {
      "id": "4b6df4c2-c72a-4a29-8077-17332184a038",
      "name": "Data Retrieval Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -880,
        400
      ],
      "parameters": {
        "color": 4,
        "width": 220,
        "height": 220,
        "content": "Retrieves the actual property data using snapshot ID"
      },
      "typeVersion": 1
    },
    {
      "id": "fc1fcdd3-f3cf-43aa-ac63-bfc5270b3663",
      "name": "\ud83d\udce5 Fetch Property Listing Data",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -820,
        460
      ],
      "parameters": {
        "url": "=https://api.brightdata.com/datasets/v3/snapshot/{{ $json.snapshot_id }}",
        "options": {},
        "sendQuery": true,
        "sendHeaders": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "format",
              "value": "json"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "b980cf99-85cc-4dd9-9c41-405f20e45827",
      "name": "Google Sheets Save Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -640,
        400
      ],
      "parameters": {
        "color": 3,
        "height": 220,
        "content": "Saves the scraped property data to your Google Sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "a9daf529-3b67-4f07-8d55-95af66861baf",
      "name": "\ud83d\udcc4 Save Property Data to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -600,
        460
      ],
      "parameters": {
        "columns": {
          "value": {
            "URL": "={{ $json.hdpUrl }}",
            "City": "={{ $json.city }}",
            "Country": "={{ $json.country }}",
            "Home Type": "={{ $json.homeType }}",
            "Zestimate": "={{ $json.zestimate }}",
            "Year Built": "={{ $json.yearBuilt }}",
            "Agent Phone": "={{ $json.listing_provided_by.phone_number }}",
            "Home Status": "={{ $json.homeStatus }}",
            "School Rating": "={{ $json.schools[0].rating }}",
            "Street Address": "={{ $json.address }}",
            "Interior Details": "={{ $json.interior_full[0].values }}"
          },
          "schema": [
            {
              "id": "URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "City",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "City",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Agent Phone",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Agent Phone",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Home Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Home Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Street Address",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Street Address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Zestimate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Zestimate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "School Rating",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "School Rating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Year Built",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Year Built",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Home Type",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Home Type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Country",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Country",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Interior Details",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Interior Details",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "Zillow",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=0",
          "cachedResultName": "Zillow"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit",
          "cachedResultName": "Property Data Sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "74062322-6e62-40d6-8876-dada77a319fc",
      "name": "\u2705 Check If Scraping Complete",
      "type": "n8n-nodes-base.if",
      "position": [
        -1320,
        540
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "35ed620d-b5d5-4e97-bcc5-52b283d85616",
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "ready"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "25326b0a-7fb3-4ee5-9d6a-56c2d1d4cf41",
      "name": "\ud83d\udcca Validate Property Data Exists",
      "type": "n8n-nodes-base.if",
      "position": [
        -1080,
        480
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "f01bd215-c406-493c-a6e4-2b8ec5686b44",
              "operator": {
                "type": "number",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.records }}",
              "rightValue": "={{ 0 }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "3a7c4645-e5e9-4feb-8635-0953b6ae6a6a",
      "name": "Google Sheet Template Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2080,
        300
      ],
      "parameters": {
        "color": 7,
        "width": 280,
        "content": "Sample Google Sheet Template:\nhttps://docs.google.com/spreadsheets/d/SAMPLE_SHEET_ID/edit\n\nMake a copy and update the workflow with your Sheet ID"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "1be06750-3f46-4f87-ab33-829b4e8f3079",
  "connections": {
    "\u23f1\ufe0f Wait Before Retry": {
      "main": [
        [
          {
            "node": "\u23f3 Check Scraping Job Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f3 Check Scraping Job Status": {
      "main": [
        [
          {
            "node": "\u2705 Check If Scraping Complete",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2705 Check If Scraping Complete": {
      "main": [
        [
          {
            "node": "\ud83d\udcca Validate Property Data Exists",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\u23f1\ufe0f Wait Before Retry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce5 Fetch Property Listing Data": {
      "main": [
        [
          {
            "node": "\ud83d\udcc4 Save Property Data to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcca Validate Property Data Exists": {
      "main": [
        [
          {
            "node": "\ud83d\udce5 Fetch Property Listing Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce4 Trigger Bright Data Scraping Job": {
      "main": [
        [
          {
            "node": "\u23f3 Check Scraping Job Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcdd Form Trigger - Start Property Search": {
      "main": [
        [
          {
            "node": "\ud83d\udce4 Trigger Bright Data Scraping Job",
            "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 template requires a self-hosted n8n instance to run.

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

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

Overview 🌐

Form Trigger, HTTP Request, Google Sheets
Data & Sheets

Splitout Code. Uses splitOut, httpRequest, googleSheets, stickyNote. Event-driven trigger; 36 nodes.

HTTP Request, Google Sheets, Form Trigger +1
Data & Sheets

This n8n workflow is designed for Customer Success Managers (CSM), marketers, sales teams, and data administrators who need to automate the process of uploading and processing CSV data in HubSpot. It

HTTP Request, Google Sheets, Form Trigger +1
Data & Sheets

The SEO On Page API is a powerful tool for keyword research, competitor analysis, backlink insights, and overall SEO optimization. With multiple endpoints, you can instantly gather actionable SEO data

Form Trigger, HTTP Request, Google Sheets
Data & Sheets

Demonstration video

Form Trigger, HTTP Request, Google Sheets