{"id":505,"date":"2025-10-28T16:57:10","date_gmt":"2025-10-28T23:57:10","guid":{"rendered":"https:\/\/simpkins.social\/cliff\/?p=505"},"modified":"2025-10-30T13:44:47","modified_gmt":"2025-10-30T20:44:47","slug":"how-to-use-n8n-to-search-job-boards","status":"publish","type":"post","link":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/","title":{"rendered":"How to use n8n to Search Job Boards"},"content":{"rendered":"\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-9d6595d7 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\" style=\"flex-basis:70%\">\n<p>After several months of frustration searching for new job postings &#8211; I started using n8n to search the job boards. This post focuses on how it&#8217;s built, and links to other posts for more information.<\/p>\n\n\n\n<p>My job search agent uses the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An <strong><a href=\"https:\/\/n8n.io\/\">n8n workflow<\/a> <\/strong>drives the logic &#8211; I host this via Docker on my Synology NAS, but this works just as well hosted on n8n.io<\/li>\n\n\n\n<li><strong>PostgreSQL <\/strong>stores the data, but I&#8217;ve also used Airtable successfully <\/li>\n\n\n\n<li><strong><a href=\"https:\/\/console.cloud.google.com\/apis\/library\/customsearch.googleapis.com\">Google Custom Search<\/a><\/strong> and <strong>Brave Search<\/strong> returns the latest jobs<\/li>\n\n\n\n<li><strong>Claude <\/strong>is my career coach, evaluating whether job postings fit in with my career aspirations and flagging the best fits<\/li>\n<\/ul>\n<\/div>\n\n\n\n<div class=\"wp-block-column has-very-light-gray-to-cyan-bluish-gray-gradient-background has-background is-layout-flow wp-block-column-is-layout-flow\" style=\"padding-top:var(--wp--preset--spacing--60);padding-right:var(--wp--preset--spacing--50);padding-bottom:var(--wp--preset--spacing--60);padding-left:var(--wp--preset--spacing--50);flex-basis:30%\">\n<p>GitHub: <a href=\"https:\/\/github.com\/cliff-simpkins\/blog-content\/tree\/main\/n8n-job-boards\">Source code<\/a><\/p>\n\n\n\n<p><em><strong>Related blog posts<\/strong><\/em><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/simpkins.social\/cliff\/blog\/2025\/08\/21\/building-an-ai-job-search-agent-with-n8n\/\">Designing an AI Job Search Agent in n8n<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/14\/how-to-use-claude-in-a-job-search\/\">Using an LLM as a career coach and resume editor<\/a><\/li>\n<\/ul>\n<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">My n8n Workflows<\/h3>\n\n\n\n<p>I use six (6) n8n workflows to provide a solid level of logical abstraction. I originally did this in one workflow, but quickly realized that it yielded duplicate code and functionality.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignright size-medium\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"225\" src=\"https:\/\/i0.wp.com\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/image-21.png?resize=300%2C225&#038;ssl=1\" alt=\"\" class=\"wp-image-521\" srcset=\"https:\/\/i0.wp.com\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/image-21.png?resize=300%2C225&amp;ssl=1 300w, https:\/\/i0.wp.com\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/image-21.png?w=622&amp;ssl=1 622w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/figure>\n<\/div>\n\n\n<p>The workflows are as follows:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The <code>Job Search Workflow<\/code> is the primary driver and triggers every morning.<\/li>\n\n\n\n<li>I have two workflows that <code>Retrieve [Search] Results<\/code>, one configured for Google Search and one for Brave Search. This stores the search engine specific search query and branches out the calls to the job boards of interest (currently four).<\/li>\n\n\n\n<li>I have two workflows that <code>Run [Search Engine] Search<\/code>, one per search engine. This one handles the search-engine specific process to retrieve all pages of relevant results.<\/li>\n\n\n\n<li>Lastly, Process JD Search Result takes the job posting URL and analyzes it &#8211; normalizing up the URL, retrieving the job posting, and calling the LLM to analyze it.<\/li>\n<\/ol>\n\n\n\n<p><em>Each <a href=\"https:\/\/github.com\/cliff-simpkins\/blog-content\/tree\/main\/n8n-job-boards\">workflow is available on GitHub<\/a>, but the JSON is also embedded below. The embedded JSON is interactive to enable exploration without installing n8n &#8211; you can zoom in\/out, view the properties for standard n8n nodes, and you can Copy\/Paste the workflow JSON by selecting the nodes you want to copy (or select all) and copy them to your clipboard.<\/em><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Primary Workflow: &#8216;Job Search Workflow&#8217;<\/h4>\n\n\n\n<p>The primary workflow is straightforward:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>It retrieves a list of previously processed JDs from the data store<\/li>\n\n\n\n<li>It queries the job boards using Google Search and Brave Search by calling the relevant sub-workflows<\/li>\n\n\n\n<li>It merges the search results together and uses the Combine node to remove previously processed results (see my <a href=\"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/20\/how-to-bulk-validate-airtable-data-to-save-api-checks\/\">How to bulk validate data to save API checks<\/a> post)<\/li>\n\n\n\n<li>It then iterates over the remaining search results using the &#8216;Process JD Search Result&#8217; sub-workflow<\/li>\n\n\n\n<li>Once done, it uses Gmail to send an email summary of the run<\/li>\n<\/ol>\n\n\n<script type=\"module\" src=\"https:\/\/cdn.jsdelivr.net\/npm\/@n8n_io\/n8n-demo-component\/n8n-demo.bundled.js\"><\/script>\r\n    <script type=\"application\/json\" id=\"workflow-json-69f182da85e36\">\r\n{\n  \"nodes\": [\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.manualTrigger\",\n      \"typeVersion\": 1,\n      \"position\": [\n        -816,\n        416\n      ],\n      \"id\": \"34b0eeac-b71f-4466-8031-6c6b197c880b\",\n      \"name\": \"When clicking \u2018Execute workflow\u2019\"\n    },\n    {\n      \"parameters\": {\n        \"options\": {\n          \"reset\": false\n        }\n      },\n      \"type\": \"n8n-nodes-base.splitInBatches\",\n      \"typeVersion\": 3,\n      \"position\": [\n        464,\n        592\n      ],\n      \"id\": \"635cd79c-33cc-41b2-95a7-fdfcc40b46a7\",\n      \"name\": \"Loop Over Posts1\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"8cf7f2cb-bc9e-49c9-93b4-6e3a63da6a32\",\n              \"name\": \"Existing\",\n              \"value\": \"={{ $('Call \\\\'Sub WF- Process JD Search Result\\\\'').item.json.ExistingFound ? $json.Existing + 1 : $json.Existing }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"af7b1f54-5dce-4be0-a97b-15a31ff94c49\",\n              \"name\": \"Adds\",\n              \"value\": \"={{ $('Call \\\\'Sub WF- Process JD Search Result\\\\'').item.json.NewAdded ? $json.Adds + 1 : $json.Adds }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"6e83a6cb-817e-4a62-a27c-2b47e8b98874\",\n              \"name\": \"InputTokens\",\n              \"value\": \"={{ $('Call \\\\'Sub WF- Process JD Search Result\\\\'').item.json.InputTokensUsed > 0 ? $json.InputTokens + $('Call \\\\'Sub WF- Process JD Search Result\\\\'').item.json.InputTokensUsed : $json.InputTokens }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"acba6faa-2e84-4c75-adf8-1bc3c168f574\",\n              \"name\": \"OutputTokens\",\n              \"value\": \"={{ $('Call \\\\'Sub WF- Process JD Search Result\\\\'').item.json.OutputTokensUsed > 0 ? $json.OutputTokens + $('Call \\\\'Sub WF- Process JD Search Result\\\\'').item.json.OutputTokensUsed : $json.OutputTokens }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"607d8e54-e592-4932-a760-f8cb8200be44\",\n              \"name\": \"NewRoles\",\n              \"value\": \"={{ $('Call \\\\'Sub WF- Process JD Search Result\\\\'').item.json.NewAdded ? $json.NewRoles + \\\"<li>\\\" + $('Call \\\\'Sub WF- Process JD Search Result\\\\'').item.json.AddedPosting : $json.NewRoles }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        960,\n        672\n      ],\n      \"id\": \"ee92e5e8-f233-4235-8fae-d7537a0820e5\",\n      \"name\": \"TallyExecutions\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"8cf7f2cb-bc9e-49c9-93b4-6e3a63da6a32\",\n              \"name\": \"Existing\",\n              \"value\": \"={{ ($('TallyExecutions').isExecuted) ? $('TallyExecutions').first().json.Existing : 0 }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"af7b1f54-5dce-4be0-a97b-15a31ff94c49\",\n              \"name\": \"Adds\",\n              \"value\": \"={{ ($('TallyExecutions').isExecuted) ? $('TallyExecutions').first().json.Adds : 0 }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"6e83a6cb-817e-4a62-a27c-2b47e8b98874\",\n              \"name\": \"InputTokens\",\n              \"value\": \"={{ ($('TallyExecutions').isExecuted) ? $('TallyExecutions').first().json.InputTokens : 0 }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"acba6faa-2e84-4c75-adf8-1bc3c168f574\",\n              \"name\": \"OutputTokens\",\n              \"value\": \"={{ ($('TallyExecutions').isExecuted) ? $('TallyExecutions').first().json.OutputTokens : 0 }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"607d8e54-e592-4932-a760-f8cb8200be44\",\n              \"name\": \"NewRoles\",\n              \"value\": \"={{ ($('TallyExecutions').isExecuted) ? $('TallyExecutions').first().json.NewRoles : \\\"\\\" }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        800,\n        672\n      ],\n      \"id\": \"27f8310d-1590-4de3-bc02-799aa611bd87\",\n      \"name\": \"SyncStats\"\n    },\n    {\n      \"parameters\": {\n        \"sendTo\": \"youremail@address\",\n        \"subject\": \"=[n8n] - Job search agent results - {{ $('TallyExecutions').first().json.Adds }} new jobs processed\",\n        \"message\": \"=We successfully ran the job agent using your Job Search Agent:\\n<ul>\\n<li> {{ $('TallyExecutions').first().json.Existing + $('TallyExecutions').first().json.Adds}} total web results found via web searches\\n<li> {{ $('TallyExecutions').first().json.Adds }} new results added; {{ $('TallyExecutions').first().json.Existing }} existing results skipped\\n<\/ul>\\n\\n{{ $('TallyExecutions').first().json.NewRoles.length > 0 ? \\\"<p>New Job Postings Found:<ul>\\\" + $('TallyExecutions').first().json.NewRoles + \\\"<\/ul>\\\" : \\\"\\\" }}\\n\\n<p>Your token consumption for today's search: \\n<ul>\\n<li>{{ $('TallyExecutions').first().json.InputTokens }} input tokens\\n<li>{{ $('TallyExecutions').first().json.OutputTokens }} output tokens\\n<\/ul>\\n\\n<p>Cheers and happy hunting!\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.gmail\",\n      \"typeVersion\": 2.1,\n      \"position\": [\n        960,\n        496\n      ],\n      \"id\": \"09b61145-fdb1-436f-987d-3b376bfcef70\",\n      \"name\": \"Send a message\",\n      \"webhookId\": \"998aba5d-979d-4715-b851-65e6be1b3354\",\n      \"executeOnce\": true,\n      \"credentials\": {\n        \"gmailOAuth2\": {\n          \"id\": \"VcDQXmZqPVph8zK8\",\n          \"name\": \"Gmail account\"\n        }\n      }\n    },\n    {\n      \"parameters\": {\n        \"rule\": {\n          \"interval\": [\n            {\n              \"triggerAtHour\": 7\n            }\n          ]\n        }\n      },\n      \"type\": \"n8n-nodes-base.scheduleTrigger\",\n      \"typeVersion\": 1.2,\n      \"position\": [\n        -816,\n        672\n      ],\n      \"id\": \"316e480a-d0c0-4f97-9e46-489b42deba50\",\n      \"name\": \"Schedule Trigger\"\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.noOp\",\n      \"typeVersion\": 1,\n      \"position\": [\n        -640,\n        560\n      ],\n      \"id\": \"5e2db03b-1bea-4da3-8d97-39a40fc9d91a\",\n      \"name\": \"No Operation, do nothing2\"\n    },\n    {\n      \"parameters\": {\n        \"mode\": \"combine\",\n        \"advanced\": true,\n        \"mergeByFields\": {\n          \"values\": [\n            {\n              \"field1\": \"link\",\n              \"field2\": \"job_description_link\"\n            }\n          ]\n        },\n        \"joinMode\": \"keepNonMatches\",\n        \"outputDataFrom\": \"input1\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.merge\",\n      \"typeVersion\": 3.2,\n      \"position\": [\n        -160,\n        384\n      ],\n      \"id\": \"d9650dc6-9a7c-4126-b370-2fd3d0e7702e\",\n      \"name\": \"Filter Prior Google JDs\",\n      \"alwaysOutputData\": true\n    },\n    {\n      \"parameters\": {\n        \"mode\": \"combine\",\n        \"advanced\": true,\n        \"mergeByFields\": {\n          \"values\": [\n            {\n              \"field1\": \"job_description_link\",\n              \"field2\": \"url\"\n            }\n          ]\n        },\n        \"joinMode\": \"keepNonMatches\",\n        \"outputDataFrom\": \"input2\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.merge\",\n      \"typeVersion\": 3.2,\n      \"position\": [\n        -160,\n        720\n      ],\n      \"id\": \"8a29200e-d0e1-4ee6-852b-1f0f3b8f51cd\",\n      \"name\": \"Filter Prior Brave JDs\",\n      \"alwaysOutputData\": true\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.merge\",\n      \"typeVersion\": 3.2,\n      \"position\": [\n        256,\n        592\n      ],\n      \"id\": \"ccf45312-d636-44ec-b2ed-daa640f32504\",\n      \"name\": \"Merge JDs\"\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"nkMxxECtkSA7OT6w\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/nkMxxECtkSA7OT6w\",\n          \"cachedResultName\": \"Sub WF- Process JD Search Result\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"url\": \"={{ $input.item.json.hasField('link') ? $json.link : $input.item.json.hasField('url') ? $json.url : \\\"unknown\\\" }}\",\n            \"pageTitle\": \"={{ $input.item.json.hasField('title') ? $json.title :  \\\"unknown\\\" }}\",\n            \"pageDescr\": \"={{ $input.item.json.hasField('snippet') ? $json.snippet : $input.item.json.hasField('description') ? $json.description : \\\"unknown\\\" }}\"\n          },\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"url\",\n              \"displayName\": \"url\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\"\n            },\n            {\n              \"id\": \"pageTitle\",\n              \"displayName\": \"pageTitle\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\"\n            },\n            {\n              \"id\": \"pageDescr\",\n              \"displayName\": \"pageDescr\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\"\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {\n          \"waitForSubWorkflow\": true\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.2,\n      \"position\": [\n        640,\n        672\n      ],\n      \"id\": \"9efe49c2-ca16-4fd9-90df-c081eeec51d5\",\n      \"name\": \"Call 'Sub WF- Process JD Search Result'\",\n      \"alwaysOutputData\": true,\n      \"onError\": \"continueRegularOutput\"\n    },\n    {\n      \"parameters\": {\n        \"mode\": \"combine\",\n        \"advanced\": true,\n        \"mergeByFields\": {\n          \"values\": [\n            {\n              \"field1\": \"link\",\n              \"field2\": \"normalized_url\"\n            }\n          ]\n        },\n        \"joinMode\": \"keepNonMatches\",\n        \"outputDataFrom\": \"input1\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.merge\",\n      \"typeVersion\": 3.2,\n      \"position\": [\n        48,\n        496\n      ],\n      \"id\": \"4fa8b2ca-6ee0-4a28-8b33-40599afc3c72\",\n      \"name\": \"Filter Prior Google JDs1\",\n      \"alwaysOutputData\": true\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"vlBHF9gQarpVFiAW\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/vlBHF9gQarpVFiAW\",\n          \"cachedResultName\": \"Sub WF- Retrieve Google Results\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {},\n          \"matchingColumns\": [\n            \"noop\"\n          ],\n          \"schema\": [\n            {\n              \"id\": \"noop\",\n              \"displayName\": \"noop\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        -400,\n        368\n      ],\n      \"id\": \"d12ebb3b-a1ba-4dd3-a505-d0cf5e476b9e\",\n      \"name\": \"Retrieve Google Results\"\n    },\n    {\n      \"parameters\": {\n        \"mode\": \"combine\",\n        \"advanced\": true,\n        \"mergeByFields\": {\n          \"values\": [\n            {\n              \"field1\": \"normalized_url\",\n              \"field2\": \"url\"\n            }\n          ]\n        },\n        \"joinMode\": \"keepNonMatches\",\n        \"outputDataFrom\": \"input2\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.merge\",\n      \"typeVersion\": 3.2,\n      \"position\": [\n        48,\n        672\n      ],\n      \"id\": \"c9f4600a-9557-4944-9dda-606fdd6d3db5\",\n      \"name\": \"Filter Prior Brave JDs1\",\n      \"alwaysOutputData\": true\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"dKUB9CouRHXP59Vi\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/dKUB9CouRHXP59Vi\",\n          \"cachedResultName\": \"Sub WF - Retrieve Brave Results\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {},\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"noop\",\n              \"displayName\": \"noop\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        -400,\n        736\n      ],\n      \"id\": \"75f0a9fc-b877-4f43-b8e7-e6727eb798fb\",\n      \"name\": \"Retrieve Brave Results\",\n      \"alwaysOutputData\": true\n    },\n    {\n      \"parameters\": {\n        \"operation\": \"select\",\n        \"schema\": {\n          \"__rl\": true,\n          \"value\": \"public\",\n          \"mode\": \"list\",\n          \"cachedResultName\": \"public\"\n        },\n        \"table\": {\n          \"__rl\": true,\n          \"value\": \"applications\",\n          \"mode\": \"list\",\n          \"cachedResultName\": \"applications\"\n        },\n        \"returnAll\": true,\n        \"options\": {\n          \"outputColumns\": [\n            \"job_description_link\",\n            \"normalized_url\"\n          ]\n        }\n      },\n      \"type\": \"n8n-nodes-base.postgres\",\n      \"typeVersion\": 2.6,\n      \"position\": [\n        -400,\n        560\n      ],\n      \"id\": \"a5d709af-cb96-4528-bca3-2817cbe4ea5b\",\n      \"name\": \"Retrieve Prior JDs\",\n      \"alwaysOutputData\": true,\n      \"credentials\": {\n        \"postgres\": {\n          \"id\": \"C7c4IpIHOXEL7fNA\",\n          \"name\": \"Postgres account\"\n        }\n      }\n    }\n  ],\n  \"connections\": {\n    \"When clicking \u2018Execute workflow\u2019\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"No Operation, do nothing2\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Loop Over Posts1\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Send a message\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ],\n        [\n          {\n            \"node\": \"Call 'Sub WF- Process JD Search Result'\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"TallyExecutions\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Loop Over Posts1\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"SyncStats\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"TallyExecutions\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Schedule Trigger\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"No Operation, do nothing2\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"No Operation, do nothing2\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Retrieve Google Results\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Retrieve Prior JDs\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Retrieve Brave Results\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Filter Prior Google JDs\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Filter Prior Google JDs1\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Filter Prior Brave JDs\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Filter Prior Brave JDs1\",\n            \"type\": \"main\",\n            \"index\": 1\n          }\n        ]\n      ]\n    },\n    \"Merge JDs\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Loop Over Posts1\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Call 'Sub WF- Process JD Search Result'\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"SyncStats\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Filter Prior Google JDs1\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge JDs\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Retrieve Google Results\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Filter Prior Google JDs\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Filter Prior Brave JDs1\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge JDs\",\n            \"type\": \"main\",\n            \"index\": 1\n          }\n        ]\n      ]\n    },\n    \"Retrieve Brave Results\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Filter Prior Brave JDs\",\n            \"type\": \"main\",\n            \"index\": 1\n          }\n        ]\n      ]\n    },\n    \"Retrieve Prior JDs\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Filter Prior Google JDs1\",\n            \"type\": \"main\",\n            \"index\": 1\n          },\n          {\n            \"node\": \"Filter Prior Brave JDs1\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Filter Prior Brave JDs\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Filter Prior Google JDs\",\n            \"type\": \"main\",\n            \"index\": 1\n          }\n        ]\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"templateCredsSetupCompleted\": true,\n    \"instanceId\": \"0bae1fab76f5b3d7d761d2213eecaaf39f2590bd0b5cd104d1482f6fd0bab96b\"\n  }\n}\r\n    <\/script>\r\n    \r\n    <n8n-demo id=\"workflow-demo-69f182da85e38\"><\/n8n-demo>\r\n    \r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function() {\r\n        const jsonElement = document.getElementById(\"workflow-json-69f182da85e36\");\r\n        const workflowElement = document.getElementById(\"workflow-demo-69f182da85e38\");\r\n        \r\n        if (jsonElement && workflowElement) {\r\n            const workflowData = jsonElement.textContent.trim();\r\n            workflowElement.setAttribute(\"workflow\", workflowData);\r\n        }\r\n    });\r\n    <\/script>\n\n\n<h4 class=\"wp-block-heading\">Sub-workflow: &#8216;Retrieve [Google | Brave] Results &#8216;<\/h4>\n\n\n\n<p>The first sub-workflows that we call retrieve the search results from Google and Brave. And I have one sub-workflow for each search engine, primarily because the search query strings are different between them, but also because I originally used different search engines with different job boards.<\/p>\n\n\n\n<p>The workflows abstract the calls to <em>n<\/em> job boards: (a) they simplify the primary workflow, (b) enable me to set a search string in one place, and (c) make it easy to add additional job boards later.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Retrieve Google Results<\/h5>\n\n\n\r\n    <script type=\"application\/json\" id=\"workflow-json-69f182da85f47\">\r\n{\n  \"nodes\": [\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.manualTrigger\",\n      \"typeVersion\": 1,\n      \"position\": [\n        -752,\n        192\n      ],\n      \"id\": \"1f15daeb-fe72-4262-98b5-351f26aee6c7\",\n      \"name\": \"Manual Trigger\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"requestId\",\n              \"name\": \"query\",\n              \"value\": \"YourSearchString\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        -496,\n        48\n      ],\n      \"id\": \"677fc943-7daf-48ca-95e5-632f3e311a78\",\n      \"name\": \"Set Search Parameters\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"searchResults\",\n              \"name\": \"searchResults\",\n              \"value\": \"={{ $json.allResults }}\",\n              \"type\": \"array\"\n            },\n            {\n              \"id\": \"resultCount\",\n              \"name\": \"resultCount\",\n              \"value\": \"={{ $json.allResults.length }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"searchSummary\",\n              \"name\": \"searchSummary\",\n              \"value\": \"={{ $json.searchSummary }}\",\n              \"type\": \"object\"\n            },\n            {\n              \"id\": \"siteSearched\",\n              \"name\": \"siteSearched\",\n              \"value\": \"={{ $json.siteSearch }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        320,\n        -288\n      ],\n      \"id\": \"f7392454-5a98-4a65-a9d5-622247fcbb37\",\n      \"name\": \"Process Search Results\"\n    },\n    {\n      \"parameters\": {\n        \"fieldToSplitOut\": \"searchResults\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.splitOut\",\n      \"typeVersion\": 1,\n      \"position\": [\n        544,\n        -288\n      ],\n      \"id\": \"6c7c0a11-b26d-4719-8ab7-29255c70b0ca\",\n      \"name\": \"Split Individual Results\"\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"aQ1WS84f3zOKjFUD\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/aQ1WS84f3zOKjFUD\",\n          \"cachedResultName\": \"Sub WF - Run Google Search Query\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"siteSearch\": \"greenhouse.io\",\n            \"query\": \"={{ $json.query }}\"\n          },\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"siteSearch\",\n              \"displayName\": \"siteSearch\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            },\n            {\n              \"id\": \"query\",\n              \"displayName\": \"query\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {\n          \"waitForSubWorkflow\": true\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        96,\n        -288\n      ],\n      \"id\": \"69e3be04-514c-4721-a579-5a6ed4ad00fb\",\n      \"name\": \"Search - Greenhouse\"\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.wait\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -112,\n        -64\n      ],\n      \"id\": \"020004b6-2c9c-424d-8034-1ff77699c1dc\",\n      \"name\": \"Ashby Pause\",\n      \"webhookId\": \"c1ece2a1-d719-4633-b5f4-23396f6424eb\"\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.wait\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -112,\n        128\n      ],\n      \"id\": \"e79e4b29-9345-48ee-acd3-717ad02bc0c7\",\n      \"name\": \"Lever Pause\",\n      \"webhookId\": \"c1ece2a1-d719-4633-b5f4-23396f6424eb\"\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.wait\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -112,\n        304\n      ],\n      \"id\": \"c2159fa5-496c-40cc-9cd9-0bc38635f4cb\",\n      \"name\": \"Workday Pause\",\n      \"webhookId\": \"c1ece2a1-d719-4633-b5f4-23396f6424eb\"\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"aQ1WS84f3zOKjFUD\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/aQ1WS84f3zOKjFUD\",\n          \"cachedResultName\": \"Sub WF - Run Google Search Query\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"siteSearch\": \"ashbyhq.com\",\n            \"query\": \"={{ $json.query }}\"\n          },\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"siteSearch\",\n              \"displayName\": \"siteSearch\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            },\n            {\n              \"id\": \"query\",\n              \"displayName\": \"query\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {\n          \"waitForSubWorkflow\": true\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        96,\n        -64\n      ],\n      \"id\": \"4f760766-f6e9-4746-b388-ae4ffd139fca\",\n      \"name\": \"Search - Ashby\"\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"aQ1WS84f3zOKjFUD\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/aQ1WS84f3zOKjFUD\",\n          \"cachedResultName\": \"Sub WF - Run Google Search Query\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"siteSearch\": \"lever.co\",\n            \"query\": \"={{ $json.query }}\"\n          },\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"siteSearch\",\n              \"displayName\": \"siteSearch\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            },\n            {\n              \"id\": \"query\",\n              \"displayName\": \"query\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {\n          \"waitForSubWorkflow\": true\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        96,\n        128\n      ],\n      \"id\": \"1d2ba3d0-d789-460f-897e-2eeb120dc34c\",\n      \"name\": \"Search - Lever\"\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"aQ1WS84f3zOKjFUD\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/aQ1WS84f3zOKjFUD\",\n          \"cachedResultName\": \"Sub WF - Run Google Search Query\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"siteSearch\": \"myworkdayjobs.com\",\n            \"query\": \"={{ $json.query }}\"\n          },\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"siteSearch\",\n              \"displayName\": \"siteSearch\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            },\n            {\n              \"id\": \"query\",\n              \"displayName\": \"query\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {\n          \"waitForSubWorkflow\": true\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        96,\n        304\n      ],\n      \"id\": \"b03c6f7a-8ee0-4d34-891a-8cabafc1952b\",\n      \"name\": \"Search - Workday\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"searchResults\",\n              \"name\": \"searchResults\",\n              \"value\": \"={{ $json.allResults }}\",\n              \"type\": \"array\"\n            },\n            {\n              \"id\": \"resultCount\",\n              \"name\": \"resultCount\",\n              \"value\": \"={{ $json.allResults.length }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"searchSummary\",\n              \"name\": \"searchSummary\",\n              \"value\": \"={{ $json.searchSummary }}\",\n              \"type\": \"object\"\n            },\n            {\n              \"id\": \"siteSearched\",\n              \"name\": \"siteSearched\",\n              \"value\": \"={{ $json.siteSearch }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        320,\n        -64\n      ],\n      \"id\": \"16fb3c0b-203f-45a0-878a-f4c3c814f8c0\",\n      \"name\": \"Process Search Results1\"\n    },\n    {\n      \"parameters\": {\n        \"fieldToSplitOut\": \"searchResults\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.splitOut\",\n      \"typeVersion\": 1,\n      \"position\": [\n        560,\n        -64\n      ],\n      \"id\": \"93d54ea1-9545-4c4d-85f5-a6e26bd4c2d0\",\n      \"name\": \"Split Individual Results1\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"searchResults\",\n              \"name\": \"searchResults\",\n              \"value\": \"={{ $json.allResults }}\",\n              \"type\": \"array\"\n            },\n            {\n              \"id\": \"resultCount\",\n              \"name\": \"resultCount\",\n              \"value\": \"={{ $json.allResults.length }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"searchSummary\",\n              \"name\": \"searchSummary\",\n              \"value\": \"={{ $json.searchSummary }}\",\n              \"type\": \"object\"\n            },\n            {\n              \"id\": \"siteSearched\",\n              \"name\": \"siteSearched\",\n              \"value\": \"={{ $json.siteSearch }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        320,\n        128\n      ],\n      \"id\": \"41b5c2ce-c406-46bb-a4e3-f49572e44f38\",\n      \"name\": \"Process Search Results2\"\n    },\n    {\n      \"parameters\": {\n        \"fieldToSplitOut\": \"searchResults\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.splitOut\",\n      \"typeVersion\": 1,\n      \"position\": [\n        560,\n        128\n      ],\n      \"id\": \"07a4fa2c-b023-4b43-8923-61bf249082ef\",\n      \"name\": \"Split Individual Results2\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"searchResults\",\n              \"name\": \"searchResults\",\n              \"value\": \"={{ $json.allResults }}\",\n              \"type\": \"array\"\n            },\n            {\n              \"id\": \"resultCount\",\n              \"name\": \"resultCount\",\n              \"value\": \"={{ $json.allResults.length }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"searchSummary\",\n              \"name\": \"searchSummary\",\n              \"value\": \"={{ $json.searchSummary }}\",\n              \"type\": \"object\"\n            },\n            {\n              \"id\": \"siteSearched\",\n              \"name\": \"siteSearched\",\n              \"value\": \"={{ $json.siteSearch }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        320,\n        304\n      ],\n      \"id\": \"0c8fdd78-42f3-4cd6-b5bb-6f136dbbd09b\",\n      \"name\": \"Process Search Results3\"\n    },\n    {\n      \"parameters\": {\n        \"fieldToSplitOut\": \"searchResults\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.splitOut\",\n      \"typeVersion\": 1,\n      \"position\": [\n        560,\n        304\n      ],\n      \"id\": \"43d49557-4cb5-46ed-b0e1-cde631b711f8\",\n      \"name\": \"Split Individual Results3\"\n    },\n    {\n      \"parameters\": {\n        \"numberInputs\": 4\n      },\n      \"type\": \"n8n-nodes-base.merge\",\n      \"typeVersion\": 3.2,\n      \"position\": [\n        864,\n        64\n      ],\n      \"id\": \"6bf4e347-5822-42f5-a662-2e01f39e22eb\",\n      \"name\": \"Merge\"\n    },\n    {\n      \"parameters\": {\n        \"workflowInputs\": {\n          \"values\": [\n            {\n              \"name\": \"noop\"\n            }\n          ]\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflowTrigger\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -720,\n        -144\n      ],\n      \"id\": \"b2bb3a4f-38c6-41cc-a9ad-17e22ecce902\",\n      \"name\": \"When Executed by Another Workflow\"\n    }\n  ],\n  \"connections\": {\n    \"Manual Trigger\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Set Search Parameters\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Set Search Parameters\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Search - Greenhouse\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Ashby Pause\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Lever Pause\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Workday Pause\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Process Search Results\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Split Individual Results\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Split Individual Results\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Search - Greenhouse\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Search Results\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Ashby Pause\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Search - Ashby\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Lever Pause\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Search - Lever\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Workday Pause\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Search - Workday\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Search - Ashby\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Search Results1\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Search - Lever\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Search Results2\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Search - Workday\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Search Results3\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Process Search Results1\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Split Individual Results1\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Split Individual Results1\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge\",\n            \"type\": \"main\",\n            \"index\": 1\n          }\n        ]\n      ]\n    },\n    \"Process Search Results2\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Split Individual Results2\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Split Individual Results2\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge\",\n            \"type\": \"main\",\n            \"index\": 2\n          }\n        ]\n      ]\n    },\n    \"Process Search Results3\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Split Individual Results3\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Split Individual Results3\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge\",\n            \"type\": \"main\",\n            \"index\": 3\n          }\n        ]\n      ]\n    },\n    \"When Executed by Another Workflow\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Set Search Parameters\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"instanceId\": \"0bae1fab76f5b3d7d761d2213eecaaf39f2590bd0b5cd104d1482f6fd0bab96b\"\n  }\n}\r\n    <\/script>\r\n    \r\n    <n8n-demo id=\"workflow-demo-69f182da85f48\"><\/n8n-demo>\r\n    \r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function() {\r\n        const jsonElement = document.getElementById(\"workflow-json-69f182da85f47\");\r\n        const workflowElement = document.getElementById(\"workflow-demo-69f182da85f48\");\r\n        \r\n        if (jsonElement && workflowElement) {\r\n            const workflowData = jsonElement.textContent.trim();\r\n            workflowElement.setAttribute(\"workflow\", workflowData);\r\n        }\r\n    });\r\n    <\/script>\n\n\n<h5 class=\"wp-block-heading\">Retrieve Brave Results<\/h5>\n\n\n\r\n    <script type=\"application\/json\" id=\"workflow-json-69f182da85fbe\">\r\n{\n  \"nodes\": [\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.manualTrigger\",\n      \"typeVersion\": 1,\n      \"position\": [\n        -752,\n        192\n      ],\n      \"id\": \"fe8262a2-9ce3-4b2b-b302-a05d109c2c9b\",\n      \"name\": \"Manual Trigger\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"requestId\",\n              \"name\": \"query\",\n              \"value\": \"Your Search String\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        -496,\n        48\n      ],\n      \"id\": \"1d2a0760-9ad6-4f21-8cd3-476c719f9c40\",\n      \"name\": \"Set Search Parameters\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"searchResults\",\n              \"name\": \"searchResults\",\n              \"value\": \"={{ $json.allResults }}\",\n              \"type\": \"array\"\n            },\n            {\n              \"id\": \"resultCount\",\n              \"name\": \"resultCount\",\n              \"value\": \"={{ $json.allResults.length }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"searchSummary\",\n              \"name\": \"searchSummary\",\n              \"value\": \"={{ $json.searchSummary }}\",\n              \"type\": \"object\"\n            },\n            {\n              \"id\": \"siteSearched\",\n              \"name\": \"siteSearched\",\n              \"value\": \"={{ $json.siteSearch }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        320,\n        -288\n      ],\n      \"id\": \"093abf7f-d137-49e2-9a1f-21c3ec8af9f2\",\n      \"name\": \"Process Search Results\"\n    },\n    {\n      \"parameters\": {\n        \"fieldToSplitOut\": \"searchResults\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.splitOut\",\n      \"typeVersion\": 1,\n      \"position\": [\n        544,\n        -288\n      ],\n      \"id\": \"ab4e61f5-19ae-4c9e-ae35-ba8e95e080bb\",\n      \"name\": \"Split Individual Results\"\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"wPonEanWkKtPqPeR\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/wPonEanWkKtPqPeR\",\n          \"cachedResultName\": \"Sub WF - Run Brave Search Query\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"siteSearch\": \"greenhouse.io\",\n            \"query\": \"={{ $json.query }}\"\n          },\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"siteSearch\",\n              \"displayName\": \"siteSearch\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            },\n            {\n              \"id\": \"query\",\n              \"displayName\": \"query\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {\n          \"waitForSubWorkflow\": true\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        96,\n        -288\n      ],\n      \"id\": \"53a1af8f-e642-4940-91bf-d7eb12e0f759\",\n      \"name\": \"Search - Greenhouse\"\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.wait\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -112,\n        -64\n      ],\n      \"id\": \"05ee48ef-d833-4f64-9026-6dfe4a2d384f\",\n      \"name\": \"Ashby Pause\",\n      \"webhookId\": \"84c832d9-6ca7-4451-901b-38c346337f45\"\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.wait\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -112,\n        128\n      ],\n      \"id\": \"c725325b-d189-466e-8ec5-12a28986162e\",\n      \"name\": \"Lever Pause\",\n      \"webhookId\": \"3159f1e8-83ff-4c57-bafa-0270b8a24e95\"\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.wait\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -112,\n        304\n      ],\n      \"id\": \"583811fc-6c76-4f53-9757-31fa5b2f688a\",\n      \"name\": \"Workday Pause\",\n      \"webhookId\": \"b95f2b40-ba0a-475f-bce7-3bb8f225a0c0\"\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"wPonEanWkKtPqPeR\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/wPonEanWkKtPqPeR\",\n          \"cachedResultName\": \"Sub WF - Run Brave Search Query\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"siteSearch\": \"ashbyhq.com\",\n            \"query\": \"={{ $json.query }}\"\n          },\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"siteSearch\",\n              \"displayName\": \"siteSearch\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            },\n            {\n              \"id\": \"query\",\n              \"displayName\": \"query\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {\n          \"waitForSubWorkflow\": true\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        96,\n        -64\n      ],\n      \"id\": \"cbc37844-2592-49ea-aa63-4034ac2b872f\",\n      \"name\": \"Search - Ashby\"\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"wPonEanWkKtPqPeR\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/wPonEanWkKtPqPeR\",\n          \"cachedResultName\": \"Sub WF - Run Brave Search Query\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"siteSearch\": \"lever.co\",\n            \"query\": \"={{ $json.query }}\"\n          },\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"siteSearch\",\n              \"displayName\": \"siteSearch\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            },\n            {\n              \"id\": \"query\",\n              \"displayName\": \"query\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {\n          \"waitForSubWorkflow\": true\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        96,\n        128\n      ],\n      \"id\": \"5b0d5c0d-ac99-44e7-b272-bc9e8185fd77\",\n      \"name\": \"Search - Lever\"\n    },\n    {\n      \"parameters\": {\n        \"workflowId\": {\n          \"__rl\": true,\n          \"value\": \"wPonEanWkKtPqPeR\",\n          \"mode\": \"list\",\n          \"cachedResultUrl\": \"\/workflow\/wPonEanWkKtPqPeR\",\n          \"cachedResultName\": \"Sub WF - Run Brave Search Query\"\n        },\n        \"workflowInputs\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"siteSearch\": \"myworkdayjobs.com\",\n            \"query\": \"={{ $json.query }}\"\n          },\n          \"matchingColumns\": [],\n          \"schema\": [\n            {\n              \"id\": \"siteSearch\",\n              \"displayName\": \"siteSearch\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            },\n            {\n              \"id\": \"query\",\n              \"displayName\": \"query\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"canBeUsedToMatch\": true,\n              \"type\": \"string\",\n              \"removed\": false\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": true\n        },\n        \"options\": {\n          \"waitForSubWorkflow\": true\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflow\",\n      \"typeVersion\": 1.3,\n      \"position\": [\n        96,\n        304\n      ],\n      \"id\": \"07836472-e332-4518-9d51-f2555bd54638\",\n      \"name\": \"Search - Workday\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"searchResults\",\n              \"name\": \"searchResults\",\n              \"value\": \"={{ $json.allResults }}\",\n              \"type\": \"array\"\n            },\n            {\n              \"id\": \"resultCount\",\n              \"name\": \"resultCount\",\n              \"value\": \"={{ $json.allResults.length }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"searchSummary\",\n              \"name\": \"searchSummary\",\n              \"value\": \"={{ $json.searchSummary }}\",\n              \"type\": \"object\"\n            },\n            {\n              \"id\": \"siteSearched\",\n              \"name\": \"siteSearched\",\n              \"value\": \"={{ $json.siteSearch }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        320,\n        -64\n      ],\n      \"id\": \"9ca3671f-92af-4704-b1fb-e1b57a187c7d\",\n      \"name\": \"Process Search Results1\"\n    },\n    {\n      \"parameters\": {\n        \"fieldToSplitOut\": \"searchResults\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.splitOut\",\n      \"typeVersion\": 1,\n      \"position\": [\n        560,\n        -64\n      ],\n      \"id\": \"bbf88c47-aa4e-4207-93a8-ff4d0ffd7637\",\n      \"name\": \"Split Individual Results1\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"searchResults\",\n              \"name\": \"searchResults\",\n              \"value\": \"={{ $json.allResults }}\",\n              \"type\": \"array\"\n            },\n            {\n              \"id\": \"resultCount\",\n              \"name\": \"resultCount\",\n              \"value\": \"={{ $json.allResults.length }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"searchSummary\",\n              \"name\": \"searchSummary\",\n              \"value\": \"={{ $json.searchSummary }}\",\n              \"type\": \"object\"\n            },\n            {\n              \"id\": \"siteSearched\",\n              \"name\": \"siteSearched\",\n              \"value\": \"={{ $json.siteSearch }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        320,\n        128\n      ],\n      \"id\": \"597a1468-f599-4df8-af19-4a4b6443c9c8\",\n      \"name\": \"Process Search Results2\"\n    },\n    {\n      \"parameters\": {\n        \"fieldToSplitOut\": \"searchResults\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.splitOut\",\n      \"typeVersion\": 1,\n      \"position\": [\n        560,\n        128\n      ],\n      \"id\": \"a72a8031-7ae2-4ec6-94e8-428f12113179\",\n      \"name\": \"Split Individual Results2\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"searchResults\",\n              \"name\": \"searchResults\",\n              \"value\": \"={{ $json.allResults }}\",\n              \"type\": \"array\"\n            },\n            {\n              \"id\": \"resultCount\",\n              \"name\": \"resultCount\",\n              \"value\": \"={{ $json.allResults.length }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"searchSummary\",\n              \"name\": \"searchSummary\",\n              \"value\": \"={{ $json.searchSummary }}\",\n              \"type\": \"object\"\n            },\n            {\n              \"id\": \"siteSearched\",\n              \"name\": \"siteSearched\",\n              \"value\": \"={{ $json.siteSearch }}\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        320,\n        304\n      ],\n      \"id\": \"b29b26fd-93b3-4120-a04d-4d01df1539e8\",\n      \"name\": \"Process Search Results3\"\n    },\n    {\n      \"parameters\": {\n        \"fieldToSplitOut\": \"searchResults\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.splitOut\",\n      \"typeVersion\": 1,\n      \"position\": [\n        560,\n        304\n      ],\n      \"id\": \"88593403-0fd8-4edc-8f7a-dcb60160d4bf\",\n      \"name\": \"Split Individual Results3\"\n    },\n    {\n      \"parameters\": {\n        \"numberInputs\": 4\n      },\n      \"type\": \"n8n-nodes-base.merge\",\n      \"typeVersion\": 3.2,\n      \"position\": [\n        864,\n        64\n      ],\n      \"id\": \"981092b0-8ad5-442c-8d14-4e3d72059ba9\",\n      \"name\": \"Merge\"\n    },\n    {\n      \"parameters\": {\n        \"workflowInputs\": {\n          \"values\": [\n            {\n              \"name\": \"noop\"\n            }\n          ]\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflowTrigger\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -720,\n        -144\n      ],\n      \"id\": \"08edeba3-1e18-4757-8481-043125f356c0\",\n      \"name\": \"When Executed by Another Workflow\"\n    }\n  ],\n  \"connections\": {\n    \"Manual Trigger\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Set Search Parameters\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Set Search Parameters\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Search - Greenhouse\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Ashby Pause\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Lever Pause\",\n            \"type\": \"main\",\n            \"index\": 0\n          },\n          {\n            \"node\": \"Workday Pause\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Process Search Results\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Split Individual Results\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Split Individual Results\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Search - Greenhouse\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Search Results\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Ashby Pause\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Search - Ashby\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Lever Pause\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Search - Lever\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Workday Pause\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Search - Workday\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Search - Ashby\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Search Results1\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Search - Lever\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Search Results2\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Search - Workday\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Search Results3\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Process Search Results1\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Split Individual Results1\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Split Individual Results1\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge\",\n            \"type\": \"main\",\n            \"index\": 1\n          }\n        ]\n      ]\n    },\n    \"Process Search Results2\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Split Individual Results2\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Split Individual Results2\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge\",\n            \"type\": \"main\",\n            \"index\": 2\n          }\n        ]\n      ]\n    },\n    \"Process Search Results3\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Split Individual Results3\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Split Individual Results3\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Merge\",\n            \"type\": \"main\",\n            \"index\": 3\n          }\n        ]\n      ]\n    },\n    \"When Executed by Another Workflow\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Set Search Parameters\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"instanceId\": \"0bae1fab76f5b3d7d761d2213eecaaf39f2590bd0b5cd104d1482f6fd0bab96b\"\n  }\n}\r\n    <\/script>\r\n    \r\n    <n8n-demo id=\"workflow-demo-69f182da85fbf\"><\/n8n-demo>\r\n    \r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function() {\r\n        const jsonElement = document.getElementById(\"workflow-json-69f182da85fbe\");\r\n        const workflowElement = document.getElementById(\"workflow-demo-69f182da85fbf\");\r\n        \r\n        if (jsonElement && workflowElement) {\r\n            const workflowData = jsonElement.textContent.trim();\r\n            workflowElement.setAttribute(\"workflow\", workflowData);\r\n        }\r\n    });\r\n    <\/script>\n\n\n<p>As you can see, both workflows behave the same way &#8211; the only material difference is the search string.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Sub-workflows: &#8216;Run [Google | Brave] Search Query&#8217;<\/h4>\n\n\n\n<p>The second sub-workflows run the query and site strings passed to them and runs through the Search APIs. <\/p>\n\n\n\n<p>Although structurally the same, the code in the code nodes is tailored to the search API.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Run Google Search Query<\/h5>\n\n\n\n<p>The Google-focused workflow uses the APIs to use page numbers to iterate through the search results. <\/p>\n\n\n\n<p>For additional detail on the approach, check out my <a href=\"https:\/\/simpkins.social\/cliff\/blog\/2025\/08\/26\/adding-google-search-to-my-n8n-driven-job-search-agent\/\">Adding Google Search to my job search agent<\/a> and <a href=\"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/24\/tip-retrieving-all-google-search-results-in-n8n\/\">Retrieving all Google search results in n8n<\/a> blog posts.<\/p>\n\n\n\r\n    <script type=\"application\/json\" id=\"workflow-json-69f182da8612e\">\r\n{\n  \"nodes\": [\n    {\n      \"parameters\": {\n        \"jsCode\": \"\/\/ Get input from parent workflow\\nconst input = $input.first().json;\\n\\n\/\/ Initialize variables for pagination with input from parent\\nconst baseUrl = \\\"https:\/\/www.googleapis.com\/customsearch\/v1\\\";\\nconst cx = \\\"YourCxKey\\\";\\nconst query = input.query ||  \\\"Your Search Query\\\";\\n\\n\/\/ Use siteSearch from input, with fallback\\nconst siteSearch = input.siteSearch || \\\"jobBoard.com\\\";\\n\\n\/\/ Set initial values\\nreturn [{\\n  json: {\\n    cx: cx,\\n    query: query,\\n    siteSearch: siteSearch,\\n    start: 1,\\n    allResults: [],\\n    hasMoreResults: true,\\n    totalResults: 0,\\n    currentPage: 1,\\n    inputData: input \/\/ Store original input for reference\\n  }\\n}];\"\n      },\n      \"type\": \"n8n-nodes-base.code\",\n      \"typeVersion\": 2,\n      \"position\": [\n        -304,\n        544\n      ],\n      \"id\": \"bc652353-c902-43cd-a936-16ec471e6afe\",\n      \"name\": \"Initialize with Input\"\n    },\n    {\n      \"parameters\": {\n        \"url\": \"https:\/\/www.googleapis.com\/customsearch\/v1\",\n        \"sendQuery\": true,\n        \"queryParameters\": {\n          \"parameters\": [\n            {\n              \"name\": \"key\",\n              \"value\": \"YourGoogleApiKey\"\n            },\n            {\n              \"name\": \"q\",\n              \"value\": \"={{ $('Initialize with Input').first().json.query }}\"\n            },\n            {\n              \"name\": \"cx\",\n              \"value\": \"={{ $('Initialize with Input').first().json.cx }}\"\n            },\n            {\n              \"name\": \"siteSearch\",\n              \"value\": \"={{ $('Initialize with Input').first().json.siteSearch }}\"\n            },\n            {\n              \"name\": \"siteSearchFilter\",\n              \"value\": \"i\"\n            },\n            {\n              \"name\": \"start\",\n              \"value\": \"={{ $json.start }}\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.httpRequest\",\n      \"typeVersion\": 4.2,\n      \"position\": [\n        -112,\n        544\n      ],\n      \"id\": \"6cd9e1e3-fbf0-49c5-ab3b-db5da3621d94\",\n      \"name\": \"Google Search Request\"\n    },\n    {\n      \"parameters\": {\n        \"jsCode\": \"\/\/ Get the current search response\\nconst currentData = $input.first().json;\\nconst items = currentData.items || [];\\nconst searchInfo = currentData.searchInformation || {};\\nconst totalResults = parseInt(searchInfo.totalResults) || 0;\\nconst resultsPerPage = 10;\\n\\n\\n\/\/ Get static values from Initialize (never change)\\nconst initData = $(\\\"Initialize with Input\\\").first().json;\\n\\n\/\/ Get dynamic state: try from previous Process Results, fallback to Initialize\\nlet allResults, currentStart, currentPage, inputData;\\n\\nif (($('Process Results').isExecuted)) {\\n  \\n    \/\/ Get accumulated state from previous Process Results iteration\\n    const lastResults = $(\\\"Process Results\\\").first().json;\\n  \\n    allResults = lastResults.allResults || [];\\n    currentStart = lastResults.start || 1;\\n    currentPage = lastResults.currentPage || 1;\\n} else {\\n    \/\/ First iteration - use initial values\\n    allResults = initData.allResults || [];\\n    currentStart = initData.start || 1;\\n    currentPage = initData.currentPage || 1;\\n}\\n\\n\/\/ \u2705 FIX: Get accumulated state from the data that was sent to HTTP request\\n\/\/const previousState = $(\\\"Google Search Request\\\").first().json;\\n\/\/\\n\/\/ Get the existing accumulated results\\n\/\/let allResults = previousState.allResults || [];\\n\/\/let currentStart = previousState.start || 1;\\n\/\/let currentPage = previousState.currentPage || 1;\\n\\n\/\/ Add NEW results to existing collection\\nallResults = allResults.concat(items);\\n\\n\/\/ Calculate next iteration\\nconst nextStart = currentStart + resultsPerPage;\\nconst hasMoreResults = nextStart <= Math.min(totalResults, 100) &#038;&#038; items.length === resultsPerPage;\\nconst shouldContinue = hasMoreResults &#038;&#038; allResults.length < 100;\\n\\nconsole.log(`Page ${currentPage}: Added ${items.length} results. Total: ${allResults.length}`);\\n\\nreturn [{\\n  json: {\\n    start: nextStart,\\n    allResults: allResults, \/\/ Now accumulates properly!\\n    hasMoreResults: shouldContinue,\\n    totalResults: totalResults,\\n    currentPage: currentPage + 1,\\n    currentBatchSize: items.length,\\n    totalCollected: allResults.length\\n  }\\n}];\"\n      },\n      \"type\": \"n8n-nodes-base.code\",\n      \"typeVersion\": 2,\n      \"position\": [\n        64,\n        544\n      ],\n      \"id\": \"4a6e9fcb-993e-45a6-b457-b3b5bbe2c337\",\n      \"name\": \"Process Results\"\n    },\n    {\n      \"parameters\": {\n        \"conditions\": {\n          \"options\": {\n            \"caseSensitive\": true,\n            \"leftValue\": \"\",\n            \"typeValidation\": \"strict\",\n            \"version\": 1\n          },\n          \"conditions\": [\n            {\n              \"id\": \"continue-condition\",\n              \"leftValue\": \"={{ $json.hasMoreResults }}\",\n              \"rightValue\": true,\n              \"operator\": {\n                \"type\": \"boolean\",\n                \"operation\": \"equals\"\n              }\n            }\n          ],\n          \"combinator\": \"and\"\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.if\",\n      \"typeVersion\": 2,\n      \"position\": [\n        224,\n        544\n      ],\n      \"id\": \"c1684264-762c-453e-9d65-4af439687787\",\n      \"name\": \"Should Continue?\"\n    },\n    {\n      \"parameters\": {\n        \"jsCode\": \"\/\/ Prepare final output for parent workflow\\nconst finalData = $input.first().json;\\n\\n\/\/ Return the results in a format expected by parent workflow\\nreturn [{\\n  json: {\\n    success: true,\\n    siteSearch: finalData.siteSearch,\\n    searchSummary: {\\n      totalResultsFound: finalData.totalResults,\\n      totalResultsCollected: finalData.totalCollected,\\n      pagesProcessed: finalData.currentPage - 1,\\n      query: finalData.query,\\n      siteSearch: finalData.siteSearch\\n    },\\n    allResults: finalData.allResults,\\n    originalInput: finalData.inputData\\n  }\\n}];\"\n      },\n      \"type\": \"n8n-nodes-base.code\",\n      \"typeVersion\": 2,\n      \"position\": [\n        416,\n        560\n      ],\n      \"id\": \"bc653dfb-a375-446c-8580-cde7243eb1f6\",\n      \"name\": \"Prepare Output\"\n    },\n    {\n      \"parameters\": {\n        \"amount\": 1\n      },\n      \"type\": \"n8n-nodes-base.wait\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -304,\n        400\n      ],\n      \"id\": \"cb170712-e536-45bf-8b50-ca54b5d64622\",\n      \"name\": \"Rate Limit Wait\",\n      \"webhookId\": \"176bd37b-6b03-4041-9ae2-2d2b118ec319\"\n    },\n    {\n      \"parameters\": {\n        \"workflowInputs\": {\n          \"values\": [\n            {\n              \"name\": \"siteSearch\"\n            },\n            {\n              \"name\": \"query\"\n            }\n          ]\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflowTrigger\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -496,\n        544\n      ],\n      \"id\": \"63400565-237c-455a-b605-786dcd7e90d1\",\n      \"name\": \"When Executed by Another Workflow\"\n    }\n  ],\n  \"connections\": {\n    \"Initialize with Input\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Google Search Request\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Google Search Request\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Results\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Process Results\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Should Continue?\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Should Continue?\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Rate Limit Wait\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ],\n        [\n          {\n            \"node\": \"Prepare Output\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Prepare Output\": {\n      \"main\": [\n        []\n      ]\n    },\n    \"Rate Limit Wait\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Google Search Request\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"When Executed by Another Workflow\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Initialize with Input\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"instanceId\": \"0bae1fab76f5b3d7d761d2213eecaaf39f2590bd0b5cd104d1482f6fd0bab96b\"\n  }\n}\r\n    <\/script>\r\n    \r\n    <n8n-demo id=\"workflow-demo-69f182da8612f\"><\/n8n-demo>\r\n    \r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function() {\r\n        const jsonElement = document.getElementById(\"workflow-json-69f182da8612e\");\r\n        const workflowElement = document.getElementById(\"workflow-demo-69f182da8612f\");\r\n        \r\n        if (jsonElement && workflowElement) {\r\n            const workflowData = jsonElement.textContent.trim();\r\n            workflowElement.setAttribute(\"workflow\", workflowData);\r\n        }\r\n    });\r\n    <\/script>\n\n\n<h5 class=\"wp-block-heading\">Run Brave Search Query<\/h5>\n\n\n\n<p>The Brave Search API takes a different approach, using a <code>hasMoreResults<\/code> value to let us know when we are done processing the relevant results.<\/p>\n\n\n\r\n    <script type=\"application\/json\" id=\"workflow-json-69f182da861c1\">\r\n{\n  \"nodes\": [\n    {\n      \"parameters\": {\n        \"jsCode\": \"\/\/ Get input from parent workflow\\nconst input = $input.first().json;\\n\\nconst query = input.query ||  \\\"Your Search Query\\\";\\n\\n\/\/ Set initial values\\nreturn [{\\n  json: {\\n    query: siteSearch + query,\\n    offset: 0,\\n    allResults: [],\\n    hasMoreResults: true,\\n    totalResults: 0,\\n    inputData: input \/\/ Store original input for reference\\n  }\\n}];\"\n      },\n      \"type\": \"n8n-nodes-base.code\",\n      \"typeVersion\": 2,\n      \"position\": [\n        -304,\n        544\n      ],\n      \"id\": \"ca021e05-b94d-4cae-a6d3-a80526c9ab13\",\n      \"name\": \"Initialize with Input\"\n    },\n    {\n      \"parameters\": {\n        \"jsCode\": \"\/\/ Get the current search response\\nconst currentData = $input.first().json;\\nconst items = currentData.web.results || [];\\nconst searchInfo = currentData.searchInformation || {};\\nconst totalResults = parseInt(searchInfo.totalResults) || 0;\\n\\n\/\/ Get static values from Initialize (never change)\\nconst initData = $(\\\"Initialize with Input\\\").first().json;\\n\\n\/\/ Get dynamic state: try from previous Process Results, fallback to Initialize\\nlet allResults, currentOffset, inputData;\\n\\nif (($('Process Results').isExecuted)) {\\n  \\n    \/\/ Get accumulated state from previous Process Results iteration\\n    const lastResults = $(\\\"Process Results\\\").first().json;\\n  \\n    allResults = lastResults.allResults || [];\\n    currentOffset = lastResults.offset || 0;\\n} else {\\n    \/\/ First iteration - use initial values\\n    allResults = initData.allResults || [];\\n    currentOffset = initData.offset || 0;\\n}\\n\\n\/\/ Add NEW results to existing collection\\nallResults = allResults.concat(items);\\n\\n\/\/ Calculate next iteration\\nconst nextOffset = currentOffset + 1;\\nconst hasMoreResults = $input.first().json.query.more_results_available;\\n\\nconsole.log(`Page ${currentOffset}: Added ${items.length} results. Total: ${allResults.length}`);\\n\\nreturn [{\\n  json: {\\n    start: nextOffset,\\n    allResults: allResults, \/\/ Now accumulates properly!\\n    hasMoreResults: hasMoreResults,\\n    totalResults: totalResults,\\n    offset: currentOffset + 1,\\n    currentBatchSize: items.length,\\n    totalCollected: allResults.length\\n  }\\n}];\"\n      },\n      \"type\": \"n8n-nodes-base.code\",\n      \"typeVersion\": 2,\n      \"position\": [\n        48,\n        544\n      ],\n      \"id\": \"ba0f97cb-5c1c-4f56-bfa6-1199ed9935f0\",\n      \"name\": \"Process Results\"\n    },\n    {\n      \"parameters\": {\n        \"conditions\": {\n          \"options\": {\n            \"caseSensitive\": true,\n            \"leftValue\": \"\",\n            \"typeValidation\": \"strict\",\n            \"version\": 1\n          },\n          \"conditions\": [\n            {\n              \"id\": \"continue-condition\",\n              \"leftValue\": \"={{ $json.hasMoreResults }}\",\n              \"rightValue\": true,\n              \"operator\": {\n                \"type\": \"boolean\",\n                \"operation\": \"equals\"\n              }\n            }\n          ],\n          \"combinator\": \"and\"\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.if\",\n      \"typeVersion\": 2,\n      \"position\": [\n        224,\n        544\n      ],\n      \"id\": \"4082ba25-376c-494e-b7f7-acfe0e61afd4\",\n      \"name\": \"Should Continue?\"\n    },\n    {\n      \"parameters\": {\n        \"jsCode\": \"\/\/ Prepare final output for parent workflow\\nconst finalData = $input.first().json;\\n\\n\/\/ Return the results in a format expected by parent workflow\\nreturn [{\\n  json: {\\n    success: true,\\n    siteSearch: finalData.siteSearch,\\n    searchSummary: {\\n      totalResultsFound: finalData.totalResults,\\n      totalResultsCollected: finalData.totalCollected,\\n      pagesProcessed: finalData.currentPage - 1,\\n      query: finalData.query,\\n      siteSearch: finalData.siteSearch\\n    },\\n    allResults: finalData.allResults,\\n    originalInput: finalData.inputData\\n  }\\n}];\"\n      },\n      \"type\": \"n8n-nodes-base.code\",\n      \"typeVersion\": 2,\n      \"position\": [\n        416,\n        560\n      ],\n      \"id\": \"7eae4b0f-b225-4111-9742-04e494401ae0\",\n      \"name\": \"Prepare Output\"\n    },\n    {\n      \"parameters\": {\n        \"amount\": 1\n      },\n      \"type\": \"n8n-nodes-base.wait\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -304,\n        400\n      ],\n      \"id\": \"117629a0-4e5d-4ab9-a6f0-8919f752c802\",\n      \"name\": \"Rate Limit Wait\",\n      \"webhookId\": \"6c1a15c4-fdfa-4e9e-aec5-44ef3d1960e3\"\n    },\n    {\n      \"parameters\": {\n        \"workflowInputs\": {\n          \"values\": [\n            {\n              \"name\": \"siteSearch\"\n            },\n            {\n              \"name\": \"query\"\n            }\n          ]\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflowTrigger\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -496,\n        544\n      ],\n      \"id\": \"1b774395-a340-45ab-8365-30bb4b774991\",\n      \"name\": \"When Executed by Another Workflow\"\n    },\n    {\n      \"parameters\": {\n        \"query\": \"={{ $('Initialize with Input').first().json.query }}\",\n        \"count\": 20,\n        \"additionalParameters\": {\n          \"offset\": \"={{ $if($('Process Results').isExecuted, $('Process Results').last().json.offset, \\\"0\\\") }}\"\n        }\n      },\n      \"type\": \"@brave\/n8n-nodes-brave-search.braveSearch\",\n      \"typeVersion\": 1,\n      \"position\": [\n        -128,\n        544\n      ],\n      \"id\": \"52bdb152-9397-48a8-b254-8a3cd8acde2c\",\n      \"name\": \"Brave Search\",\n      \"alwaysOutputData\": false,\n      \"credentials\": {\n        \"braveSearchApi\": {\n          \"id\": \"zwt1FAwvmEjc2vEt\",\n          \"name\": \"Brave Search account\"\n        }\n      }\n    }\n  ],\n  \"connections\": {\n    \"Initialize with Input\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Brave Search\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Process Results\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Should Continue?\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Should Continue?\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Rate Limit Wait\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ],\n        [\n          {\n            \"node\": \"Prepare Output\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Prepare Output\": {\n      \"main\": [\n        []\n      ]\n    },\n    \"Rate Limit Wait\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Brave Search\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"When Executed by Another Workflow\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Initialize with Input\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Brave Search\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Process Results\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"instanceId\": \"0bae1fab76f5b3d7d761d2213eecaaf39f2590bd0b5cd104d1482f6fd0bab96b\"\n  }\n}\r\n    <\/script>\r\n    \r\n    <n8n-demo id=\"workflow-demo-69f182da861c2\"><\/n8n-demo>\r\n    \r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function() {\r\n        const jsonElement = document.getElementById(\"workflow-json-69f182da861c1\");\r\n        const workflowElement = document.getElementById(\"workflow-demo-69f182da861c2\");\r\n        \r\n        if (jsonElement && workflowElement) {\r\n            const workflowData = jsonElement.textContent.trim();\r\n            workflowElement.setAttribute(\"workflow\", workflowData);\r\n        }\r\n    });\r\n    <\/script>\n\n\n<h4 class=\"wp-block-heading\">Sub-workflow: 'Process JD Search Result'<\/h4>\n\n\n\n<p>This is the most interesting workflow of the bunch - here is where we evaluate if we've seen the job description ('JD') before, get our LLM to evaluate it, and then add it to our data store. <\/p>\n\n\n\r\n    <script type=\"application\/json\" id=\"workflow-json-69f182da86254\">\r\n{\n  \"nodes\": [\n    {\n      \"parameters\": {\n        \"workflowInputs\": {\n          \"values\": [\n            {\n              \"name\": \"url\"\n            },\n            {\n              \"name\": \"pageTitle\"\n            }\n          ]\n        }\n      },\n      \"type\": \"n8n-nodes-base.executeWorkflowTrigger\",\n      \"typeVersion\": 1.1,\n      \"position\": [\n        -2112,\n        -64\n      ],\n      \"id\": \"f13cd698-6393-4675-8aad-cfead887acc9\",\n      \"name\": \"When Executed by Another Workflow\",\n      \"onError\": \"continueErrorOutput\"\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.noOp\",\n      \"typeVersion\": 1,\n      \"position\": [\n        -736,\n        368\n      ],\n      \"id\": \"1ad5d743-a461-4a87-8edc-009be118f52a\",\n      \"name\": \"No Operation, do nothing\"\n    },\n    {\n      \"parameters\": {\n        \"mode\": \"raw\",\n        \"jsonOutput\": \"={{ $json.content[0].text }}\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        -736,\n        160\n      ],\n      \"id\": \"00fc7dae-e165-4690-a529-eea0dfa12cd4\",\n      \"name\": \"Cleanup JSON\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"587de1a7-58a8-40b6-8c7c-6c3f1885b874\",\n              \"name\": \"ExistingFound\",\n              \"value\": true,\n              \"type\": \"boolean\"\n            },\n            {\n              \"id\": \"259fb8a4-fc8a-4432-a1fc-2951c5055579\",\n              \"name\": \"NewAdded\",\n              \"value\": false,\n              \"type\": \"boolean\"\n            },\n            {\n              \"id\": \"50b761c9-a803-436a-915d-b1b1e15e5b63\",\n              \"name\": \"InputTokensUsed\",\n              \"value\": 0,\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"8138b6ac-ac3e-42d3-b88f-2bfe3493faba\",\n              \"name\": \"OutputTokensUsed\",\n              \"value\": 0,\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"9c5faf7a-9f5b-42ae-a874-ca67749437c5\",\n              \"name\": \"AddedPosting\",\n              \"value\": \"\\\"\\\"\",\n              \"type\": \"string\"\n            },\n            {\n              \"id\": \"d4c7293c-a223-4670-976b-136ca03f69a9\",\n              \"name\": \"Relevant\",\n              \"value\": false,\n              \"type\": \"boolean\"\n            },\n            {\n              \"id\": \"d57285e6-cfe3-468e-8cb8-8523afd676a2\",\n              \"name\": \"Error\",\n              \"value\": false,\n              \"type\": \"boolean\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        -384,\n        -96\n      ],\n      \"id\": \"12c69d3c-3db7-42ab-b260-16bdd8453708\",\n      \"name\": \"Return_Existing\"\n    },\n    {\n      \"parameters\": {},\n      \"type\": \"n8n-nodes-base.manualTrigger\",\n      \"typeVersion\": 1,\n      \"position\": [\n        -2128,\n        176\n      ],\n      \"id\": \"ff813c6f-d5cc-408b-957c-c9010fbac61b\",\n      \"name\": \"When clicking \u2018Execute workflow\u2019\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"da21e662-e144-4978-88d9-56c774f90db5\",\n              \"name\": \"url\",\n              \"value\": \"https:\/\/jobs.ashbyhq.com\/promptfoo\/ef5c3d00-bee0-459e-935b-aca6c1644519\/application\",\n              \"type\": \"string\"\n            },\n            {\n              \"id\": \"07cd3417-59fc-4c47-b515-63a1d611776e\",\n              \"name\": \"pageTitle\",\n              \"value\": \"Unknown - test data\",\n              \"type\": \"string\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        -1952,\n        176\n      ],\n      \"id\": \"b330b2c7-1888-4623-adc0-529ce1768d15\",\n      \"name\": \"Set Proxy Data\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"587de1a7-58a8-40b6-8c7c-6c3f1885b874\",\n              \"name\": \"ExistingFound\",\n              \"value\": false,\n              \"type\": \"boolean\"\n            },\n            {\n              \"id\": \"259fb8a4-fc8a-4432-a1fc-2951c5055579\",\n              \"name\": \"NewAdded\",\n              \"value\": true,\n              \"type\": \"boolean\"\n            },\n            {\n              \"id\": \"50b761c9-a803-436a-915d-b1b1e15e5b63\",\n              \"name\": \"InputTokensUsed\",\n              \"value\": \"={{ $('Analyze Job Posting').item.json.usage.input_tokens }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"8138b6ac-ac3e-42d3-b88f-2bfe3493faba\",\n              \"name\": \"OutputTokensUsed\",\n              \"value\": \"={{ $('Analyze Job Posting').item.json.usage.output_tokens }}\",\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"c9012125-4aff-4de2-a960-deae7db8d9b7\",\n              \"name\": \"AddedPosting\",\n              \"value\": \"={{ $('Cleanup JSON').item.json.job_title + \\\" (\\\" + $('Cleanup JSON').item.json.company + \\\")  - \\\" + $('Cleanup JSON').item.json.reasoning}}\",\n              \"type\": \"string\"\n            },\n            {\n              \"id\": \"8fb354c1-a0d0-4cb6-a8b0-f6eaab40e691\",\n              \"name\": \"Relevant\",\n              \"value\": \"={{ $('Cleanup JSON').item.json.relevant }}\",\n              \"type\": \"boolean\"\n            },\n            {\n              \"id\": \"bb0b6125-a35c-4acb-a40b-54a67b4a59bc\",\n              \"name\": \"Error\",\n              \"value\": false,\n              \"type\": \"boolean\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        -400,\n        160\n      ],\n      \"id\": \"11402799-eaf3-4c4f-97fb-1e65876440a9\",\n      \"name\": \"Return_New\"\n    },\n    {\n      \"parameters\": {\n        \"assignments\": {\n          \"assignments\": [\n            {\n              \"id\": \"587de1a7-58a8-40b6-8c7c-6c3f1885b874\",\n              \"name\": \"ExistingFound\",\n              \"value\": false,\n              \"type\": \"boolean\"\n            },\n            {\n              \"id\": \"259fb8a4-fc8a-4432-a1fc-2951c5055579\",\n              \"name\": \"NewAdded\",\n              \"value\": false,\n              \"type\": \"boolean\"\n            },\n            {\n              \"id\": \"50b761c9-a803-436a-915d-b1b1e15e5b63\",\n              \"name\": \"InputTokensUsed\",\n              \"value\": 0,\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"8138b6ac-ac3e-42d3-b88f-2bfe3493faba\",\n              \"name\": \"OutputTokensUsed\",\n              \"value\": 0,\n              \"type\": \"number\"\n            },\n            {\n              \"id\": \"9c5faf7a-9f5b-42ae-a874-ca67749437c5\",\n              \"name\": \"AddedPosting\",\n              \"value\": \"\\\"\\\"\",\n              \"type\": \"string\"\n            },\n            {\n              \"id\": \"d4c7293c-a223-4670-976b-136ca03f69a9\",\n              \"name\": \"Relevant\",\n              \"value\": false,\n              \"type\": \"boolean\"\n            },\n            {\n              \"id\": \"7c3e16a8-3712-42b4-9e8e-56b5ba80c0eb\",\n              \"name\": \"Error\",\n              \"value\": true,\n              \"type\": \"boolean\"\n            }\n          ]\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.set\",\n      \"typeVersion\": 3.4,\n      \"position\": [\n        -400,\n        368\n      ],\n      \"id\": \"d975081b-e13c-4889-be6e-f615b544bc5c\",\n      \"name\": \"Return_Error\"\n    },\n    {\n      \"parameters\": {\n        \"url\": \"={{ $('Normalize URL').first().json.normalizedUrl }}\",\n        \"sendHeaders\": true,\n        \"headerParameters\": {\n          \"parameters\": [\n            {\n              \"name\": \"Accept\",\n              \"value\": \"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8\"\n            },\n            {\n              \"name\": \"User-Agent\",\n              \"value\": \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Safari\/537.36\"\n            }\n          ]\n        },\n        \"options\": {\n          \"batching\": {\n            \"batch\": {\n              \"batchSize\": 1,\n              \"batchInterval\": 2000\n            }\n          }\n        }\n      },\n      \"type\": \"n8n-nodes-base.httpRequest\",\n      \"typeVersion\": 4.2,\n      \"position\": [\n        -1664,\n        192\n      ],\n      \"id\": \"330ed4e7-7165-4132-a3ad-41bc0a2a26bd\",\n      \"name\": \"HTTP Request\",\n      \"retryOnFail\": true,\n      \"maxTries\": 2,\n      \"alwaysOutputData\": true,\n      \"waitBetweenTries\": 3000,\n      \"onError\": \"continueRegularOutput\"\n    },\n    {\n      \"parameters\": {\n        \"jsCode\": \"\/\/ Get the HTML from the HTTP Request node\\nconst html = $input.first().json.data;\\n\\n\/\/ Get the URL from the previous normalization node\\nlet url = $('Normalize URL').first().json.normalizedUrl || \\n          $('Normalize URL').first().json.url ||\\n          $input.first().json.url;\\n\\n\/\/ If still not found, try to get from any previous node\\nif (!url) {\\n  const allItems = $input.all();\\n  for (const item of allItems) {\\n    if (item.json.normalizedUrl) {\\n      url = item.json.normalizedUrl;\\n      break;\\n    }\\n    if (item.json.url) {\\n      url = item.json.url;\\n      break;\\n    }\\n  }\\n}\\n\\n\/\/ Detect platform from URL first (before checking HTML)\\nlet platformFromUrl = 'Unknown';\\nif (url) {\\n  if (url.includes('greenhouse.io') || url.includes('gh_jid=') || url.includes('gh_src=')) {\\n    platformFromUrl = 'Greenhouse';\\n  } else if (url.includes('ashbyhq.com')) {\\n    platformFromUrl = 'Ashby';\\n  } else if (url.includes('myworkdayjobs.com') || url.includes('workday.com')) {\\n    platformFromUrl = 'Workday';\\n  } else if (url.includes('lever.co')) {\\n    platformFromUrl = 'Lever';\\n  }\\n}\\n\\n\/\/ Safety check: if html is undefined or empty, return null values but include platform\\nif (!html || html.length === 0) {\\n  return {\\n    url: url,\\n    jobTitle: null,\\n    jobDescription: null,\\n    platform: platformFromUrl,\\n    error: 'Failed to fetch HTML content'\\n  };\\n}\\n\\nlet jobTitle = null;\\nlet jobDescription = null;\\n\\n\/\/ Detect platform by fingerprints (refine detection with HTML content)\\nconst hasGhJid = url ? (url.includes('gh_jid=') || url.includes('gh_src=')) : false;\\nconst hasGreenhouseData = html.includes('window.GREENHOUSE_DATA') || html.includes('greenhouse.io');\\nconst hasAshbyData = html.includes('window.__ASHBY_JOB_POSTING_APP__') || html.includes('ashbyhq.com');\\nconst hasWorkdayData = html.includes('myworkdayjobs.com') || html.includes('workday.com\/wday');\\nconst hasLeverData = html.includes('window._LEVER_STATE') || html.includes('lever.co');\\n\\nconst isGreenhouse = hasGhJid || hasGreenhouseData || (url && url.includes('greenhouse.io'));\\nconst isAshby = hasAshbyData || (url && url.includes('ashbyhq.com'));\\nconst isWorkday = hasWorkdayData || (url && url.includes('myworkdayjobs.com'));\\nconst isLever = hasLeverData || (url && url.includes('lever.co'));\\n\\n\/\/ === IMPROVED GREENHOUSE EXTRACTION ===\\nif (isGreenhouse) {\\n  \/\/ Method 1: Try Greenhouse JSON data\\n  const ghDataMatch = html.match(\/window\\\\.GREENHOUSE_DATA\\\\s*=\\\\s*({.*?});\/s);\\n  if (ghDataMatch) {\\n    try {\\n      const ghData = JSON.parse(ghDataMatch[1]);\\n      jobTitle = ghData.title || ghData.name;\\n      jobDescription = ghData.content || ghData.description;\\n    } catch (e) {\\n      console.log('Failed to parse GREENHOUSE_DATA:', e);\\n    }\\n  }\\n  \\n  \/\/ Method 2: Try different Greenhouse data patterns\\n  if (!jobTitle || !jobDescription) {\\n    const patterns = [\\n      \/window\\\\.gon\\\\s*=\\\\s*({.*?});\/s,\\n      \/window\\\\.GreenhouseConfig\\\\s*=\\\\s*({.*?});\/s,\\n      \/window\\\\.jobPostingData\\\\s*=\\\\s*({.*?});\/s\\n    ];\\n    \\n    for (const pattern of patterns) {\\n      const match = html.match(pattern);\\n      if (match) {\\n        try {\\n          const data = JSON.parse(match[1]);\\n          jobTitle = jobTitle || data.title || data.name || data.job?.title;\\n          jobDescription = jobDescription || data.content || data.description || data.job?.description;\\n        } catch (e) {}\\n      }\\n    }\\n  }\\n  \\n  \/\/ Method 3: Extract job title from HTML\\n  if (!jobTitle) {\\n    const titleSelectors = [\\n      \/\/ Specific to the HTML structure you provided\\n      \/<h1[^>]*class=\\\"[^\\\"]*section-header[^\\\"]*\\\"[^>]*>(.*?)<\\\\\/h1>\/s,\\n      \/<h1[^>]*class=\\\"app-title\\\"[^>]*>(.*?)<\\\\\/h1>\/s,\\n      \/<h1[^>]*class=\\\"posting-headline\\\"[^>]*>(.*?)<\\\\\/h1>\/s,\\n      \/<h1[^>]*class=\\\"job-title\\\"[^>]*>(.*?)<\\\\\/h1>\/s,\\n      \/<h1[^>]*id=\\\"job-title\\\"[^>]*>(.*?)<\\\\\/h1>\/s,\\n      \/<h1[^>]*>(.*?)<\\\\\/h1>\/s\\n    ];\\n    \\n    for (const selector of titleSelectors) {\\n      const match = html.match(selector);\\n      if (match) {\\n        jobTitle = match[1].replace(\/<[^>]*>\/g, '').trim();\\n        if (jobTitle && jobTitle.length > 3) break;\\n      }\\n    }\\n  }\\n  \\n  \/\/ Method 4: Extract job description from HTML - UPDATED for your structure\\n  if (!jobDescription) {\\n    const descriptionSelectors = [\\n      \/\/ Specific to the HTML structure you provided\\n      \/<div[^>]*class=\\\"job__description body\\\"[^>]*>(.*?)<\\\\\/div>\\\\s*<div[^>]*class=\\\"job-alert\/s,\\n      \/<div[^>]*class=\\\"job__description body\\\"[^>]*>(.*?)<div[^>]*class=\\\"divider\\\"\/s,\\n      \/<div[^>]*class=\\\"job__description body\\\"[^>]*>(.*?)<div[^>]*class=\\\"application--container\\\"\/s,\\n      \/<div[^>]*class=\\\"job__description body\\\"[^>]*>(.*?)<\\\\\/div>\/s,\\n      \\n      \/\/ Other common Greenhouse patterns\\n      \/<div[^>]*id=\\\"content\\\"[^>]*>(.*?)<\\\\\/div>\/s,\\n      \/<div[^>]*class=\\\"section-wrapper\\\"[^>]*>(.*?)<\\\\\/div>\/s,\\n      \/<div[^>]*class=\\\"posting-content\\\"[^>]*>(.*?)<\\\\\/div>\/s,\\n      \/<div[^>]*class=\\\"job-post-content\\\"[^>]*>(.*?)<\\\\\/div>\/s,\\n      \\n      \/\/ Look for multiple content sections\\n      \/<section[^>]*class=\\\"section\\\"[^>]*>(.*?)<\\\\\/section>\/gs,\\n      \/<div[^>]*class=\\\"section\\\"[^>]*>(.*?)<\\\\\/div>\/gs,\\n      \\n      \/\/ Broader content area\\n      \/<main[^>]*>(.*?)<\\\\\/main>\/s,\\n      \/<article[^>]*>(.*?)<\\\\\/article>\/s\\n    ];\\n    \\n    for (const selector of descriptionSelectors) {\\n      const match = html.match(selector);\\n      if (match) {\\n        let content = match[1].trim();\\n        \\n        \/\/ If using global flag, get all matches and concatenate\\n        if (selector.flags && selector.flags.includes('g')) {\\n          const allMatches = html.match(selector);\\n          if (allMatches && allMatches.length > 0) {\\n            content = allMatches.map(m => \\n              m.replace(\/<section[^>]*class=\\\"section\\\"[^>]*>|<\\\\\/section>\/g, '')\\n               .replace(\/<div[^>]*class=\\\"section\\\"[^>]*>|<\\\\\/div>\/g, '')\\n            ).join('\\\\n\\\\n');\\n          }\\n        }\\n        \\n        \/\/ Clean up common unwanted content\\n        content = content.replace(\/<form[^>]*>.*?<\\\\\/form>\/gs, ''); \/\/ Remove application forms\\n        content = content.replace(\/<div[^>]*class=\\\"[^\\\"]*eeoc[^\\\"]*\\\"[^>]*>.*?<\\\\\/div>\/gs, ''); \/\/ Remove EEOC sections\\n        \\n        \/\/ Filter out if it's too short (likely just location or other metadata)\\n        if (content && content.length > 200) { \/\/ Increased threshold\\n          jobDescription = content;\\n          break;\\n        }\\n      }\\n    }\\n  }\\n}\\n\\n\/\/ === ASHBY EXTRACTION ===\\nif (isAshby) {\\n  \/\/ Try Ashby app data\\n  const ashbyMatch = html.match(\/window\\\\.__ASHBY_JOB_POSTING_APP__\\\\s*=\\\\s*({.*?});\/s);\\n  if (ashbyMatch) {\\n    try {\\n      const appData = JSON.parse(ashbyMatch[1]);\\n      jobTitle = appData.jobPosting?.title;\\n      jobDescription = appData.jobPosting?.descriptionHtml || appData.jobPosting?.description;\\n    } catch (e) {}\\n  }\\n}\\n\\n\/\/ === WORKDAY EXTRACTION ===\\nif (isWorkday) {\\n  \/\/ Workday uses JSON-LD\\n  const jsonLdMatches = html.match(\/<script type=\\\"application\\\\\/ld\\\\+json\\\">(.*?)<\\\\\/script>\/gs);\\n  if (jsonLdMatches) {\\n    for (const match of jsonLdMatches) {\\n      try {\\n        const content = match.match(\/<script type=\\\"application\\\\\/ld\\\\+json\\\">(.*?)<\\\\\/script>\/s)[1];\\n        const jsonLd = JSON.parse(content);\\n        if (jsonLd['@type'] === 'JobPosting') {\\n          jobTitle = jsonLd.title;\\n          jobDescription = jsonLd.description;\\n          break;\\n        }\\n      } catch (e) {}\\n    }\\n  }\\n}\\n\\n\/\/ === LEVER EXTRACTION ===\\nif (isLever) {\\n  \/\/ Try Lever's data structure\\n  const leverMatch = html.match(\/window\\\\._LEVER_STATE\\\\s*=\\\\s*({.*?});\/s);\\n  if (leverMatch) {\\n    try {\\n      const leverData = JSON.parse(leverMatch[1]);\\n      jobTitle = leverData.posting?.text;\\n      jobDescription = leverData.posting?.descriptionHtml || leverData.posting?.description;\\n    } catch (e) {}\\n  }\\n  \\n  \/\/ Fallback to page structure\\n  if (!jobTitle) {\\n    const titleMatch = html.match(\/<h2[^>]*class=\\\"posting-headline\\\"[^>]*>(.*?)<\\\\\/h2>\/s);\\n    if (titleMatch) jobTitle = titleMatch[1].replace(\/<[^>]*>\/g, '').trim();\\n  }\\n  \\n  if (!jobDescription) {\\n    const descMatch = html.match(\/<div[^>]*class=\\\"section page-centered\\\"[^>]*>(.*?)<div class=\\\"section page-centered last-section-apply\\\">\/s);\\n    if (descMatch) jobDescription = descMatch[1].trim();\\n  }\\n}\\n\\n\/\/ === GENERIC FALLBACKS (for all platforms) ===\\nif (!jobTitle || !jobDescription) {\\n  \/\/ Try JSON-LD\\n  const jsonLdMatches = html.match(\/<script type=\\\"application\\\\\/ld\\\\+json\\\">(.*?)<\\\\\/script>\/gs);\\n  if (jsonLdMatches) {\\n    for (const match of jsonLdMatches) {\\n      try {\\n        const content = match.match(\/<script type=\\\"application\\\\\/ld\\\\+json\\\">(.*?)<\\\\\/script>\/s)[1];\\n        const jsonLd = JSON.parse(content);\\n        if (jsonLd['@type'] === 'JobPosting') {\\n          jobTitle = jobTitle || jsonLd.title;\\n          jobDescription = jobDescription || jsonLd.description;\\n        }\\n      } catch (e) {}\\n    }\\n  }\\n  \\n  \/\/ Try Open Graph meta tags\\n  if (!jobTitle) {\\n    const ogTitleMatch = html.match(\/<meta property=\\\"og:title\\\" content=\\\"([^\\\"]*)\\\"\/);\\n    if (ogTitleMatch) jobTitle = ogTitleMatch[1];\\n  }\\n  \\n  if (!jobDescription) {\\n    const ogDescMatch = html.match(\/<meta property=\\\"og:description\\\" content=\\\"([^\\\"]*)\\\"\/);\\n    if (ogDescMatch) jobDescription = ogDescMatch[1];\\n  }\\n  \\n  \/\/ Try regular meta tags\\n  if (!jobDescription) {\\n    const metaDescMatch = html.match(\/<meta name=\\\"description\\\" content=\\\"([^\\\"]*)\\\"\/);\\n    if (metaDescMatch) jobDescription = metaDescMatch[1];\\n  }\\n  \\n  \/\/ Try page title as last resort\\n  if (!jobTitle) {\\n    const pageTitleMatch = html.match(\/<title>(.*?)<\\\\\/title>\/);\\n    if (pageTitleMatch) {\\n      jobTitle = pageTitleMatch[1]\\n        .replace(\/\\\\s*[-|]\\\\s*(Ashby|Greenhouse|Workday|Lever|Jobs|Careers).*$\/i, '')\\n        .trim();\\n    }\\n  }\\n}\\n\\n\/\/ Debug logging for Greenhouse\\nif (isGreenhouse) {\\n  console.log('Greenhouse extraction results:');\\n  console.log('Title found:', !!jobTitle);\\n  console.log('Title:', jobTitle);\\n  console.log('Description found:', !!jobDescription);\\n  console.log('Description length:', jobDescription ? jobDescription.length : 0);\\n  if (jobDescription) {\\n    console.log('Description preview:', jobDescription.substring(0, 200) + '...');\\n  }\\n}\\n\\nreturn {\\n  url: url,\\n  jobTitle: jobTitle,\\n  jobDescription: jobDescription,\\n  platform: isGreenhouse ? 'Greenhouse' : isAshby ? 'Ashby' : isWorkday ? 'Workday' : isLever ? 'Lever' : platformFromUrl\\n};\"\n      },\n      \"type\": \"n8n-nodes-base.code\",\n      \"typeVersion\": 2,\n      \"position\": [\n        -1488,\n        192\n      ],\n      \"id\": \"2606cc9d-e500-47b2-bad6-b714b6033af5\",\n      \"name\": \"Extract Job Info\"\n    },\n    {\n      \"parameters\": {\n        \"jsCode\": \"\/\/ Get the URL from the input\\nconst inputUrl = $input.first().json.url;\\nconst inputPageTitle = $input.first().json.pageTitle;\\n\\nfunction normalizeUrl(url) {\\n  \/\/ Convert http:\/\/ to https:\/\/ to reduce duplicates\\n  let normalizedUrl = url.replace(\/^http:\\\\\/\\\\\/\/i, 'https:\/\/');\\n  \\n  \/\/ Split URL into base and query string\\n  const [baseUrl, queryString] = normalizedUrl.split('?');\\n  \\n  \/\/ Handle Workday URLs specifically\\n  let normalizedBase;\\n  if (baseUrl.includes('myworkdayjobs.com')) {\\n    \/\/ Remove \/apply and everything after it\\n    normalizedBase = baseUrl.replace(\/\\\\\/apply.*$\/, '');\\n  } else {\\n    \/\/ For other domains, remove \/application and \/apply only at the end\\n    normalizedBase = baseUrl.replace(\/\\\\\/application\\\\\/?$\/, '').replace(\/\\\\\/apply\\\\\/?$\/, '');\\n  }\\n  \\n  \/\/ Check if it's a greenhouse.io domain\\n  const isGreenhouse = normalizedBase.includes('greenhouse.io');\\n  \\n  if (queryString) {\\n    \/\/ Parse parameters\\n    const params = queryString.split('&');\\n    const keepParams = [];\\n    \\n    if (isGreenhouse) {\\n      \/\/ For greenhouse.io, keep 'token' and 'gh_jid'\\n      const tokenParam = params.find(param => param.startsWith('token='));\\n      const ghJidParam = params.find(param => param.startsWith('gh_jid='));\\n      \\n      if (tokenParam) keepParams.push(tokenParam);\\n      if (ghJidParam) keepParams.push(ghJidParam);\\n    } else {\\n      \/\/ For other domains, keep only 'gh_jid'\\n      const ghJidParam = params.find(param => param.startsWith('gh_jid='));\\n      if (ghJidParam) keepParams.push(ghJidParam);\\n    }\\n    \\n    \/\/ Return URL with preserved parameters if any\\n    if (keepParams.length > 0) {\\n      return normalizedBase + '?' + keepParams.join('&');\\n    }\\n  }\\n  \\n  \/\/ Return URL without query parameters\\n  return normalizedBase;\\n}\\n\\n\/\/ Return the normalized URL\\nreturn { \\n  url: inputUrl,\\n  normalizedUrl: normalizeUrl(inputUrl),\\n  pageTitle: inputPageTitle\\n};\"\n      },\n      \"type\": \"n8n-nodes-base.code\",\n      \"typeVersion\": 2,\n      \"position\": [\n        -1760,\n        -80\n      ],\n      \"id\": \"87af0d4c-216e-4aac-a1cf-6ff52febac38\",\n      \"name\": \"Normalize URL\"\n    },\n    {\n      \"parameters\": {\n        \"conditions\": {\n          \"options\": {\n            \"caseSensitive\": true,\n            \"leftValue\": \"\",\n            \"typeValidation\": \"strict\",\n            \"version\": 2\n          },\n          \"conditions\": [\n            {\n              \"id\": \"9e2f57fb-d16e-45c1-a63d-76f00aa192fe\",\n              \"leftValue\": \"={{$json.jobDescription}}\",\n              \"rightValue\": \"\",\n              \"operator\": {\n                \"type\": \"string\",\n                \"operation\": \"notEmpty\",\n                \"singleValue\": true\n              }\n            }\n          ],\n          \"combinator\": \"or\"\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.if\",\n      \"typeVersion\": 2.2,\n      \"position\": [\n        -1328,\n        192\n      ],\n      \"id\": \"fefd8055-16cd-4a75-a567-20743351d049\",\n      \"name\": \"IsAvailable\"\n    },\n    {\n      \"parameters\": {\n        \"conditions\": {\n          \"options\": {\n            \"caseSensitive\": true,\n            \"leftValue\": \"\",\n            \"typeValidation\": \"strict\",\n            \"version\": 2\n          },\n          \"conditions\": [\n            {\n              \"id\": \"9e2f57fb-d16e-45c1-a63d-76f00aa192fe\",\n              \"leftValue\": \"={{$input.item}}\",\n              \"rightValue\": \"\",\n              \"operator\": {\n                \"type\": \"object\",\n                \"operation\": \"notEmpty\",\n                \"singleValue\": true\n              }\n            },\n            {\n              \"id\": \"2e54b056-7898-440f-9888-2c49a238a3a1\",\n              \"leftValue\": \"={{ Object.keys($json).length }}\",\n              \"rightValue\": 0,\n              \"operator\": {\n                \"type\": \"number\",\n                \"operation\": \"gt\"\n              }\n            }\n          ],\n          \"combinator\": \"and\"\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.if\",\n      \"typeVersion\": 2.2,\n      \"position\": [\n        -1312,\n        -80\n      ],\n      \"id\": \"873494b2-be76-4094-8aad-1ab6019f6eba\",\n      \"name\": \"IsAppFound\"\n    },\n    {\n      \"parameters\": {\n        \"modelId\": {\n          \"__rl\": true,\n          \"value\": \"claude-sonnet-4-20250514\",\n          \"mode\": \"list\",\n          \"cachedResultName\": \"claude-sonnet-4-20250514\"\n        },\n        \"messages\": {\n          \"values\": [\n            {\n              \"content\": \"=LLM Instructions\\n\\n=== Job Description ===\\n{{ $json.jobDescription }}\\n\"\n            }\n          ]\n        },\n        \"simplify\": false,\n        \"options\": {\n          \"maxTokens\": 2048\n        }\n      },\n      \"type\": \"@n8n\/n8n-nodes-langchain.anthropic\",\n      \"typeVersion\": 1,\n      \"position\": [\n        -1056,\n        176\n      ],\n      \"id\": \"149d56c7-7fce-444e-98b9-999f2899b7a0\",\n      \"name\": \"Analyze Job Posting\",\n      \"alwaysOutputData\": true,\n      \"credentials\": {\n        \"anthropicApi\": {\n          \"id\": \"b2t5bCSNzJQoUeG0\",\n          \"name\": \"Anthropic account\"\n        }\n      },\n      \"onError\": \"continueErrorOutput\"\n    },\n    {\n      \"parameters\": {\n        \"schema\": {\n          \"__rl\": true,\n          \"mode\": \"list\",\n          \"value\": \"public\"\n        },\n        \"table\": {\n          \"__rl\": true,\n          \"value\": \"applications\",\n          \"mode\": \"list\",\n          \"cachedResultName\": \"applications\"\n        },\n        \"columns\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"normalized_url\": \"={{ $('Normalize URL').first().json.normalizedUrl }}\",\n            \"job_description_link\": \"={{ $('Normalize URL').first().json.url }}\",\n            \"platform\": \"={{ $('Extract Job Info').item.json.platform }}\",\n            \"job_description_text\": \"={{ $('Extract Job Info').item.json.jobDescription }}\",\n            \"notes\": \"={{ $json.reasoning }}\",\n            \"green_flags\": \"={{ $json.green_flags.join(\\\"; \\\") }}\",\n            \"red_flags\": \"={{ $json.red_flags.join(\\\"; \\\") }}\",\n            \"date_identified\": \"={{  $now.format('MM\/dd\/yyyy') }}\",\n            \"position\": \"={{ $json.job_title }}\",\n            \"company\": \"={{ $json.company }}\",\n            \"status\": \"={{ $if($json.relevant, \\\"Found by Agent\\\", \\\"Ignore\\\" ) }}\",\n            \"source\": \"AI Agent\"\n          },\n          \"matchingColumns\": [\n            \"id\"\n          ],\n          \"schema\": [\n            {\n              \"id\": \"id\",\n              \"displayName\": \"id\",\n              \"required\": false,\n              \"defaultMatch\": true,\n              \"display\": true,\n              \"type\": \"number\",\n              \"canBeUsedToMatch\": true,\n              \"removed\": true\n            },\n            {\n              \"id\": \"company\",\n              \"displayName\": \"company\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"position\",\n              \"displayName\": \"position\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"date_identified\",\n              \"displayName\": \"date_identified\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"date_applied\",\n              \"displayName\": \"date_applied\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"decision_date\",\n              \"displayName\": \"decision_date\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"status\",\n              \"displayName\": \"status\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"job_description_link\",\n              \"displayName\": \"job_description_link\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"notes\",\n              \"displayName\": \"notes\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"source\",\n              \"displayName\": \"source\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"job_description_text\",\n              \"displayName\": \"job_description_text\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"green_flags\",\n              \"displayName\": \"green_flags\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"red_flags\",\n              \"displayName\": \"red_flags\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"normalized_url\",\n              \"displayName\": \"normalized_url\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"platform\",\n              \"displayName\": \"platform\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"created_at\",\n              \"displayName\": \"created_at\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"updated_at\",\n              \"displayName\": \"updated_at\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": false\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.postgres\",\n      \"typeVersion\": 2.6,\n      \"position\": [\n        -576,\n        160\n      ],\n      \"id\": \"ee633190-1db6-4741-bfe5-d707ba142d82\",\n      \"name\": \"Add new JD\",\n      \"credentials\": {\n        \"postgres\": {\n          \"id\": \"C7c4IpIHOXEL7fNA\",\n          \"name\": \"Postgres account\"\n        }\n      }\n    },\n    {\n      \"parameters\": {\n        \"schema\": {\n          \"__rl\": true,\n          \"mode\": \"list\",\n          \"value\": \"public\"\n        },\n        \"table\": {\n          \"__rl\": true,\n          \"value\": \"applications\",\n          \"mode\": \"list\",\n          \"cachedResultName\": \"applications\"\n        },\n        \"columns\": {\n          \"mappingMode\": \"defineBelow\",\n          \"value\": {\n            \"normalized_url\": \"={{ $('Normalize URL').first().json.normalizedUrl }}\",\n            \"job_description_link\": \"={{ $('Normalize URL').first().json.url }}\",\n            \"platform\": \"={{ $('Extract Job Info').item.json.platform }}\",\n            \"job_description_text\": \"=N\/A\",\n            \"notes\": \"=\",\n            \"green_flags\": \"=\",\n            \"red_flags\": \"=\",\n            \"date_identified\": \"={{  $now.format('MM\/dd\/yyyy') }}\",\n            \"position\": \"={{ $('Normalize URL').first().json.pageTitle }}\",\n            \"company\": \"Unknown\",\n            \"status\": \"Ignore - Not Found\",\n            \"source\": \"AI Agent\"\n          },\n          \"matchingColumns\": [\n            \"id\"\n          ],\n          \"schema\": [\n            {\n              \"id\": \"id\",\n              \"displayName\": \"id\",\n              \"required\": false,\n              \"defaultMatch\": true,\n              \"display\": true,\n              \"type\": \"number\",\n              \"canBeUsedToMatch\": true,\n              \"removed\": true\n            },\n            {\n              \"id\": \"company\",\n              \"displayName\": \"company\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"position\",\n              \"displayName\": \"position\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"date_identified\",\n              \"displayName\": \"date_identified\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"date_applied\",\n              \"displayName\": \"date_applied\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"decision_date\",\n              \"displayName\": \"decision_date\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"status\",\n              \"displayName\": \"status\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"job_description_link\",\n              \"displayName\": \"job_description_link\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"notes\",\n              \"displayName\": \"notes\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"source\",\n              \"displayName\": \"source\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"job_description_text\",\n              \"displayName\": \"job_description_text\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"green_flags\",\n              \"displayName\": \"green_flags\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"red_flags\",\n              \"displayName\": \"red_flags\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"normalized_url\",\n              \"displayName\": \"normalized_url\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"platform\",\n              \"displayName\": \"platform\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"string\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"created_at\",\n              \"displayName\": \"created_at\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            },\n            {\n              \"id\": \"updated_at\",\n              \"displayName\": \"updated_at\",\n              \"required\": false,\n              \"defaultMatch\": false,\n              \"display\": true,\n              \"type\": \"dateTime\",\n              \"canBeUsedToMatch\": true\n            }\n          ],\n          \"attemptToConvertTypes\": false,\n          \"convertFieldsToString\": false\n        },\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.postgres\",\n      \"typeVersion\": 2.6,\n      \"position\": [\n        -576,\n        0\n      ],\n      \"id\": \"c28cfb93-a92a-45bc-8191-2337b807645b\",\n      \"name\": \"Add invalid JD\",\n      \"credentials\": {\n        \"postgres\": {\n          \"id\": \"C7c4IpIHOXEL7fNA\",\n          \"name\": \"Postgres account\"\n        }\n      }\n    },\n    {\n      \"parameters\": {\n        \"operation\": \"select\",\n        \"schema\": {\n          \"__rl\": true,\n          \"mode\": \"list\",\n          \"value\": \"public\"\n        },\n        \"table\": {\n          \"__rl\": true,\n          \"value\": \"applications\",\n          \"mode\": \"list\",\n          \"cachedResultName\": \"applications\"\n        },\n        \"limit\": 5,\n        \"where\": {\n          \"values\": [\n            {\n              \"column\": \"job_description_link\",\n              \"value\": \"={{ $json.normalizedUrl }}\"\n            },\n            {\n              \"column\": \"normalized_url\",\n              \"value\": \"={{ $json.normalizedUrl }}\"\n            }\n          ]\n        },\n        \"combineConditions\": \"OR\",\n        \"options\": {}\n      },\n      \"type\": \"n8n-nodes-base.postgres\",\n      \"typeVersion\": 2.6,\n      \"position\": [\n        -1536,\n        -80\n      ],\n      \"id\": \"f08012bb-f10e-4fb3-ac26-0b49d2c86b6a\",\n      \"name\": \"Test If Seen Before\",\n      \"alwaysOutputData\": true,\n      \"credentials\": {\n        \"postgres\": {\n          \"id\": \"C7c4IpIHOXEL7fNA\",\n          \"name\": \"Postgres account\"\n        }\n      }\n    }\n  ],\n  \"connections\": {\n    \"When Executed by Another Workflow\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Normalize URL\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ],\n        [\n          {\n            \"node\": \"No Operation, do nothing\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"No Operation, do nothing\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Return_Error\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Cleanup JSON\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Add new JD\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"When clicking \u2018Execute workflow\u2019\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Set Proxy Data\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Set Proxy Data\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Normalize URL\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"HTTP Request\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Extract Job Info\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Extract Job Info\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"IsAvailable\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Normalize URL\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Test If Seen Before\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"IsAvailable\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Analyze Job Posting\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ],\n        [\n          {\n            \"node\": \"Add invalid JD\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"IsAppFound\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Return_Existing\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ],\n        [\n          {\n            \"node\": \"HTTP Request\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Analyze Job Posting\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Cleanup JSON\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ],\n        [\n          {\n            \"node\": \"No Operation, do nothing\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Add new JD\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Return_New\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Add invalid JD\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"Return_Existing\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    },\n    \"Test If Seen Before\": {\n      \"main\": [\n        [\n          {\n            \"node\": \"IsAppFound\",\n            \"type\": \"main\",\n            \"index\": 0\n          }\n        ]\n      ]\n    }\n  },\n  \"pinData\": {},\n  \"meta\": {\n    \"templateCredsSetupCompleted\": true,\n    \"instanceId\": \"0bae1fab76f5b3d7d761d2213eecaaf39f2590bd0b5cd104d1482f6fd0bab96b\"\n  }\n}\r\n    <\/script>\r\n    \r\n    <n8n-demo id=\"workflow-demo-69f182da86255\"><\/n8n-demo>\r\n    \r\n    <script>\r\n    document.addEventListener(\"DOMContentLoaded\", function() {\r\n        const jsonElement = document.getElementById(\"workflow-json-69f182da86254\");\r\n        const workflowElement = document.getElementById(\"workflow-demo-69f182da86255\");\r\n        \r\n        if (jsonElement && workflowElement) {\r\n            const workflowData = jsonElement.textContent.trim();\r\n            workflowElement.setAttribute(\"workflow\", workflowData);\r\n        }\r\n    });\r\n    <\/script>\n\n\n<p>A few design notes on this sub-workflow and the learnings that drove them:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>I normalize the job board URLs to help spot variations and to prevent processing '\/apply\/*' URLs and URLs with a variety of query parameters that do tend to show up in search results.<\/li>\n\n\n\n<li>I test if I've seen the URL before again here after normalizing the URL to help conserve AI tokens and to save the data store from adding a lot of duplicate data.<\/li>\n\n\n\n<li>I do the HTTP Request and JD extraction outside of the LLM for a few reasons: \n<ul class=\"wp-block-list\">\n<li>It significantly reduces the number of input tokens <\/li>\n\n\n\n<li>It allows for use of hosted LLMs like the Nebius AI Studio that may not have web access<\/li>\n\n\n\n<li>Some job boards blocked LLMs from reading\/scraping the post for analysis<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>The LLM call (in my case, to Claude) should be detailed in what you want it to do and the data that you want back from it. Although I've simplified the prompt it should be sufficient to help you define your workflow.<\/li>\n\n\n\n<li>I have two dataset insert calls because I use different strings for (a) JDs that have expired or have no information, and (b) JDs that have LLM feedback in them.<\/li>\n<\/ul>\n\n\n\n<p>And I continue do weekly tweaks the nodes in this sub-workflow - the URL normalization, the HTML retrieval, and the LLM instructions. I do this by watching the performance and adjusting the assumptions in the code. And over time, my tweaking workflow uses Claude as my coding assistant\/copilot.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">PostgreSQL Database<\/h3>\n\n\n\n<p>I store all of my data in PostgreSQL. I originally stored it in Airtable, but my projects have exceeded the number of API calls available in the free tier plan. <\/p>\n\n\n\n<p>To use Airtable, use the <a href=\"https:\/\/github.com\/cliff-simpkins\/blog-content\/tree\/main\/n8n-job-boards\">workflows in the GH repository<\/a> and replace the Postgres nodes with their Airtable equivalents. The GH workflows still have the Airtable nodes within the workflows, they just aren't wired into the workflow currently.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Data Schema<\/h5>\n\n\n\n<p>I'm storing everything from n8n in a single database table - 'applications' - and I have a number of views constructed on top of to filter data down for jobs to be done. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE IF NOT EXISTS public.applications\n(\n    id integer NOT NULL DEFAULT nextval('applications_id_seq'::regclass),\n    company character varying(255) COLLATE pg_catalog.\"default\",\n    \"position\" text COLLATE pg_catalog.\"default\",\n    date_identified date,\n    date_applied date,\n    decision_date date,\n    status character varying(50) COLLATE pg_catalog.\"default\" NOT NULL DEFAULT 'New'::character varying,\n    job_description_link text COLLATE pg_catalog.\"default\",\n    notes text COLLATE pg_catalog.\"default\",\n    source character varying(50) COLLATE pg_catalog.\"default\",\n    job_description_text text COLLATE pg_catalog.\"default\",\n    green_flags text COLLATE pg_catalog.\"default\",\n    red_flags text COLLATE pg_catalog.\"default\",\n    normalized_url text COLLATE pg_catalog.\"default\",\n    platform character varying(50) COLLATE pg_catalog.\"default\",\n    created_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP,\n    updated_at timestamp with time zone DEFAULT CURRENT_TIMESTAMP,\n    CONSTRAINT applications_pkey PRIMARY KEY (id)\n)<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">Database Configuration<\/h5>\n\n\n\n<p>A few quick notes about setting up your database:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Create a user that is dedicated to the AI Agent and only has access to the one table, and use a complicated, one-time-use password (duh ^_^ ).<\/li>\n\n\n\n<li>If you're running this at home and exposing this externally, configure your router to limit who can get to what on your home network.<\/li>\n\n\n\n<li>Create views to work with the data (e.g., triaging new JDs, tracking applications in-flight, etc.), and do this from a different user to enable better logging of who is doing what in your database.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Claude LLM: My Career Coach<\/h3>\n\n\n\n<p>The <a href=\"https:\/\/docs.n8n.io\/integrations\/builtin\/app-nodes\/n8n-nodes-langchain.anthropic\/\">Anthropic AI node<\/a> makes it easy to out to Claude and is fairly straightforward. <\/p>\n\n\n\n<p>A few notes worth calling out:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use your LLM of choice - you'll need to setup an API account as you can't use your Pro subscription<\/li>\n\n\n\n<li>Constantly review and refine your prompt - I revise mine every couple of weeks<\/li>\n\n\n\n<li>After each prompt revision, pass it JDs that you think should be in that grey zone of 'maybe a fit' and see how it responds.<\/li>\n<\/ul>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>Below is a generalized version of my current prompt that I use, which is also available on <a href=\"https:\/\/github.com\/cliff-simpkins\/blog-content\/blob\/main\/n8n-job-boards\/04a%20-%20LLM%20Prompt.md\">GitHub<\/a>.<\/summary>\n<pre class=\"wp-block-code\"><code>You are a career coach evaluating job opportunities for a<em> &lt;role&gt;<\/em>(<em>n<\/em> years experience, <em>&lt;level&gt;<\/em>-level) seeking <em>&lt;seniority&gt;<\/em> roles in <em>&lt;job roles&gt;<\/em>. The candidate has strong &lt;type&gt; experience but gets rejected for <em>&lt;reasons&gt;<\/em>.\n\nParse the passed job title and job description and analyze it against the STRICT criteria and the guidelines below, and document your evaluation using JSON.\n\n\nREQUIRED CRITERIA (ALL must be met):\n1. Experience: <em>n<\/em>+ years minimum (prefer <em>m<\/em>+). Exception: <em>&lt;title&gt;<\/em> roles at smaller companies (&lt;500 employees) requiring <em>k<\/em>+ years for exceptional <em>&lt;discipline&gt;<\/em> skill-building opportunities \n2. Seniority: <em>&lt;titles&gt;<\/em> level. Exception: <em>&lt;title&gt;<\/em> roles at smaller companies (&lt;500 employees) for exceptional skill-building opportunities in <em>&lt;discipline&gt;<\/em>-focused roles.\n3. Function: &lt;job functions&gt;\n4. Audience: <em>&lt;important to me; you can replace with tech stack if developer&gt;<\/em>\n5. Location: United States, Canada, or explicit remote-first for US timezones\n6. Background Fit: Role should leverage <em>&lt;skillsets&gt;<\/em>, but roles requiring <em>&lt;skillsets or environments&gt;<\/em> are poor fits.\n\nAUTOMATIC DISQUALIFIERS:\n- <em>&lt;level or seniority&gt;<\/em>\n- Missing\/expired job descriptions\n- <em>&lt;audience; tech stack&gt;<\/em>\n- Europe\/APAC only positions\n- Contract\/temp roles\n- Agencies, consulting firms, non-product companies\n- <em>&lt;vertials&gt;<\/em> companies\n- Roles explicitly requiring <em>&lt;flags you typically don't do well with&gt;<\/em> or specialized domain expertise that I don't have\n- &gt;8 \"must have\" requirements (unicorn roles)\n- Inclusion of unprofessional language - \"ninja\", \"rockstar\", or similar\n- Companies with recent layoffs\/hiring freezes\n\n\nCOMPANY STAGE GUIDANCE:\n- Series C+\/Enterprise: Strong fit (enterprise background advantage)\n- Series B: Acceptable but flag startup experience requirements\n- Series A\/Earlier: Generally poor fit unless exceptional\n- Smaller Companies (&lt;500 employees): IC or small team roles acceptable for &lt;role&gt; skill development if strong domain fit and growth potential\n\n\nREASONING MUST ADDRESS:\n- Which criteria are met\/failed specifically\n- Background alignment with role requirements\n- Whether this represents career advancement\n- Likelihood of rejection for common patterns (<em>&lt;list&gt;<\/em>)\n- Company stage fit assessment\n- Any significant red flags or green flags\n- Whether role requirements seem realistic vs unicorn-seeking\n- Recognize that team leadership and cross-functional skills transfer across marketing disciplines\n\n\nMARKET REALITY CHECKS:\n- Flag if role seems designed for internal promotion vs external hire\n- Note if requirements suggest they want someone 5-10 years younger\n- Identify if role combines multiple specializations unrealistically\n\n\nPoor reasoning: \"Good fit for marketing role\"\nGood reasoning: \"Strong match. VP-level requiring 12+ years PMM experience at Series C developer platform company. Clear advancement from current VP level with domain expertise advantage.\"\n\n\n\nOUTPUT FORMAT:\nValid JSON only, no markdown\/code blocks:\n\n{\n  \"relevant\": boolean,\n  \"company\": \"string\",\n  \"job_title\": \"string\", \n  \"reasoning\": \"string - 2-3 sentences with specific criterion references\",\n  \"experience_requirement\": \"string - exact years or 'not specified'\",\n  \"green_flags\": &#91;\"array of positive indicators\"],\n  \"red_flags\": &#91;\"array of concerning elements\"]\n}\n\n\n\nEXAMPLES:\n\n{\n  \"relevant\": true,\n  \"company\": \"BigCoForDevs\",\n  \"job_title\": \"VP, Developer Marketing &amp; Ecosystem\",\n  \"reasoning\": \"Strong match. VP-level role requiring 10+ years experience at established platform company targeting developers. Leverages DevRel background without requiring pure PMM specialization.\",\n  \"experience_requirement\": \"10+ years\",\n  \"green_flags\": &#91;\"VP level\", \"Developer-focused\", \"Platform company\", \"Enterprise stage\"],\n  \"red_flags\": &#91;]\n}\n\n{\n  \"relevant\": false,\n  \"company\": \"StartupXYZ\", \n  \"job_title\": \"Head of Product Marketing\",\n  \"reasoning\": \"Rejected. Explicitly requires Series B scaling experience and pure PMM background. High likelihood of 'insufficient startup leadership' rejection based on candidate's enterprise background.\",\n  \"experience_requirement\": \"8+ years\",\n  \"green_flags\": &#91;\"Head level\", \"8+ years requirement\"],\n  \"red_flags\": &#91;\"Requires Series B experience\", \"Pure PMM background required\"]\n}\n\n{\n  \"relevant\": false,\n  \"company\": \"TechCorp\",\n  \"job_title\": \"Director of Product Marketing\",\n  \"reasoning\": \"Rejected. Role requires 10+ must-have qualifications including fintech domain expertise, Series A leadership, and pure PMM background. Unicorn requirements suggest unrealistic expectations.\",\n  \"experience_requirement\": \"8+ years\",\n  \"green_flags\": &#91;\"Director level\", \"Developer audience\"],\n  \"red_flags\": &#91;\"Unicorn requirements (10+ must-haves)\", \"Domain expertise gaps\", \"Unrealistic combination\"]\n}\n\n{\n  \"relevant\": true,\n  \"company\": \"DevTools Startup\",\n  \"job_title\": \"Senior Product Marketing Manager\",\n  \"reasoning\": \"Acceptable step-back opportunity. Senior Manager role at 150-person developer tools company offers strong PMM skill development in target domain. Small team leadership component with clear growth path as company scales.\",\n  \"experience_requirement\": \"5+ years\",\n  \"green_flags\": &#91;\"Developer-focused\", \"PMM skill building\", \"Growth stage company\", \"Domain expertise match\"],\n  \"red_flags\": &#91;\"Step back in seniority\"]\n}\n\n=== Job Title ===\n{{ $json.jobTitle }}\n\n=== Job Description ===\n{{ $json.jobDescription }}\n<\/code><\/pre>\n<\/details>\n\n\n\n<h3 class=\"wp-block-heading\">Triage, Triage, Triage<\/h3>\n\n\n\n<p>Once created, configured, and activated, the workflow should check the job boards for you every day, and highlight potential role fits. After working with my Job Search Agent for a few months, here are a few notes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Review and triage what the agent processed - I recommend still opening up each new job posting:\n<ul class=\"wp-block-list\">\n<li>Not all 'Ignore - not found' are really unavailable and may simply have some more interesting\/complicated HTML or scripts on the page.<\/li>\n\n\n\n<li>Sometimes the LLM will raise a false positive or false negative - treat the LLM summary as data points and not a final decision<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li> Review and revise the prompt as you interview - give it flags to look for and update what you want as you learn more about yourself on your journey<\/li>\n<\/ul>\n\n\n\n<p>And, as I mentioned at the beginning of the post, this is just the start of the job hunt. Once you have some qualified roles in hand, you can <a href=\"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/14\/how-to-use-claude-in-a-job-search\/\">use your trusty LLM to dig in deeper for career fit and to help you tailor your resume and cover letters<\/a>. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Good luck!<\/h3>\n\n\n\n<p>Good luck on your journey and I hope that this workflow helps you. For me, this agent has been a labor of love and a great learning experience - I hope that it can help others.<\/p>\n\n\n\n<p>If you have feedback, questions, or concerns - feel free to send me a DM over LinkedIn or post in the comments below. I plan to keep this page up-to-date as the agent evolves, and I'd love to incorporate learnings from others.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>After several months of frustration searching for new job postings &#8211; I started using n8n to search the job boards. This post focuses on how it&#8217;s built, and links to&hellip;<\/p>\n","protected":false},"author":1,"featured_media":511,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[28,29],"tags":[25],"class_list":["post-505","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-job-search","category-n8n","tag-tips-tricks"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to use n8n to Search Job Boards - Cliff Simpkins<\/title>\n<meta name=\"description\" content=\"How I use n8n to search job boards and find relevant roles. This post documents how I do it and provides code and DB schemas to get you started.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to use n8n to Search Job Boards - Cliff Simpkins\" \/>\n<meta property=\"og:description\" content=\"How I use n8n to search job boards and find relevant roles. This post documents how I do it and provides code and DB schemas to get you started.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/\" \/>\n<meta property=\"og:site_name\" content=\"Cliff Simpkins\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-28T23:57:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-30T20:44:47+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/2025-10-LI-n8n-for-job-searching.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1436\" \/>\n\t<meta property=\"og:image:height\" content=\"740\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"cliff.simpkins\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"cliff.simpkins\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/\"},\"author\":{\"name\":\"cliff.simpkins\",\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/#\\\/schema\\\/person\\\/bba546ac4d77da1fb51bc4030238e864\"},\"headline\":\"How to use n8n to Search Job Boards\",\"datePublished\":\"2025-10-28T23:57:10+00:00\",\"dateModified\":\"2025-10-30T20:44:47+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/\"},\"wordCount\":1541,\"commentCount\":2,\"image\":{\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/simpkins.social\\\/cliff\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/2025-10-LI-n8n-for-job-searching.png?fit=1436%2C740&ssl=1\",\"keywords\":[\"Tips &amp; Tricks\"],\"articleSection\":[\"Job Search\",\"N8n\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/\",\"url\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/\",\"name\":\"How to use n8n to Search Job Boards - Cliff Simpkins\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/simpkins.social\\\/cliff\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/2025-10-LI-n8n-for-job-searching.png?fit=1436%2C740&ssl=1\",\"datePublished\":\"2025-10-28T23:57:10+00:00\",\"dateModified\":\"2025-10-30T20:44:47+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/#\\\/schema\\\/person\\\/bba546ac4d77da1fb51bc4030238e864\"},\"description\":\"How I use n8n to search job boards and find relevant roles. This post documents how I do it and provides code and DB schemas to get you started.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/simpkins.social\\\/cliff\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/2025-10-LI-n8n-for-job-searching.png?fit=1436%2C740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/simpkins.social\\\/cliff\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/2025-10-LI-n8n-for-job-searching.png?fit=1436%2C740&ssl=1\",\"width\":1436,\"height\":740},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/2025\\\/10\\\/28\\\/how-to-use-n8n-to-search-job-boards\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to use n8n to Search Job Boards\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/#website\",\"url\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/\",\"name\":\"Cliff Simpkins\",\"description\":\"Personal site + blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/#\\\/schema\\\/person\\\/bba546ac4d77da1fb51bc4030238e864\",\"name\":\"cliff.simpkins\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/07b113647e819a448cfc8545b476db50a641b9d43808a2c399af84e724d078d2?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/07b113647e819a448cfc8545b476db50a641b9d43808a2c399af84e724d078d2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/07b113647e819a448cfc8545b476db50a641b9d43808a2c399af84e724d078d2?s=96&d=mm&r=g\",\"caption\":\"cliff.simpkins\"},\"url\":\"https:\\\/\\\/simpkins.social\\\/cliff\\\/blog\\\/author\\\/cliff-simpkins\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to use n8n to Search Job Boards - Cliff Simpkins","description":"How I use n8n to search job boards and find relevant roles. This post documents how I do it and provides code and DB schemas to get you started.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/","og_locale":"en_US","og_type":"article","og_title":"How to use n8n to Search Job Boards - Cliff Simpkins","og_description":"How I use n8n to search job boards and find relevant roles. This post documents how I do it and provides code and DB schemas to get you started.","og_url":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/","og_site_name":"Cliff Simpkins","article_published_time":"2025-10-28T23:57:10+00:00","article_modified_time":"2025-10-30T20:44:47+00:00","og_image":[{"width":1436,"height":740,"url":"https:\/\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/2025-10-LI-n8n-for-job-searching.png","type":"image\/png"}],"author":"cliff.simpkins","twitter_card":"summary_large_image","twitter_misc":{"Written by":"cliff.simpkins","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/#article","isPartOf":{"@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/"},"author":{"name":"cliff.simpkins","@id":"https:\/\/simpkins.social\/cliff\/#\/schema\/person\/bba546ac4d77da1fb51bc4030238e864"},"headline":"How to use n8n to Search Job Boards","datePublished":"2025-10-28T23:57:10+00:00","dateModified":"2025-10-30T20:44:47+00:00","mainEntityOfPage":{"@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/"},"wordCount":1541,"commentCount":2,"image":{"@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/2025-10-LI-n8n-for-job-searching.png?fit=1436%2C740&ssl=1","keywords":["Tips &amp; Tricks"],"articleSection":["Job Search","N8n"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/","url":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/","name":"How to use n8n to Search Job Boards - Cliff Simpkins","isPartOf":{"@id":"https:\/\/simpkins.social\/cliff\/#website"},"primaryImageOfPage":{"@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/#primaryimage"},"image":{"@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/2025-10-LI-n8n-for-job-searching.png?fit=1436%2C740&ssl=1","datePublished":"2025-10-28T23:57:10+00:00","dateModified":"2025-10-30T20:44:47+00:00","author":{"@id":"https:\/\/simpkins.social\/cliff\/#\/schema\/person\/bba546ac4d77da1fb51bc4030238e864"},"description":"How I use n8n to search job boards and find relevant roles. This post documents how I do it and provides code and DB schemas to get you started.","breadcrumb":{"@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/#primaryimage","url":"https:\/\/i0.wp.com\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/2025-10-LI-n8n-for-job-searching.png?fit=1436%2C740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/2025-10-LI-n8n-for-job-searching.png?fit=1436%2C740&ssl=1","width":1436,"height":740},{"@type":"BreadcrumbList","@id":"https:\/\/simpkins.social\/cliff\/blog\/2025\/10\/28\/how-to-use-n8n-to-search-job-boards\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/simpkins.social\/cliff\/"},{"@type":"ListItem","position":2,"name":"How to use n8n to Search Job Boards"}]},{"@type":"WebSite","@id":"https:\/\/simpkins.social\/cliff\/#website","url":"https:\/\/simpkins.social\/cliff\/","name":"Cliff Simpkins","description":"Personal site + blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/simpkins.social\/cliff\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/simpkins.social\/cliff\/#\/schema\/person\/bba546ac4d77da1fb51bc4030238e864","name":"cliff.simpkins","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/07b113647e819a448cfc8545b476db50a641b9d43808a2c399af84e724d078d2?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/07b113647e819a448cfc8545b476db50a641b9d43808a2c399af84e724d078d2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/07b113647e819a448cfc8545b476db50a641b9d43808a2c399af84e724d078d2?s=96&d=mm&r=g","caption":"cliff.simpkins"},"url":"https:\/\/simpkins.social\/cliff\/blog\/author\/cliff-simpkins\/"}]}},"jetpack_featured_media_url":"https:\/\/i0.wp.com\/simpkins.social\/cliff\/wp-content\/uploads\/2025\/10\/2025-10-LI-n8n-for-job-searching.png?fit=1436%2C740&ssl=1","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/posts\/505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/comments?post=505"}],"version-history":[{"count":11,"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/posts\/505\/revisions"}],"predecessor-version":[{"id":534,"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/posts\/505\/revisions\/534"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/media\/511"}],"wp:attachment":[{"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/media?parent=505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/categories?post=505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/simpkins.social\/cliff\/wp-json\/wp\/v2\/tags?post=505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}