{
  "id": "EWXwnW7n89EbC8AA",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Indeed Scraping with ScrapeOps",
  "tags": [
    {
      "id": "4KwoHYYk8JYchAp2",
      "name": "Indeed",
      "createdAt": "2025-11-24T12:36:59.926Z",
      "updatedAt": "2025-11-24T12:36:59.926Z"
    },
    {
      "id": "O2cwFK8BGsyBTwAX",
      "name": "job-tracking",
      "createdAt": "2025-11-06T11:39:39.261Z",
      "updatedAt": "2025-11-06T11:39:39.261Z"
    },
    {
      "id": "gvqJMDkRPknoYQcL",
      "name": "job-alerts",
      "createdAt": "2025-11-06T11:39:28.276Z",
      "updatedAt": "2025-11-06T11:39:28.276Z"
    },
    {
      "id": "lZKSh2IoxHklnOUw",
      "name": "ScrapeOps",
      "createdAt": "2025-10-20T20:27:13.410Z",
      "updatedAt": "2025-10-20T20:27:13.410Z"
    },
    {
      "id": "yh7XX4GObvd3np2S",
      "name": "google sheets",
      "createdAt": "2025-11-06T11:10:29.979Z",
      "updatedAt": "2025-11-06T11:10:29.979Z"
    }
  ],
  "nodes": [
    {
      "id": "b8a97c17-7d89-442b-a1d7-8e3ba38cb254",
      "name": "Set Search URL",
      "type": "n8n-nodes-base.set",
      "position": [
        352,
        224
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "search_query",
              "stringValue": "revenue operations"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "f9b90702-0694-4d96-ba01-8d3fcd142183",
      "name": "ScrapeOps - Proxy API",
      "type": "@scrapeops/n8n-nodes-scrapeops.ScrapeOps",
      "position": [
        576,
        224
      ],
      "parameters": {
        "url": "=https://www.indeed.com/jobs?q={{ encodeURIComponent($json.search_query) }}",
        "advancedOptions": {
          "wait": 3000,
          "bypass": "cloudflare_level_1",
          "country": "us",
          "render_js": true,
          "follow_redirects": true,
          "optimize_request": true,
          "residential_proxy": true
        }
      },
      "credentials": {
        "scrapeOpsApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "0c5fd457-fb33-48ad-af4a-0fd3f7d28323",
      "name": "ScrapeOps - Parser API",
      "type": "@scrapeops/n8n-nodes-scrapeops.ScrapeOps",
      "position": [
        800,
        224
      ],
      "parameters": {
        "apiType": "parserApi",
        "parserUrl": "=https://indeed.com/jobs?q={{ encodeURIComponent($('Set Search URL').item.json.search_query) }}",
        "parserHtml": "={{ typeof $json === 'string' ? $json : ($json.body || $json.html || $json) }}",
        "parserDomain": "indeed"
      },
      "credentials": {
        "scrapeOpsApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "402e4b36-b9c2-43c0-a1a2-31fa6658ea5e",
      "name": "Add Metadata",
      "type": "n8n-nodes-base.set",
      "position": [
        1024,
        224
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "timestamp",
              "stringValue": "={{ new Date().toISOString() }}"
            },
            {
              "name": "search_query",
              "stringValue": "={{ $json.data.search_information.query }}"
            },
            {
              "name": "total_jobs_found",
              "stringValue": "={{ $json.data.total_count || 0 }}"
            },
            {
              "name": "search_results",
              "stringValue": "={{ $json.data.search_results }}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "9eee2078-8239-4ca1-8c80-b18251097536",
      "name": "Format Job Data",
      "type": "n8n-nodes-base.set",
      "position": [
        1472,
        224
      ],
      "parameters": {
        "fields": {
          "values": [
            {
              "name": "job_title",
              "stringValue": "={{ $json.title || 'N/A' }}"
            },
            {
              "name": "company",
              "stringValue": "={{ $json.company?.name || $json.company || 'N/A' }}"
            },
            {
              "name": "location",
              "stringValue": "={{ $json.location || 'N/A' }}"
            },
            {
              "name": "salary",
              "stringValue": "={{ $json.salary?.text || $json.salary || 'N/A' }}"
            },
            {
              "name": "job_url",
              "stringValue": "={{ $json.url || 'N/A' }}"
            },
            {
              "name": "description",
              "stringValue": "={{ $json.snippet ? $json.snippet.replace(/<[^>]*>/g, '') : ($json.description || 'N/A') }}"
            },
            {
              "name": "posted_date",
              "stringValue": "={{ $json.create_date || $json.posted_date || 'N/A' }}"
            },
            {
              "name": "company_rating",
              "stringValue": "={{ $json.company?.rating || 0 }}"
            },
            {
              "name": "is_new_job",
              "stringValue": "={{ $json.is_new_job || false }}"
            },
            {
              "name": "scraped_at",
              "stringValue": "={{ $('Add Metadata').item.json.timestamp }}"
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "3db13957-5098-44f2-98ae-b00ccd5aebcd",
      "name": "Save to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1696,
        224
      ],
      "parameters": {
        "columns": {
          "value": {
            "Salary": "={{ $json.salary }}",
            "Company": "={{ $json.company }}",
            "Job URL": "={{ $json.job_url }}",
            "Location": "={{ $json.location }}",
            "Job Title": "={{ $json.job_title }}",
            "Is New Job": "={{ $json.is_new_job }}",
            "Scraped At": "={{ $json.scraped_at }}",
            "Description": "={{ $json.description }}",
            "Posted Date": "={{ $json.posted_date }}",
            "Company Rating": "={{ $json.company_rating }}"
          },
          "schema": [
            {
              "id": "Job Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Job Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Salary",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Salary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Job URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Posted Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Posted Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company Rating",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company Rating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Is New Job",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Is New Job",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Scraped At",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Scraped At",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/19TBhoTSKF-HLMcogXnpm6Qq2A8stx1EGwldjEW9-69s/edit?gid=0#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": "https://docs.google.com/spreadsheets/d/1r_ZMwAli50Bes9quxZtB37WE7S9HwlYOcj50bZzbOAM/edit?gid=0#gid=0"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "b544c0cd-40e7-41ab-8fc0-4537f1b3e414",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        128,
        224
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "75727b8c-514a-4e90-a5fa-d60b36c662f9",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        -16
      ],
      "parameters": {
        "width": 656,
        "height": 512,
        "content": "## \ud83d\ude80 Indeed Job Scraper with ScrapeOps\n\n### How it works\nThis workflow automates the process of finding and tracking job listings on Indeed.\n1. **Schedule**: Runs automatically every 6 hours to check for new jobs.\n2. **Define**: Sets your target search query (e.g., \"revenue operations\") in the first node.\n3. **Scrape**: Uses **ScrapeOps Proxy API** to fetch the search results page, handling rotation and anti-bot bypass.\n4. **Parse**: Uses **ScrapeOps Parser API** to extract structured data (Title, Company, Location, Salary, etc.) from the raw HTML.\n5. **Process**: Filters out empty results and formats the data for the spreadsheet.\n6. **Store**: Appends the clean job data to a **Google Sheet**.\n7. **Notify**: Sends a summary alert to **Slack** so you never miss a listing.\n\n### Setup steps\n1. **ScrapeOps**: Sign up for a free [API Key](https://scrapeops.io/app/register/n8n) and add it to the ScrapeOps nodes.\n2. **Google Sheets**: Duplicate this [Template Sheet](https://docs.google.com/spreadsheets/d/1r_ZMwAli50Bes9quxZtB37WE7S9HwlYOcj50bZzbOAM/edit?gid=0#gid=0) and connect your account to the **Save to Google Sheets** node.\n3. **Slack**: Connect your Slack account to the **Send a message** node.\n4. **Customize**: Open the **Set Search URL** node and change the `search_query` value to your desired job title."
      },
      "typeVersion": 1
    },
    {
      "id": "aa795d6c-3852-4f0b-8de9-ce1ba5ceb93a",
      "name": "Send a message",
      "type": "n8n-nodes-base.slack",
      "position": [
        1920,
        224
      ],
      "parameters": {
        "text": "Indeed Jobs Updated: https://docs.google.com/spreadsheets/d/1r_ZMwAli50Bes9quxZtB37WE7S9HwlYOcj50bZzbOAM/edit?gid=0#gid=0",
        "user": {
          "__rl": true,
          "mode": "id",
          "value": "U08P301T9HA"
        },
        "select": "user",
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 2.3
    },
    {
      "id": "c6dc5e88-1019-4d74-94d1-a8543222b538",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        104,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 272,
        "content": "## \u2699\ufe0f Configuration\nSet your search query and schedule here."
      },
      "typeVersion": 1
    },
    {
      "id": "943fbe0e-7f8a-486b-bd1b-356ad0ab32e1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        528,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 272,
        "content": "## \ud83d\udd77\ufe0f Scraping & Parsing\n[Fetches HTML](https://scrapeops.io/docs/n8n/proxy-api/) via proxy and [extracts data](https://scrapeops.io/docs/n8n/parser-api/)."
      },
      "typeVersion": 1
    },
    {
      "id": "7a820e91-8c9d-4050-8f87-12ae94bf1218",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        976,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 640,
        "height": 272,
        "content": "## \ud83e\uddf9 Data Processing\nCleans, formats, and structures the job data."
      },
      "typeVersion": 1
    },
    {
      "id": "4f7bee9c-865d-4d61-90df-c9a834bc07ec",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1608,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 496,
        "height": 272,
        "content": "## \ud83d\udcbe Storage & Alerts\nSaves to Sheets and notifies via Slack."
      },
      "typeVersion": 1
    },
    {
      "id": "ee51948f-c5e5-40e9-b082-3c345881806e",
      "name": "Parse and Filter Job Data",
      "type": "n8n-nodes-base.code",
      "position": [
        1248,
        224
      ],
      "parameters": {
        "jsCode": "// Parse the search_results array and return individual job items\nconst inputData = $input.first().json;\nconst searchResults = inputData.search_results;\n\n// Handle both string and array cases\nlet jobsArray;\nif (!searchResults) {\n  return [];\n}\n\nif (typeof searchResults === 'string') {\n  try {\n    jobsArray = JSON.parse(searchResults);\n  } catch (e) {\n    console.error('Error parsing search_results:', e);\n    return [];\n  }\n} else {\n  jobsArray = searchResults;\n}\n\n// Ensure jobsArray is an array\nif (!Array.isArray(jobsArray)) {\n  console.error('search_results is not an array:', typeof jobsArray);\n  return [];\n}\n\n// Filter out any null or undefined jobs\nconst validJobs = jobsArray.filter(job => job && job.title);\n\nreturn validJobs.map(job => ({ json: job }));"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "f9630da0-0669-4fab-ad6a-1ea3cab4f521",
  "connections": {
    "Add Metadata": {
      "main": [
        [
          {
            "node": "Parse and Filter Job Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Search URL": {
      "main": [
        [
          {
            "node": "ScrapeOps - Proxy API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Job Data": {
      "main": [
        [
          {
            "node": "Save to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Set Search URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save to Google Sheets": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ScrapeOps - Proxy API": {
      "main": [
        [
          {
            "node": "ScrapeOps - Parser API",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ScrapeOps - Parser API": {
      "main": [
        [
          {
            "node": "Add Metadata",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse and Filter Job Data": {
      "main": [
        [
          {
            "node": "Format Job Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}