{
  "id": "35Ynqn7VKpxFCUkF",
  "meta": {
    "templateId": "ready-to-run-ai-workflow-v5",
    "templateCredsSetupCompleted": true
  },
  "name": "Linkedin Job Scraper",
  "tags": [],
  "nodes": [
    {
      "id": "293e2ff4-6082-40a9-a8bf-b4c648804fd3",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        -112
      ],
      "parameters": {
        "height": 352,
        "content": "## Paste job Linkedin URL\n\nIn this node you can add up to 10 URLs to be scraped from linkedin jobs\n\nBy default the item count set to 100 you can change it to whatever number of jobs you want to extract\n"
      },
      "typeVersion": 1
    },
    {
      "id": "4eea4916-03ef-4c92-9d11-cc7ed9bf27c3",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        16
      ],
      "parameters": {
        "width": 400,
        "content": "## De-Duplication\nThis branch to ensure no duplicates will go over the same rows"
      },
      "typeVersion": 1
    },
    {
      "id": "e83dbe60-c785-4cc9-b40e-4dfd7b11bf12",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        -416
      ],
      "parameters": {
        "width": 528,
        "height": 352,
        "content": "## [Video Tutorial](https://youtu.be/tXvcCoM5igQ)\n@[youtube](tXvcCoM5igQ)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "1c21518d-18cf-4060-8615-9c2be275b351",
      "name": "Manual trigger (can be replaces to cron trigger)",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        224
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "39052b83-506e-4c9b-9265-3ac33498f7b6",
      "name": "Extract linkedin data using Apify",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        224,
        224
      ],
      "parameters": {
        "actorId": {
          "__rl": true,
          "mode": "list",
          "value": "hKByXkMQaC5Qt9UMN",
          "cachedResultUrl": "https://console.apify.com/actors/hKByXkMQaC5Qt9UMN/input",
          "cachedResultName": "Linkedin Jobs Scraper - PPR (curious_coder/linkedin-jobs-scraper)"
        },
        "timeout": {},
        "operation": "Run actor and get dataset",
        "customBody": "{\n    \"count\": 100,\n    \"scrapeCompany\": true,\n    \"urls\": [\n        \"https://www.linkedin.com/jobs/search/?currentJobId=4360741749&geoId=103644278&keywords=Data%20Analyst\"\n    ]\n}",
        "actorSource": "store",
        "authentication": "apifyOAuth2Api"
      },
      "credentials": {
        "apifyOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7e2855f6-eae4-4492-a26e-8caaa7926e73",
      "name": "Looping",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        672,
        224
      ],
      "parameters": {
        "options": {},
        "batchSize": 5
      },
      "typeVersion": 3
    },
    {
      "id": "bf54eb9e-92ad-40a1-85d9-a17927118be1",
      "name": "Append new rows to Gsheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        896,
        160
      ],
      "parameters": {
        "columns": {
          "value": {
            "Id": "={{ $json.id }}",
            "title": "={{ $json.title }}",
            "linkJob": "={{ $json.linkJob }}",
            "location": "={{ $json.location }}",
            "postedAt": "={{ $json.postedAt }}",
            "compnayName": "={{ $json.companyName }}",
            "How many days that was posted?": "={{ $json['How many days that was posted?'] }}"
          },
          "schema": [
            {
              "id": "Id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "linkJob",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "linkJob",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "compnayName",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "compnayName",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "location",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "postedAt",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "postedAt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "How many days that was posted?",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "How many days that was posted?",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qrn3p5mzx1-muAhMNj0xty8M73vOM_WWnOkUFpNuItg/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qrn3p5mzx1-muAhMNj0xty8M73vOM_WWnOkUFpNuItg",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qrn3p5mzx1-muAhMNj0xty8M73vOM_WWnOkUFpNuItg/edit?usp=drivesdk",
          "cachedResultName": "Linedin Job Post"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "b8e500b2-e6ef-45ff-972b-406c07680e22",
      "name": "Search for existing records in Gsheet",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        1120,
        160
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qrn3p5mzx1-muAhMNj0xty8M73vOM_WWnOkUFpNuItg/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qrn3p5mzx1-muAhMNj0xty8M73vOM_WWnOkUFpNuItg",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qrn3p5mzx1-muAhMNj0xty8M73vOM_WWnOkUFpNuItg/edit?usp=drivesdk",
          "cachedResultName": "Linedin Job Post"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "85f36a91-5b8c-4daf-b296-65e53e45f7c3",
      "name": "Condition to remove dup in gsheet",
      "type": "n8n-nodes-base.if",
      "position": [
        1344,
        224
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "b4fd269b-1500-4bad-9ef8-a430ce63b24f",
              "operator": {
                "type": "number",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json.row_number }}",
              "rightValue": "="
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "8e7dfcb6-eeaa-4f37-b6ac-4c478f6f9931",
      "name": "Choose data field that are relevant",
      "type": "n8n-nodes-base.set",
      "position": [
        448,
        224
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1b1fef61-4179-4109-937e-e245c9a83317",
              "name": "id",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "6515d16e-0194-4226-a7e3-6ce7b367928d",
              "name": "linkJob",
              "type": "string",
              "value": "={{ $json.link }}"
            },
            {
              "id": "a7a1ace9-f907-400a-beea-ffd1de8a7679",
              "name": "title",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "501e4a50-babe-4a35-9bf2-fdf4238333c8",
              "name": "companyName",
              "type": "string",
              "value": "={{ $json.companyName }}"
            },
            {
              "id": "7ad8f2f1-11d0-43e7-984f-99724184b7fb",
              "name": "location",
              "type": "string",
              "value": "={{ $json.location }}"
            },
            {
              "id": "aaba05db-3d55-47ee-9094-c645b5357f2a",
              "name": "postedAt",
              "type": "string",
              "value": "={{ $json.postedAt }}"
            },
            {
              "id": "bac5d622-f3c3-4348-9877-7c841270f6e3",
              "name": "How many days that was posted?",
              "type": "string",
              "value": "={{\n  Math.floor(\n    (\n      new Date($now).getTime() -\n      new Date($json.postedAt).getTime()\n    ) / (1000 * 60 * 60 * 24)\n  )\n}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "82c9de06-8905-4384-94bd-24b12765d20e",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -704,
        -320
      ],
      "parameters": {
        "color": 4,
        "width": 576,
        "height": 1072,
        "content": "# LinkedIn job intelligence workflow\n\n### This workflow automatically collects LinkedIn job postings and turns them into structured hiring intelligence. It is designed for users who may be new to n8n and want a reliable way to track hiring activity without manual searches or scraping scripts.\n\n### The workflow uses a LinkedIn job search URL as input, extracts job details through Apify, enriches each job with useful context, and stores only new results in Google Sheets. Over time, this creates a clean and growing dataset that can be used for lead generation, recruitment, market analysis, or downstream automations.\n\n### Hiring activity is often an early signal of growth, budget allocation, or operational needs. By tracking job posts continuously, this workflow helps you spot those signals early and act on them.\n\n---\n\n## How it works\n\n1. The workflow starts with a manual trigger, which can later be replaced with a Cron trigger for automation.\n2. An Apify actor scrapes LinkedIn job postings from one or more job search URLs.\n3. The job data is cleaned and standardized so all records follow the same structure.\n4. A calculated field determines how many days ago each job was posted.\n5. Jobs are processed in batches to keep the workflow stable.\n6. Google Sheets is checked to see if a job already exists.\n7. Only new jobs are added to the sheet, preventing duplicates.\n\n---\n\n## Setup steps\n\n1. Connect your Apify account and select the LinkedIn Jobs Scraper actor.\n2. Paste at least one LinkedIn job search URL into the Apify input.\n3. Create a Google Sheet with columns for job ID, title, company, location, posting date, and days since posted.\n4. Connect your Google Sheets account in n8n.\n5. Run the workflow once to confirm data is written correctly.\n6. Optional: replace the manual trigger with a Cron trigger to run automatically.\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "d1aa7ab8-cec4-4104-8c88-a6afb7db7b44",
  "connections": {
    "Looping": {
      "main": [
        [],
        [
          {
            "node": "Append new rows to Gsheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Append new rows to Gsheet": {
      "main": [
        [
          {
            "node": "Search for existing records in Gsheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Condition to remove dup in gsheet": {
      "main": [
        [],
        [
          {
            "node": "Looping",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract linkedin data using Apify": {
      "main": [
        [
          {
            "node": "Choose data field that are relevant",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Choose data field that are relevant": {
      "main": [
        [
          {
            "node": "Looping",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search for existing records in Gsheet": {
      "main": [
        [
          {
            "node": "Condition to remove dup in gsheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Manual trigger (can be replaces to cron trigger)": {
      "main": [
        [
          {
            "node": "Extract linkedin data using Apify",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}