This workflow corresponds to n8n.io template #6886 — we link there as the canonical source.
This workflow follows the Google Sheets → HTTP Request 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 →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "0725f253-78fb-4511-9809-13ec4afe8778",
"name": "Name",
"type": "n8n-nodes-base.code",
"position": [
1120,
460
],
"parameters": {
"jsCode": "const html = $input.first().json.html\n\n// Regex to extract the name\nconst nameRegex = /<h1 class=\"oh1\">(.*?)<\\/h1>/;\n\n// Extract the name\nconst nameMatch = html.match(nameRegex);\nconst name = nameMatch ? nameMatch[1].trim() : \"Not Found\";\n\n// Return structured JSON output\nreturn [{ name }];\n"
},
"typeVersion": 2
},
{
"id": "94ca2e67-5661-4789-8340-8a5ccedc205b",
"name": "Age",
"type": "n8n-nodes-base.code",
"position": [
1280,
460
],
"parameters": {
"jsCode": "const html = $('Set html to scrape data').first().json.html\n\n// Regex to extract age and date of birth\nconst ageDobRegex = /<span>\\s*Age\\s*(\\d+),\\s*Born\\s*([A-Za-z]+\\s*\\d{4})\\s*<\\/span>/;\n\n// Extract match\nconst match = html.match(ageDobRegex);\n\n// Combine into a single variable\nconst ageWithDob = match ? `Age ${match[1]}, Born ${match[2]}` : \"Not Found\";\n\n// Return structured JSON output\nreturn [{ ageWithDob }];"
},
"typeVersion": 2
},
{
"id": "8221440b-afe3-4af3-b39f-5eb55f553ba4",
"name": "Primary Phone",
"type": "n8n-nodes-base.code",
"position": [
1440,
460
],
"parameters": {
"jsCode": "const html = $('Set html to scrape data').first().json.html\n\n// Regex to extract the primary phone\nconst phoneRegex = /<span itemprop=\"telephone\">\\s*([\\d\\(\\)\\-\\s]+)\\s*<\\/span>/;\n\n// Extract the phone number\nconst phoneMatch = html.match(phoneRegex);\nconst primaryPhone = phoneMatch ? phoneMatch[1].trim() : \"Not Found\";\n\n// Return structured JSON output\nreturn [{ primaryPhone }];"
},
"typeVersion": 2
},
{
"id": "5f91d1f7-164e-467c-a2c0-830a00080106",
"name": "Other numbers",
"type": "n8n-nodes-base.code",
"position": [
1120,
600
],
"parameters": {
"jsCode": "const html = $('Set html to scrape data').first().json.html;\n\n// Regex to extract phone numbers and labels\nconst phoneRegex = /<span itemprop=\"telephone\">\\s*([\\d\\(\\)\\-\\s]+)\\s*<\\/span>.*?<span class=\"smaller\">(.*?)<\\/span>/g;\n\n// Extract phone numbers and labels\nconst phoneMatches = [...html.matchAll(phoneRegex)];\nconst phoneDetailsString = phoneMatches\n .map(match => `${match[1].trim()} - ${match[2].trim()}`)\n .join(\"; \");\n\n// Check if no phone numbers are found and return \"Not Found\" if necessary\nconst result = phoneDetailsString.length > 0 ? phoneDetailsString : \"Not Found\";\n\n// Return the result as a single string\nreturn [{ result }];"
},
"typeVersion": 2
},
{
"id": "c5ce02d1-e98c-4900-8a12-f8bdc53d9f27",
"name": "Emails",
"type": "n8n-nodes-base.code",
"position": [
1280,
600
],
"parameters": {
"jsCode": "const html = $('Set html to scrape data').first().json.html;\n\n// Regex to extract all email addresses\nconst emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g;\n\n// Extract all emails, filter out \"user@example.com\", remove duplicates, and join with commas\nconst emailMatches = html.match(emailRegex) || [];\nconst uniqueEmails = [...new Set(emailMatches.map(email => email.trim()))] // Remove duplicates\n .filter(email => email !== \"user@example.com\" && email !== \"user@example.com\"); // Filter out support email\nconst emails = uniqueEmails.join(\", \");\n\n// Return structured JSON output\nreturn [{ emails }];"
},
"typeVersion": 2
},
{
"id": "0c0b57af-e221-4519-a87f-539848ec03e1",
"name": "Current Address",
"type": "n8n-nodes-base.code",
"position": [
1440,
600
],
"parameters": {
"jsCode": "const html = $('Set html to scrape data').first().json.html // Get the full page HTML\n\n// Extract the entire <a> tag that contains the address\nconst addressRegex = /<a[^>]+data-link-to-more=\"address\"[^>]*>(.*?)<\\/a>/s;\nconst addressMatch = html.match(addressRegex);\n\nif (addressMatch) {\n // Remove all HTML tags to extract just the address text\n const addressText = addressMatch[1].replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return [{ currentAddress: addressText }];\n} else {\n return [{ currentAddress: \"Not Found\" }];\n}"
},
"typeVersion": 2
},
{
"id": "f892c3e5-45c7-4ee7-b492-21828cb7826d",
"name": "RelativeProfile",
"type": "n8n-nodes-base.code",
"position": [
1220,
780
],
"parameters": {
"jsCode": "const html = $('Set html to scrape data').first().json.html;\n\n// Regex to extract the relative profile URL\nconst relativeProfileRegex = /<a href=\"(\\/find\\/person\\/[^\\\"]+)\"/;\n\n// Extract the relative profile URL\nconst relativeProfileMatch = html.match(relativeProfileRegex);\nconst relativeProfileUrl = relativeProfileMatch ? `https://www.truepeoplesearch.com${relativeProfileMatch[1]}` : \"Not Found\";\n\n// Return structured JSON output\nreturn [{ relativeProfileUrl }];"
},
"typeVersion": 2
},
{
"id": "9e41d8cb-0665-41cb-8eab-48e949e072bd",
"name": "RelativeName",
"type": "n8n-nodes-base.code",
"position": [
2500,
140
],
"parameters": {
"jsCode": "const html = $input.first().json.html\n\n// Regex to extract the name\nconst nameRegex = /<h1 class=\"oh1\">(.*?)<\\/h1>/;\n\n// Extract the name\nconst nameMatch = html.match(nameRegex);\nconst name = nameMatch ? nameMatch[1].trim() : \"Not Found\";\n\n// Return structured JSON output\nreturn [{ name }];\n"
},
"typeVersion": 2
},
{
"id": "19371d0a-6257-4109-a6b4-925d98308418",
"name": "RelativeAge",
"type": "n8n-nodes-base.code",
"position": [
2660,
140
],
"parameters": {
"jsCode": "const html = $('Set relativeprofile page html to scrape data').first().json.html;\n\n// Regex to extract age and date of birth\nconst ageDobRegex = /<span>\\s*Age\\s*(\\d+),\\s*Born\\s*([A-Za-z]+\\s*\\d{4})\\s*<\\/span>/;\n\n// Extract match\nconst match = html.match(ageDobRegex);\n\n// Combine into a single variable\nconst ageWithDob = match ? `Age ${match[1]}, Born ${match[2]}` : \"Not Found\";\n\n// Return structured JSON output\nreturn [{ ageWithDob }];"
},
"typeVersion": 2
},
{
"id": "18a3ac6a-9799-4cc4-a0cf-72c1093613b1",
"name": "RelativePrimaryPhone",
"type": "n8n-nodes-base.code",
"position": [
2500,
320
],
"parameters": {
"jsCode": "const html = $('Set relativeprofile page html to scrape data').first().json.html\n\n// Regex to extract the primary phone\nconst phoneRegex = /<span itemprop=\"telephone\">\\s*([\\d\\(\\)\\-\\s]+)\\s*<\\/span>/;\n\n// Extract the phone number\nconst phoneMatch = html.match(phoneRegex);\nconst primaryPhone = phoneMatch ? phoneMatch[1].trim() : \"Not Found\";\n\n// Return structured JSON output\nreturn [{ primaryPhone }];"
},
"typeVersion": 2
},
{
"id": "ac5dd68c-cbf2-4ff6-a3c7-714d1ce8d42f",
"name": "Relative Other numbers",
"type": "n8n-nodes-base.code",
"position": [
2680,
320
],
"parameters": {
"jsCode": "const html = $('Set relativeprofile page html to scrape data').first().json.html;\n\n// Regex to extract phone numbers and labels\nconst phoneRegex = /<span itemprop=\"telephone\">\\s*([\\d\\(\\)\\-\\s]+)\\s*<\\/span>.*?<span class=\"smaller\">(.*?)<\\/span>/g;\n\n// Extract phone numbers and labels\nconst phoneMatches = [...html.matchAll(phoneRegex)];\nconst phoneDetailsString = phoneMatches\n .map(match => `${match[1].trim()} - ${match[2].trim()}`)\n .join(\"; \");\n\n// Check if no phone numbers are found and return \"Not Found\" if necessary\nconst result = phoneDetailsString.length > 0 ? phoneDetailsString : \"Not Found\";\n\n// Return the result as a single string\nreturn [{ result }];"
},
"typeVersion": 2
},
{
"id": "7c5a68fd-dc83-4103-964f-405e8719c6fb",
"name": "RelativeEmails",
"type": "n8n-nodes-base.code",
"position": [
2500,
480
],
"parameters": {
"jsCode": "const html = $('Set relativeprofile page html to scrape data').first().json.html;\n\n// Regex to extract all email addresses\nconst emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}/g;\n\n// Extract all emails, filter out \"user@example.com\", remove duplicates, and join with commas\nconst emailMatches = html.match(emailRegex) || [];\nconst uniqueEmails = [...new Set(emailMatches.map(email => email.trim()))] // Remove duplicates\n .filter(email => email !== \"user@example.com\" && email !== \"user@example.com\"); // Filter out support email\nconst emails = uniqueEmails.join(\", \");\n\n// Return structured JSON output\nreturn [{ emails }];"
},
"typeVersion": 2
},
{
"id": "640dcaa2-9e3a-4db8-bd1d-aa2a05dfb9f0",
"name": "Relative Current Address",
"type": "n8n-nodes-base.code",
"position": [
2680,
480
],
"parameters": {
"jsCode": "const html = $('Set relativeprofile page html to scrape data').first().json.html; // Get the full page HTML\n\n// Extract the entire <a> tag that contains the address\nconst addressRegex = /<a[^>]+data-link-to-more=\"address\"[^>]*>(.*?)<\\/a>/s;\nconst addressMatch = html.match(addressRegex);\n\nif (addressMatch) {\n // Remove all HTML tags to extract just the address text\n const addressText = addressMatch[1].replace(/<[^>]+>/g, ' ').replace(/\\s+/g, ' ').trim();\n return [{ currentAddress: addressText }];\n} else {\n return [{ currentAddress: \"Not Found\" }];\n}"
},
"typeVersion": 2
},
{
"id": "a5ae86ca-fe73-4dcf-b61e-4b2a1989d482",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-220,
420
],
"parameters": {
"path": "5e78fc90-9461-4b44-bc64-8177c975d778",
"options": {}
},
"typeVersion": 2
},
{
"id": "9474efd0-7702-4b6b-9a00-45c7fc6da4e1",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
1980,
-20
],
"parameters": {
"color": 6,
"width": 940,
"height": 900,
"content": "# Step 3: Fallback to Relative \nIf no phone found, scrapes personal info from a relative\u2019s profile page as fallback."
},
"typeVersion": 1
},
{
"id": "0ffafa19-9e0f-4493-af5c-835ba471a952",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-40,
0
],
"parameters": {
"width": 640,
"height": 860,
"content": "# Step 1: Search & Match Entity \nPulls data from Google Sheet, searches truepeoplesearch.com by address, and matches entity by name.\n"
},
"typeVersion": 1
},
{
"id": "6e9ed5b9-ef9c-4ec7-ba0c-3a8fdf04e0e5",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
840,
-20
],
"parameters": {
"color": 4,
"width": 860,
"height": 1160,
"content": "# Step 2: Scrape Matched Profile \nScrapes full personal details from matched profile page, including phone, email, and address.\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "51cd4bd2-631a-44e8-a609-11658182fee2",
"name": "Get row(s) in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
20,
160
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1416164772,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo/edit#gid=1416164772",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo/edit?usp=drivesdk",
"cachedResultName": "Test"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "50b7e87c-97bc-4681-88f7-73f1694ee6f2",
"name": "Add conditions to filter already processed rows",
"type": "n8n-nodes-base.filter",
"position": [
220,
160
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "a3494c89-9cd1-40f0-aaac-9ceaa1503ad3",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.SearchURL }}",
"rightValue": ""
},
{
"id": "14fa12d0-bdc6-4c6b-8d36-cd40b31c3813",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.PersonURL }}",
"rightValue": "Not Found"
},
{
"id": "2b00916e-da2f-4f86-b349-35fc21b64c71",
"operator": {
"type": "string",
"operation": "notContains"
},
"leftValue": "={{ $json.PersonURL }}",
"rightValue": "http"
}
]
}
},
"typeVersion": 2.2,
"alwaysOutputData": false
},
{
"id": "1e8c01bc-8e59-4472-b719-820fea11b16f",
"name": "Update Sheet on Errors",
"type": "n8n-nodes-base.googleSheets",
"position": [
300,
580
],
"parameters": {
"columns": {
"value": {
"PersonURL": "Error",
"row_number": "={{ $('Limit number of rows to process').item.json.row_number }}"
},
"schema": [
{
"id": "Property Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property City",
"type": "string",
"display": true,
"required": false,
"displayName": "Property City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property State",
"type": "string",
"display": true,
"required": false,
"displayName": "Property State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "First Name",
"type": "string",
"display": true,
"required": false,
"displayName": "First Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing City",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing State",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property Type",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Type",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "HomeValue",
"type": "string",
"display": true,
"required": false,
"displayName": "HomeValue",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SearchURL",
"type": "string",
"display": true,
"required": false,
"displayName": "SearchURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PersonURL",
"type": "string",
"display": true,
"required": false,
"displayName": "PersonURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "RelativeURL",
"type": "string",
"display": true,
"required": false,
"displayName": "RelativeURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Age",
"type": "string",
"display": true,
"required": false,
"displayName": "Age",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Primary Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Primary Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "All Numbers",
"type": "string",
"display": true,
"required": false,
"displayName": "All Numbers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Emails",
"type": "string",
"display": true,
"required": false,
"displayName": "Emails",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Current Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Current Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Age",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative Age",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Primary Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative Primary Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative All Numbers",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative All Numbers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Emails",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative Emails",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Current Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative Current Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative URL",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1416164772,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo/edit#gid=1416164772",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo/edit?usp=drivesdk",
"cachedResultName": "Test"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "aba9c904-2ad9-40c9-887a-f5fd4c2d22a5",
"name": "Limit number of rows to process",
"type": "n8n-nodes-base.limit",
"position": [
420,
160
],
"parameters": {},
"typeVersion": 1
},
{
"id": "812dfbbf-cd09-4474-ad69-c0dc7ef0f154",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-580,
240
],
"parameters": {
"height": 440,
"content": "# Zyte API Setup Guide\n\n- Visit [zyte.com](http://zyte.com)\n- Sign up with email\n- Open Zyte [API Playground](http://app.zyte.com/o/788530/zyte-api/playground)\n- Click \"Get Code Snippet\"\n- Copy the unique user id from cURL like this \"436421.........a3aa3d3db8039983\"\n- Open http request node here\n- Paste the user id in basic auth and leave the password field blank\n- Make all http requests with zyte to bypass captchas and bot protections"
},
"typeVersion": 1
},
{
"id": "2e3d2cc1-0885-4d63-b79d-2926f8ed4e38",
"name": "Make HTTP Request for SearchURL",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
80,
460
],
"parameters": {
"url": "https://api.zyte.com/v1/extract",
"method": "POST",
"options": {},
"jsonBody": "={\n \"url\": \"{{ $('Limit number of rows to process').item.json.SearchURL }}\",\n \"browserHtml\": true\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"retryOnFail": false,
"typeVersion": 4.2,
"waitBetweenTries": 5000
},
{
"id": "d2255b3c-0c76-4842-b8fc-a26985983e2e",
"name": "Find the matching person profile from search results",
"type": "n8n-nodes-base.code",
"position": [
300,
400
],
"parameters": {
"jsCode": "// Get the HTML from the previous node\nconst html = $input.first().json.browserHtml // Adjust if needed based on your workflow\n\n// Clean any potential RTF or extra whitespace\nconst cleanedHtml = html.replace(/\\\\r\\\\n/g, \"\").replace(/\\\\\\\\/g, \"\").replace(/\\s+/g, \" \").trim();\n\n// Get sheet data (firstname and lastname) from the 'Loop Over Items' node\nconst firstname = $('Limit number of rows to process').first().json['First Name'].trim().toLowerCase(); // e.g., \"sherry\"\nconst lastname = $('Limit number of rows to process').first().json['Last Name'].trim().toLowerCase(); // e.g., \"wittenberg\"\n\n// Log the input values to verify\nconsole.log(`Searching for: firstname=\"${firstname}\", lastname=\"${lastname}\"`);\n\n// Log a snippet of the cleaned HTML for debugging\nconsole.log(`Cleaned HTML snippet: ${cleanedHtml.substring(0, 500)}...`);\n\n// Regex to find all card sections with names and detail links\nconst cardRegex = /<div class=\"card card-body shadow-form card-summary pt-3\" data-detail-link=\"([^\"]+)\">[\\s\\S]*?<div class=\"h4\">\\s*([^<]+)\\s*<\\/div>/g;\n\n// Extract all matches\nconst matches = [...cleanedHtml.matchAll(cardRegex)];\nconsole.log(`Found ${matches.length} profile sections in HTML`);\n\n// Variable to store the matching link\nlet detailLink = null;\n\n// Step 1: Search for both firstname and lastname\nconsole.log(\"Step 1: Searching for both firstname and lastname...\");\nfor (const match of matches) {\n const link = match[1]; // e.g., \"/find/person/p286nr6n68n822u00988\"\n const fullName = match[2].trim().toLowerCase(); // e.g., \"sherry l wittenberg\"\n\n console.log(`Checking: \"${fullName}\" (link: ${link})`);\n\n const hasFirstName = fullName.includes(firstname);\n const hasLastName = fullName.includes(lastname);\n\n console.log(`- Has firstname \"${firstname}\": ${hasFirstName}`);\n console.log(`- Has lastname \"${lastname}\": ${hasLastName}`);\n\n if (hasFirstName && hasLastName) {\n console.log(`Match found for \"${fullName}\" (both names)`);\n detailLink = link;\n break; // Exit as soon as we find a match with both names\n }\n}\n\n// Step 2: If no match, search for firstname only\nif (!detailLink) {\n console.log(\"Step 2: No match found with both names. Searching for firstname only...\");\n for (const match of matches) {\n const link = match[1];\n const fullName = match[2].trim().toLowerCase();\n\n console.log(`Checking: \"${fullName}\" (link: ${link})`);\n\n const hasFirstName = fullName.includes(firstname);\n\n console.log(`- Has firstname \"${firstname}\": ${hasFirstName}`);\n\n if (hasFirstName) {\n console.log(`Match found for \"${fullName}\" (firstname only)`);\n detailLink = link;\n break; // Exit as soon as we find a match with firstname\n }\n }\n}\n\n// Step 3: If still no match, search for lastname only\nif (!detailLink) {\n console.log(\"Step 3: No match found with firstname. Searching for lastname only...\");\n for (const match of matches) {\n const link = match[1];\n const fullName = match[2].trim().toLowerCase();\n\n console.log(`Checking: \"${fullName}\" (link: ${link})`);\n\n const hasLastName = fullName.includes(lastname);\n\n console.log(`- Has lastname \"${lastname}\": ${hasLastName}`);\n\n if (hasLastName) {\n console.log(`Match found for \"${fullName}\" (lastname only)`);\n detailLink = link;\n break; // Exit as soon as we find a match with lastname\n }\n }\n}\n\n// Step 4: If still no match, set to \"No match found\"\nconst baseUrl = \"https://www.truepeoplesearch.com\";\nconst personUrl = detailLink ? `${baseUrl}${detailLink}` : \"Not Found\";\n\n// Log the final result\nconsole.log(`Final result: ${personUrl}`);\n\n// Return the result\nreturn [{ personUrl }];"
},
"typeVersion": 2
},
{
"id": "c9e97cd9-3ca5-4c67-9ffe-4dab940d4f1e",
"name": "If found",
"type": "n8n-nodes-base.if",
"position": [
660,
480
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b06eebfe-071f-46d8-97df-331815982b96",
"operator": {
"type": "string",
"operation": "contains"
},
"leftValue": "={{ $json.personUrl }}",
"rightValue": "http"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "a67e82c4-9679-4a6d-bc8a-d30b6d526d79",
"name": "Update row in sheet with PersonURL",
"type": "n8n-nodes-base.googleSheets",
"position": [
920,
380
],
"parameters": {
"columns": {
"value": {
"Name": "Running...",
"PersonURL": "={{ $json.personUrl }}",
"row_number": "={{ $('Limit number of rows to process').item.json.row_number }}"
},
"schema": [
{
"id": "Property Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property City",
"type": "string",
"display": true,
"required": false,
"displayName": "Property City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property State",
"type": "string",
"display": true,
"required": false,
"displayName": "Property State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "First Name",
"type": "string",
"display": true,
"required": false,
"displayName": "First Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing City",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing State",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property Type",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Property Type",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "HomeValue",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "HomeValue",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SearchURL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "SearchURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PersonURL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "PersonURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "RelativeURL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "RelativeURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Age",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Age",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Primary Number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Primary Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "All Numbers",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "All Numbers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Emails",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Emails",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Current Address",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Current Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Age",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Age",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Primary Number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Primary Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative All Numbers",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative All Numbers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Emails",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Emails",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Current Address",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Current Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1416164772,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo/edit#gid=1416164772",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo/edit?usp=drivesdk",
"cachedResultName": "Test"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "3191a0bc-7771-4c3c-984c-08e781f66147",
"name": "Update row in sheet with errors",
"type": "n8n-nodes-base.googleSheets",
"position": [
920,
560
],
"parameters": {
"columns": {
"value": {
"PersonURL": "={{ $json.personUrl }}",
"row_number": "={{ $('Limit number of rows to process').item.json.row_number }}"
},
"schema": [
{
"id": "Property Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property City",
"type": "string",
"display": true,
"required": false,
"displayName": "Property City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property State",
"type": "string",
"display": true,
"required": false,
"displayName": "Property State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "First Name",
"type": "string",
"display": true,
"required": false,
"displayName": "First Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing City",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing State",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property Type",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Property Type",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "HomeValue",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "HomeValue",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SearchURL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "SearchURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PersonURL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "PersonURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "RelativeURL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "RelativeURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Age",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Age",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Primary Number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Primary Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "All Numbers",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "All Numbers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Emails",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Emails",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Current Address",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Current Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Age",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Age",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Primary Number",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Primary Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative All Numbers",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative All Numbers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Emails",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Emails",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Current Address",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Relative Current Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"row_number"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1416164772,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo/edit#gid=1416164772",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1CkMMdoIYNTaA8tIvAXzjw9YeqkXfYD8qfkeACosuibo/edit?usp=drivesdk",
"cachedResultName": "Test"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "079cf266-d410-4725-bd96-31498358c274",
"name": "Make HTTP Request for PersonURL",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
1120,
180
],
"parameters": {
"url": "https://api.zyte.com/v1/extract",
"method": "POST",
"options": {},
"jsonBody": "={\n \"url\": \"{{ $('Find the matching person profile from search results').item.json.personUrl }}\",\n \"browserHtml\": true\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpBasicAuth",
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpBasicAuth": {
"name": "<your credential>"
}
},
"retryOnFail": false,
"typeVersion": 4.2,
"waitBetweenTries": 5000
},
{
"id": "2adf413c-63e6-4b84-a8b6-9726d10e32fd",
"name": "Update Errors in Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
1320,
100
],
"parameters": {
"columns": {
"value": {
"Name": "Error",
"row_number": "={{ $('Limit number of rows to process').item.json.row_number }}"
},
"schema": [
{
"id": "Property Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property City",
"type": "string",
"display": true,
"required": false,
"displayName": "Property City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property State",
"type": "string",
"display": true,
"required": false,
"displayName": "Property State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "First Name",
"type": "string",
"display": true,
"required": false,
"displayName": "First Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Last Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing City",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing City",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing State",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing State",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Mailing Zip",
"type": "string",
"display": true,
"required": false,
"displayName": "Mailing Zip",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Property Type",
"type": "string",
"display": true,
"required": false,
"displayName": "Property Type",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "HomeValue",
"type": "string",
"display": true,
"required": false,
"displayName": "HomeValue",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "SearchURL",
"type": "string",
"display": true,
"required": false,
"displayName": "SearchURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PersonURL",
"type": "string",
"display": true,
"required": false,
"displayName": "PersonURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "RelativeURL",
"type": "string",
"display": true,
"required": false,
"displayName": "RelativeURL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Age",
"type": "string",
"display": true,
"required": false,
"displayName": "Age",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Primary Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Primary Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "All Numbers",
"type": "string",
"display": true,
"required": false,
"displayName": "All Numbers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Emails",
"type": "string",
"display": true,
"required": false,
"displayName": "Emails",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Current Address",
"type": "string",
"display": true,
"required": false,
"displayName": "Current Address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Age",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative Age",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Primary Number",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative Primary Number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative All Numbers",
"type": "string",
"display": true,
"required": false,
"displayName": "Relative All Numbers",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Relative Emails",
"type": "string",
"display": true,
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.
googleSheetsOAuth2ApihttpBasicAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Enrich any list of people with verified contact info using this workflow. This n8n automation scrapes TruePeopleSearch using Zyte's extraction API to safely bypass bot protection and extract detailed profiles. It’s built for data brokers, skip tracers, and real estate…
Source: https://n8n.io/workflows/6886/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
[SANTOBET] FLUXO TODO - BACKUP. Uses googleSheets, httpRequest, googleSheetsTrigger. Webhook trigger; 57 nodes.
FLUXO DISPARO DATA E HORA. Uses itemLists, googleSheets, httpRequest. Webhook trigger; 48 nodes.
This workflow allows you to accept online payments via YooKassa and log both orders and transactions in Google Sheets — all without writing a single line of code. It supports full payment flow: produc
Transform your n8n instance management with this advanced automation system featuring artificial intelligence-driven workflow selection. This template provides comprehensive maintenance operations wit
Convalidaciones Académicas - Estructura Base. Uses googleSheets, emailSend, googleDrive, httpRequest. Webhook trigger; 35 nodes.