AutomationFlowsAI & RAG › Post Curated Remote Job Listings to Slack with Browseract and Openrouter

Post Curated Remote Job Listings to Slack with Browseract and Openrouter

ByMadame AI Team | Kai @madame-ai on n8n.io

This workflow acts as an intelligent job board curator for your Slack community. It scrapes multiple sources (e.g., Dice, Indeed), uses AI to filter out spam and low-quality listings based on your specific profile, formats the best jobs into professional posts, and publishes…

Cron / scheduled trigger★★★★☆ complexityAI-powered14 nodesOutput Parser StructuredOpenRouter ChatN8N Nodes BrowseractAgentSlack
AI & RAG Trigger: Cron / scheduled Nodes: 14 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → OpenRouter Chat 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": "bDaYaVcMslvkL2Ri",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Auto-post curated remote jobs to Slack with BrowserAct and OpenRouter",
  "tags": [],
  "nodes": [
    {
      "id": "4255a7a9-6af3-4ce2-93aa-1ccbc79ee44a",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        336,
        144
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "bf053e7a-4987-4d0e-85e8-1f6fd9850a8b",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        864,
        208
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "{\n  \"slack_message\": [\n    \"\ud83d\ude80 *Job Analysis Report:.............. \",\n    \"*2. Software Engineer (.Net) ............\"\n  ]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "922cf6a8-fcec-4fd6-a5bd-6ce8a3213f18",
      "name": "OpenRouter Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        736,
        208
      ],
      "parameters": {
        "model": "openai/gpt-4o",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5ed098cb-9ba8-4ccd-937a-05dc18341061",
      "name": "Weekly Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -480,
        144
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtHour": 12
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "9688f765-dda2-4ab2-86b2-f049abdd1aed",
      "name": "Add a Resume",
      "type": "n8n-nodes-base.set",
      "position": [
        -256,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f0cd1106-d31c-4f7a-a9ae-3fc3a9b6be9e",
              "name": "Location",
              "type": "string",
              "value": "New York"
            },
            {
              "id": "d9c35ef6-517d-4641-ae36-14403b28e3dd",
              "name": "Skill",
              "type": "string",
              "value": "Software Engineer"
            },
            {
              "id": "46adee08-70e4-4624-9b35-12a1a0635a2b",
              "name": "Income",
              "type": "string",
              "value": "higher than 100$/M"
            },
            {
              "id": "36be219b-2723-4e71-a120-f0666964b910",
              "name": "Details",
              "type": "string",
              "value": "I prefer a remote position, but I am open to working on-site as well. My core strengths include analytical thinking, communication, and the ability to multi-task. Additionally, I am skilled in Frontend and Backend development."
            },
            {
              "id": "938a14ce-a99e-4c68-a5c3-a803146a6805",
              "name": "Target_Sites",
              "type": "array",
              "value": "[\"https://www.dice.com/\" , \"https://indeed.com/\"]"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "3ec84280-23dc-4a3a-a0c7-fba3399aa39f",
      "name": "Split out target sites",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -32,
        144
      ],
      "parameters": {
        "include": "allOtherFields",
        "options": {},
        "fieldToSplitOut": "Target_Sites"
      },
      "typeVersion": 1
    },
    {
      "id": "3887ffe9-0e74-482a-8e91-1f84bfa9be2b",
      "name": "Scrape Suitable Jobs",
      "type": "n8n-nodes-browseract.browserAct",
      "position": [
        608,
        32
      ],
      "parameters": {
        "type": "WORKFLOW",
        "workflowId": "766193817+1234567890",
        "workflowConfig": {
          "value": {
            "input-Skill": "={{ $json.Skill }}",
            "input-Job_Site": "={{ $json.Target_Sites }}",
            "input-Location": "={{ $json.Location }}"
          },
          "schema": [
            {
              "id": "input-Job_Site",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "description": "If left blank, the default value defined in BrowserAct will be used.",
              "displayName": "Job_Site",
              "defaultMatch": true
            },
            {
              "id": "input-Location",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "description": "If left blank, the default value defined in BrowserAct will be used.",
              "displayName": "Location",
              "defaultMatch": true
            },
            {
              "id": "input-Skill",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "description": "If left blank, the default value defined in BrowserAct will be used.",
              "displayName": "Skill",
              "defaultMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "input-Skill"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "credentials": {
        "browserActApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8fb9c677-3083-4a90-aa28-6716bb8d82d4",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1104,
        32
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "output.slack_message"
      },
      "typeVersion": 1
    },
    {
      "id": "a4009546-8b50-4809-bc97-aaceceacd4ad",
      "name": "Analyze the jobs and generate a Slack message",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        784,
        32
      ],
      "parameters": {
        "text": "=User Data =\n[\nLocation : {{ $('Loop Over Items').first().json.Location }},\nSkill: {{ $('Loop Over Items').first().json.Skill }},\nSalary :{{ $('Loop Over Items').first().json.Income }},\nDetails : {{ $('Loop Over Items').first().json.Details }},\n].\nScraped Data = [\n{{ $('Loop Over Items').first().json.Target_Sites }},\n{{ $json.output.string }}\n]",
        "options": {
          "systemMessage": "You are an expert AI Career Concierge and Data Analyst. Your goal is to analyze a raw JSON list of job postings against specific user criteria (Location, Salary, Skills, Preferences) and generate a structured Slack response.\n\nInput Data:\n\nJob Data: A JSON list of job objects.\n\nUser Criteria: Location, Target Title, Salary, Target Site, and Personal Details.\n\nProcessing Logic:\n\nNormalization & Matching:\n\nSalary: Standardize inputs (e.g., \"$100/M\") to annual/hourly rates for comparison. Prioritize jobs meeting the minimum threshold.\n\nLocation: Prioritize exact matches. If the user is open to \"Remote,\" include those regardless of specific city. If the input data location (e.g., Netherlands) does not match the user location (e.g., New York), select the best technical matches but add a disclaimer.\n\nSkills: Score jobs based on keyword overlap (e.g., \"Full Stack\", \"C#\", \"Analytical\").\n\nDrafting the Content:\n\nIdentify the top 2-3 matches.\n\nFormat the text for Slack using mrkdwn (bolding, emojis, lists).\n\nChunking: Divide the final message into logical blocks (e.g., Header + Job 1 in the first block, Job 2 + Job 3 + Footer in the second block) to ensure no single string is too large.\n\nOutput Format (Strict JSON): You must output a single valid JSON object. The key slack_message must be an Array of Strings.\n\nIf the content is short, the array may contain 1 string.\n\nIf the content is long (multiple jobs), split it into 2 or more strings within the array.\n\nJSON\n{\n  \"slack_message\": [\n    \"String 1: Header and first job match...\",\n    \"String 2: Second job match and footer...\"\n  ]\n}\nFormatting Rules:\n\nHeader: Start with a summary (e.g., \"\ud83d\ude80 Matches Found\").\n\nJob Blocks: Use this format:\n\nJob Title @ Company\n\n\ud83d\udccd Location | \ud83d\udcb0 Salary\n\nWhy it fits: [Analysis of skill/preference match]\n\nFooter: Include a Next Step or link to the Target Site."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "e6c1ebc9-d821-4675-89ff-638b7848bf64",
      "name": "Send a message to the Slack channel",
      "type": "n8n-nodes-base.slack",
      "position": [
        1328,
        144
      ],
      "parameters": {
        "text": "={{ $json[\"output.slack_message\"] }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KLV9DJSX",
          "cachedResultName": "all-browseract-workflow-test"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "b4c0edb4-f762-47ee-8a92-ec16b15ffc0f",
      "name": "Documentation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -960,
        -448
      ],
      "parameters": {
        "width": 450,
        "height": 560,
        "content": "## \u26a1 Workflow Overview & Setup\n\n**Summary:** This automation acts as your personal AI headhunter. It runs weekly to scrape job boards (Dice, Indeed) based on your specific criteria, uses AI to analyze and score the listings against your resume, and delivers a curated digest to Slack.\n\n\n\n### Requirements\n* **Credentials:** BrowserAct, OpenRouter (GPT-4), Slack.\n* **Mandatory:** BrowserAct API (Template: **Job Board Aggregator**)\n\n### How to Use\n1.  **Credentials:** Set up API keys for BrowserAct, OpenRouter, and Slack.\n2.  **Configuration:** Update the **Job Board Aggregator** node with your target `Location`, `Skill`, `Income`, and `Details`.\n3.  **Target Sites:** You can add or remove URLs from the `Target_Sites` array in the same node.\n\n### Need Help?\n[How to Find Your BrowserAct API Key & Workflow ID](https://docs.browseract.com)\n[How to Connect n8n to BrowserAct](https://docs.browseract.com)\n[How to Use & Customize BrowserAct Templates](https://docs.browseract.com)"
      },
      "typeVersion": 1
    },
    {
      "id": "d52034a9-a1bd-432b-ae53-396815113cf4",
      "name": "Step 1 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -480,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 652,
        "height": 140,
        "content": "### \ud83c\udfaf Step 1: User Profile & Targeting\n\nThe workflow begins by defining your search parameters. \n\nThe **Add a Resume** node acts as a configuration file, storing your bio, salary expectations, and the list of job boards to monitor."
      },
      "typeVersion": 1
    },
    {
      "id": "7338eaf0-505c-4ba2-8c51-3abb73aaec94",
      "name": "Step 2 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        -144
      ],
      "parameters": {
        "color": 7,
        "width": 1164,
        "height": 124,
        "content": "### \ud83d\udd75\ufe0f Step 2: Intelligent Scraping & AI Matching & Filtering\n\nBrowserAct iterates through your target sites. \nIt executes a specialized scraping template to extract relevant job titles, descriptions, and salary ranges from each platform. An AI agent analyzes the raw job data against your personal profile. It filters out low-quality matches, normalizes salary data (e.g., converting hourly to annual), and scores the relevance of each role."
      },
      "typeVersion": 1
    },
    {
      "id": "0749a148-88c4-42b7-8ca2-74319f16fb87",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -480,
        -448
      ],
      "parameters": {
        "color": 6,
        "width": 656,
        "height": 384,
        "content": "@[youtube](IvgBQfmvDNI)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "3c7a6faa-59d4-470c-98a0-ee240627a285",
  "connections": {
    "Split Out": {
      "main": [
        [
          {
            "node": "Send a message to the Slack channel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add a Resume": {
      "main": [
        [
          {
            "node": "Split out target sites",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Weekly Trigger": {
      "main": [
        [
          {
            "node": "Add a Resume",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Scrape Suitable Jobs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Suitable Jobs": {
      "main": [
        [
          {
            "node": "Analyze the jobs and generate a Slack message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Analyze the jobs and generate a Slack message",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Structured Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Split out target sites": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Analyze the jobs and generate a Slack message",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Send a message to the Slack channel": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze the jobs and generate a Slack message": {
      "main": [
        [
          {
            "node": "Split Out",
            "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 acts as an intelligent job board curator for your Slack community. It scrapes multiple sources (e.g., Dice, Indeed), uses AI to filter out spam and low-quality listings based on your specific profile, formats the best jobs into professional posts, and publishes…

Source: https://n8n.io/workflows/13382/ — 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 workflow automates the discovery of new B2B service providers entering the market. It scrapes a specific category on Clutch.co weekly, standardizes the data using AI, and compares it against a hi

Output Parser Structured, OpenRouter Chat, Google Sheets +3
AI & RAG

This workflow automates competitive intelligence by continuously monitoring competitor websites for pricing and feature updates. It scrapes current data using BrowserAct, compares it against historica

Google Sheets, N8N Nodes Browseract, Agent +3
AI & RAG

This workflow automates Generative Engine Optimization (GEO) tracking by monitoring how your company appears in AI search results. It generates strategic queries, simulates searches on AI engines like

OpenRouter Chat, Output Parser Structured, Google Sheets +3
AI & RAG

This workflow automates the process of market research by generating high-quality, curated digests of Medium articles for specific topics. It scrapes recent content, uses AI to filter out spam and dup

Output Parser Structured, OpenRouter Chat, Agent +3
AI & RAG

This workflow acts as an automated marketing analyst. It runs weekly to scrape competitor landing pages, compare them against historical data to detect changes in pricing, messaging, or offers, and de

OpenRouter Chat, Output Parser Structured, Slack +3