AutomationFlowsAI & RAG › Scrape Linkedin Jobs with Gemini AI and Store in Google Sheets Using RSS

Scrape Linkedin Jobs with Gemini AI and Store in Google Sheets Using RSS

ByAbdullah Alshiekh @abdullah01 on n8n.io

This workflow automates the process of finding and collecting job postings from LinkedIn, eliminating the need for manual job searching. It’s designed to save time and ensure you don’t miss out on new opportunities by automatically populating a spreadsheet with key job details.…

Event trigger★★★★☆ complexityAI-powered17 nodesAgentGoogle Gemini ChatOutput Parser StructuredRSS Feed ReadHTTP RequestGoogle Sheets
AI & RAG Trigger: Event Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → 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": "LPtWfT87D8T6CFb2",
  "name": "LinkedIn Job Scraper (Submit)",
  "tags": [],
  "nodes": [
    {
      "id": "2946b0fd-a04f-444c-8fd4-a20a136fe2ff",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -368,
        688
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "7937f28e-abf2-4a10-a7c4-48a7dec09fdf",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1056,
        704
      ],
      "parameters": {
        "text": "=You're an intelligent bot capable of pulling out data from a job listing site.\n\nHere is the job Description :\n {{ $json.description }}\n\noutput the data in JSON format, using the following structure:\n{\n  \n  \"benefits\": \"\", //separate by commas\n  \"location_remote\": \"\",\n  \"job_description\": \"\" //make it 200 characters or less\n}\n\nsimplify the output\noutput content as json\n",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "22e0f014-7696-46e3-b0f6-94be990e6f3f",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1008,
        944
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "4eb45b49-676a-4fa9-b20f-9721f9f9e039",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1264,
        928
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"benefits\": \"\",\n  \"location_state\": \"\",\n  \"location_remote\": \"\",\n  \"job_description\": \"\"\n}\n"
      },
      "typeVersion": 1.3
    },
    {
      "id": "ca45b9d5-6c31-40d5-978f-1fa1d0166528",
      "name": "Loop for Job Posts",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        48,
        688
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "b70f812e-ad74-493f-bbec-9e71d129bb58",
      "name": "Extract HTML",
      "type": "n8n-nodes-base.html",
      "position": [
        464,
        704
      ],
      "parameters": {
        "options": {
          "cleanUpText": true
        },
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "body",
              "cssSelector": "script[type=\"application/ld+json\"]"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "0fd49815-cfe2-4b1f-960f-2355a5189802",
      "name": "Pre-clean Before AI",
      "type": "n8n-nodes-base.code",
      "position": [
        848,
        704
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  let desc = item.json.description || \"\";\n\n  // Remove HTML tags\n  desc = desc.replace(/<[^>]+>/g, ' ');\n\n  // Normalize spaces\n  desc = desc.replace(/\\s+/g, ' ').trim();\n\n  return {\n    json: {\n      title: item.json.title,\n      company: item.json.hiringOrganization?.name,\n      location: item.json.jobLocation?.address?.addressLocality,\n      country: item.json.jobLocation?.address?.addressCountry,\n      description: desc,\n      employmentType: item.json.employmentType,\n      validThrough: item.json.validThrough\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "0fdd0dda-1231-43a3-b873-4dcbf73e59c7",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        608
      ],
      "parameters": {
        "color": 4,
        "width": 192,
        "content": "Retrieves information such as the job title, link, and publication date."
      },
      "typeVersion": 1
    },
    {
      "id": "589c7174-eddb-4c17-94e5-c07a2e179ce6",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        608
      ],
      "parameters": {
        "color": 5,
        "width": 208,
        "content": "Processes each job post one by one to ensure the data is handled correctly."
      },
      "typeVersion": 1
    },
    {
      "id": "3eb0081e-b5ff-4224-b7d7-edbcc1c2df89",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        224,
        608
      ],
      "parameters": {
        "color": 4,
        "width": 192,
        "content": "Scrapes the full HTML content of the job page."
      },
      "typeVersion": 1
    },
    {
      "id": "c2084ebf-5be3-45c5-af1d-919dd996cd7b",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        608
      ],
      "parameters": {
        "color": 5,
        "width": 160,
        "content": "Extracts a specific JSON script embedded in the HTML."
      },
      "typeVersion": 1
    },
    {
      "id": "9743f23d-bf9b-43d8-8b23-69c4715ad46c",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        608,
        608
      ],
      "parameters": {
        "color": 4,
        "width": 192,
        "content": "Removes HTML tags and extra spaces to prepare the data for the AI model.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ee564f7e-535b-406f-b458-be98a3e62624",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1392,
        608
      ],
      "parameters": {
        "color": 5,
        "width": 192,
        "content": "Adds the extracted data to a Google Sheet."
      },
      "typeVersion": 1
    },
    {
      "id": "1808a85e-3254-4ae6-ade4-fb297ff7078c",
      "name": "Read RSS Feed.",
      "type": "n8n-nodes-base.rssFeedRead",
      "position": [
        -160,
        688
      ],
      "parameters": {
        "url": "{{ $json.rssFeedUrl }}",
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "82459329-aa32-4f2f-9aa4-661c592652d2",
      "name": "Scrape Job HTML.",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        256,
        704
      ],
      "parameters": {
        "url": "={{ $json.link }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "2a66d30d-2b1b-496e-9c39-33b05bcb95c5",
      "name": "Parse Job Details.",
      "type": "n8n-nodes-base.code",
      "position": [
        672,
        704
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  const raw = item.json.body;\n  const jobData = JSON.parse(raw);\n\n  return {\n    json: {\n      title: jobData.title,\n      company: jobData.hiringOrganization?.name,\n      description: jobData.description,\n      location: jobData.jobLocation?.address?.addressLocality,\n      country: jobData.jobLocation?.address?.addressCountry,\n      employmentType: jobData.employmentType,\n      validThrough: jobData.validThrough\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "f39bd644-0d55-4064-a9ec-c29811248ccf",
      "name": "Update Google Sheet.",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1440,
        704
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $('Read RSS Feed.').item.json.pubDate }}",
            "Title": "={{ $('Pre-clean Before AI').item.json.title }}",
            "Benefits": "={{ $json.output.benefits }}",
            "Company Name": "={{ $('Parse Job Details.').item.json.company }}",
            "Job Description": "={{ $json.output.job_description }}",
            "Job Description Link": "={{ $('Read RSS Feed.').item.json.link }}"
          },
          "schema": [
            {
              "id": "Title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job Description Link",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Job Description Link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Company Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Company Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Benefits",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Benefits",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job Description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Job Description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Cover Letter",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Cover Letter",
              "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": [
            "Job Description Link"
          ]
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "{{ $json.sheetName }}"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "{{ $json.googleSheetsId }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "c63c1972-a3f7-42cf-93b7-298a3a12af5b",
  "connections": {
    "AI Agent": {
      "main": [
        [
          {
            "node": "Update Google Sheet.",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract HTML": {
      "main": [
        [
          {
            "node": "Parse Job Details.",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read RSS Feed.": {
      "main": [
        [
          {
            "node": "Loop for Job Posts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Job HTML.": {
      "main": [
        [
          {
            "node": "Extract HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop for Job Posts": {
      "main": [
        [],
        [
          {
            "node": "Scrape Job HTML.",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Job Details.": {
      "main": [
        [
          {
            "node": "Pre-clean Before AI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pre-clean Before AI": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Read RSS Feed.",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

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

Pro

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

About this workflow

This workflow automates the process of finding and collecting job postings from LinkedIn, eliminating the need for manual job searching. It’s designed to save time and ensure you don’t miss out on new opportunities by automatically populating a spreadsheet with key job details.…

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

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

This automation is designed to help you generate AI-powered music tracks, cover art, and fully rendered music videos — all triggered from a simple Telegram chat and managed via Google Sheets.

OpenAI Chat, Memory Buffer Window, Output Parser Structured +11
AI & RAG

This Shopify AI automation is an advanced n8n-powered workflow that transforms Shopify product collections into SEO-optimized blog articles with images, while maintaining full visibility and control t

Shopify Trigger, HTTP Request, Google Sheets +7
AI & RAG

LinkedIn URL → Scrape → Match → Screen → Decide, all automated

Google Drive, Agent, Google Drive Tool +6
AI & RAG

This is an automated blog post generation system that: Researches topics using AI agents and web search tools Writes complete blog posts with proper SEO structure Generates custom images for each post

Output Parser Structured, Google Gemini Chat, HTTP Request Tool +11
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Output Parser Structured, Telegram, N8N Nodes Tesseractjs +14