AutomationFlowsWeb Scraping › Scrape Linkedin Job Listings with Apify and Save Them to Airtable

Scrape Linkedin Job Listings with Apify and Save Them to Airtable

ByAllan Vaccarizi @growthai on n8n.io

This workflow is for job seekers, recruiters, or HR teams who want to automatically monitor new job postings on LinkedIn based on specific search queries, without manually checking the platform every week. A Schedule Trigger fires the workflow every week at 10am. The Set Search…

Cron / scheduled trigger★★★☆☆ complexity9 nodesHTTP RequestAirtable
Web Scraping Trigger: Cron / scheduled Nodes: 9 Complexity: ★★★☆☆ Added:

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

This workflow follows the Airtable → 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 →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "e1e9b5ca-8327-4797-a335-8b8130f2fd39",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        -240
      ],
      "parameters": {
        "color": 7,
        "width": 1024,
        "height": 208,
        "content": "## Need more advanced automation solutions? Contact us for custom enterprise workflows!\n\n# Growth-AI.fr\n\n## https://www.linkedin.com/in/allanvaccarizi/\n## https://www.linkedin.com/in/hugo-marinier-%F0%9F%A7%B2-6537b633/"
      },
      "typeVersion": 1
    },
    {
      "id": "ac8be395-c792-4b15-a8bf-167a27de8de1",
      "name": "Sticky Note16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        -656
      ],
      "parameters": {
        "color": 7,
        "width": 1024,
        "height": 400,
        "content": "![Logo Growth AI](https://cdn.prod.website-files.com/6825df5b20329ba581df4914/68d413c43f8729fa336568a6_Logo_horizontal.png)"
      },
      "typeVersion": 1
    },
    {
      "id": "0c004fa1-c4a5-4056-ad82-2e31e4e79b74",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -864,
        -16
      ],
      "parameters": {
        "width": 480,
        "height": 608,
        "content": "## Linkedin jobs scraper\n\n### How it works\n\n1. A schedule trigger fires the workflow at configured intervals.\n2. The Edit Fields node defines the search queries to be passed to the scraper.\n3. An HTTP POST request submits the queries to an Apify actor, which performs the scraping job.\n4. The results returned by Apify are saved as a new record in Airtable.\n\n### Setup steps\n\n- - [ ] Configure the Schedule Trigger with your desired run frequency (e.g. daily, hourly).\n- - [ ] Add your Apify API token to the HTTP Request node's authentication settings.\n- - [ ] Update the Apify actor URL/ID in the 'Apify get job' node to point to your chosen scraper actor.\n- - [ ] Set the desired search queries in the 'Edit Fields' node (Query 1, Query 2, Query 3).\n- - [ ] Connect your Airtable account credentials and configure the target base and table in the 'Create a record' node.\n\n### Customization\n\nYou can add more query fields in the 'Edit Fields' node to expand the number of searches per run. The Apify actor ID in the HTTP Request can be swapped to use a different scraper depending on your data needs."
      },
      "typeVersion": 1
    },
    {
      "id": "f6317fdd-71e2-4db8-a7c0-785cebc1f419",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 336,
        "content": "## Schedule and prepare queries\n\nThe schedule trigger initiates the workflow on a timed basis, and Edit Fields sets the search query values that will be sent to the scraper."
      },
      "typeVersion": 1
    },
    {
      "id": "d7a8b024-243f-43b5-9c01-f648d7031a1d",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        128,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 336,
        "content": "## Run scraper and save results\n\nSubmits the queries to an Apify actor via HTTP POST to execute the scraping job, then stores the returned data as a new record in Airtable."
      },
      "typeVersion": 1
    },
    {
      "id": "a7c0ca83-6f85-4991-baba-e48fef2f8632",
      "name": "Run Apify Actor and Fetch Results",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        176,
        160
      ],
      "parameters": {
        "url": "https://api.apify.com/v2/acts/vIGxjRrHqDTPuE6M4/run-sync-get-dataset-items",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n    \"aiHasSalary\": false,\n    \"aiVisaSponsorshipFilter\": false,\n    \"directApply\": false,\n    \"excludeATSDuplicate\": false,\n    \"externalApplyUrl\": false,\n    \"includeAi\": true,\n    \"limit\": 10,\n    \"locationSearch\": [\"France\"],\n    \"organizationEmployeesLte\": 500,\n    \"populateAiRemoteLocation\": false,\n    \"populateAiRemoteLocationDerived\": false,\n    \"populateExternalApplyURL\": false,\n    \"remote\": false,\n    \"removeAgency\": true,\n    \"timeRange\": \"7d\",\n    \"titleSearch\": {{ JSON.stringify(Object.values($json).filter(v => v && v.trim() !== '')) }}\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "apifyApi"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "b7a3d976-7006-44ce-ab1b-1854006e06d6",
      "name": "Every Week at 10am",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -256,
        160
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtHour": 10
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "fa1d2a0e-cacc-42b1-9301-4fe7c1a1013b",
      "name": "Set Search Queries",
      "type": "n8n-nodes-base.set",
      "position": [
        -48,
        160
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "eca2845e-e596-46d2-a1ba-5a076cb6764a",
              "name": "Query 1",
              "type": "string",
              "value": "Assistant administratif"
            },
            {
              "id": "1caeac9a-c990-41ee-b6e1-187ebb7b54db",
              "name": "Query 2",
              "type": "string",
              "value": "Assistant ADV"
            },
            {
              "id": "ba7c83d6-cc64-4b90-8da3-8918685ac0a7",
              "name": "Query 3",
              "type": "string",
              "value": "Administration des ventes"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ea041fbb-0d33-4399-b345-14a28b7ccd2f",
      "name": "Create Record in Airtable",
      "type": "n8n-nodes-base.airtable",
      "position": [
        352,
        160
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appnM9t2JxMCU2LQB",
          "cachedResultUrl": "https://airtable.com/appnM9t2JxMCU2LQB",
          "cachedResultName": "Test n8n"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblQ7A00d5iocuwfr",
          "cachedResultUrl": "https://airtable.com/appnM9t2JxMCU2LQB/tblQ7A00d5iocuwfr",
          "cachedResultName": "Table 2"
        },
        "columns": {
          "value": {
            "URL": "={{ $json.url }}",
            "Title": "={{ $json.title }}",
            "Industry": "={{ $json.linkedin_org_industry }}",
            "Location": "={{ $json.linkedin_org_locations.join(', ') }}",
            "Date posted": "={{ $json.date_posted }}",
            "Organization": "={{ $json.organization }}",
            "Recruiter URL": "={{ $json.recruiter_url }}",
            "Recruiter name": "={{ $json.recruiter_name }}",
            "Employment type": "={{ $json.employment_type.join(', ') }}",
            "Job description": "={{ $json.description_text }}",
            "Organization size": "={{ $json.linkedin_org_size }}",
            "Organization type": "={{ $json.linkedin_org_type }}",
            "Organization Linkedin URL": "={{ $json.organization_url }}",
            "Organization foundation year": "={{ $json.linkedin_org_foundeddate }}"
          },
          "schema": [
            {
              "id": "Title",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "URL",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Job description",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Job description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date posted",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Date posted",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Organization",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Organization",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Organization Linkedin URL",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Organization Linkedin URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Employment type",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Employment type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Organization size",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Organization size",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Industry",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Industry",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Organization type",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Organization type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Organization foundation year",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Organization foundation year",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Recruiter name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Recruiter name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Recruiter URL",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Recruiter URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {
          "typecast": true
        },
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    }
  ],
  "connections": {
    "Every Week at 10am": {
      "main": [
        [
          {
            "node": "Set Search Queries",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Search Queries": {
      "main": [
        [
          {
            "node": "Run Apify Actor and Fetch Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run Apify Actor and Fetch Results": {
      "main": [
        [
          {
            "node": "Create Record in Airtable",
            "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 is for job seekers, recruiters, or HR teams who want to automatically monitor new job postings on LinkedIn based on specific search queries, without manually checking the platform every week. A Schedule Trigger fires the workflow every week at 10am. The Set Search…

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

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

Very straightforward workflow. It checks the Epic Games website if the HTML container with free games has changed. If it did then it will send a notification to Discord with a list of embeds containin

Discord, N8N Nodes Puppeteer, HTTP Request
Web Scraping

This n8n workflow collects leads from Google Maps, scrapes their websites via direct HTTP requests, and extracts valid email addresses — all while mimicking real user behavior to improve scraping reli

Form Trigger, @Apify/N8N Nodes Apify, HTTP Request +1
Web Scraping

This workflow automatically scrapes business leads from Google Maps on a daily schedule and ensures only high-quality, unique leads are processed. New businesses are cleaned, validated, and deduplicat

Google Sheets, Gmail, HTTP Request
Web Scraping

Women creators, homemakers-turned-entrepreneurs, and feminine lifestyle brands who want a graceful, low-lift way to keep an eye on competitor content and spark weekly ideas.

HTTP Request, Google Sheets, Email Send +1
Web Scraping

This workflow automatically searches YouTube Data API for videos related to specific keywords, extracts channel data, filters channels based on performance metrics, and saves the results into Google S

Google Sheets, @Apify/N8N Nodes Apify, HTTP Request