The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "LakshMarkApplied",
"name": "Laksh Job Discovery \u2014 Mark Applied Webhook",
"nodes": [
{
"parameters": {
"httpMethod": "GET",
"path": "mark-applied",
"responseMode": "responseNode",
"options": {}
},
"id": "3a51d0c9-6f0b-4a4e-9a2c-1d7b0d5c8e11",
"name": "Mark Applied Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
-500,
0
]
},
{
"parameters": {
"jsCode": "// Both values are interpolated into a shell command downstream, so nothing\n// but the exact shapes this pipeline signs may pass: a job uuid and a 32\n// character hex digest. Anything else is rejected here, before the command\n// node can see it.\nconst job = String($json.query?.job || '');\nconst sig = String($json.query?.sig || '');\nconst valid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(job) && /^[0-9a-f]{32}$/i.test(sig) && Boolean($env.MARK_APPLIED_SECRET);\nreturn [{ json: { valid, job: valid ? job.toLowerCase() : '', sig: valid ? sig.toLowerCase() : '' } }];"
},
"id": "7c2e91af-40d8-4f6c-8a5b-2e9d3c6f10b8",
"name": "Validate Signed Link",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-260,
0
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"typeValidation": "strict"
},
"conditions": [
{
"id": "58b3d0e6-9a7c-4c11-bb02-7e4f6a1d9c33",
"leftValue": "={{ $json.valid }}",
"rightValue": true,
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
}
},
"id": "1d84f5b2-3c60-4a97-9f8e-5b2a7c0d6e14",
"name": "Valid Signed Link?",
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-20,
0
]
},
{
"parameters": {
"command": "=cd /opt/job-pipeline && node dist/cli.js mark-applied --job '{{ $json.job }}' --sig '{{ $json.sig }}'"
},
"id": "b0f7a3c8-51d2-4e69-8c47-9a1e2d5b7f06",
"name": "Record Applied in Notion",
"type": "n8n-nodes-base.executeCommand",
"typeVersion": 1,
"position": [
220,
-100
]
},
{
"parameters": {
"jsCode": "const result = JSON.parse($json.stdout);\nconst role = [result.company, result.title].filter(Boolean).join(' \u2014 ');\nconst message = result.ok\n ? (result.alreadyApplied ? 'Already in the ledger: ' + role : 'Marked applied: ' + role)\n : ({ disabled: 'Mark-applied is not configured on this deployment.', bad_signature: 'That link is not valid.', unknown_job: 'That role is no longer in the database.', notion_failed: 'Notion refused the write: ' + (result.error || 'unknown error') }[result.reason] || 'Could not mark this role applied.');\nconst escape = s => s.replace(/[&<>]/g, c => ({'&':'&','<':'<','>':'>'}[c]));\n// Only a success may promise the role is gone. Saying it after a refusal is\n// how a dead link reads as a working one.\nconst note = result.ok ? '<p style=\"color:#666\">It will not appear in future digests.</p>' : '<p style=\"color:#666\">Nothing was changed.</p>';\nreturn [{ json: { ok: result.ok, html: '<!doctype html><meta name=\"viewport\" content=\"width=device-width\"><title>Job discovery</title><body style=\"font:16px/1.5 -apple-system,system-ui,sans-serif;padding:2rem;max-width:34rem\"><p>' + escape(message) + '</p>' + note } }];"
},
"id": "e5c1b782-9d34-4a08-b16f-3c7d0e2a4915",
"name": "Render Result",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
460,
-100
]
},
{
"parameters": {
"respondWith": "text",
"responseBody": "={{ $json.html }}",
"options": {
"responseCode": 200,
"responseHeaders": {
"entries": [
{
"name": "content-type",
"value": "text/html; charset=utf-8"
}
]
}
}
},
"id": "c9a06d4e-7b18-4f52-83d9-1e6b5a0c8237",
"name": "Return Page",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [
700,
-100
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ { ok:false, error:'invalid_link' } }}",
"options": {
"responseCode": 400
}
},
"id": "46f8e2a1-0c95-4d73-a6b8-2f9d7c1e5043",
"name": "Reject Safely",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [
220,
100
]
}
],
"connections": {
"Mark Applied Webhook": {
"main": [
[
{
"node": "Validate Signed Link",
"type": "main",
"index": 0
}
]
]
},
"Validate Signed Link": {
"main": [
[
{
"node": "Valid Signed Link?",
"type": "main",
"index": 0
}
]
]
},
"Valid Signed Link?": {
"main": [
[
{
"node": "Record Applied in Notion",
"type": "main",
"index": 0
}
],
[
{
"node": "Reject Safely",
"type": "main",
"index": 0
}
]
]
},
"Record Applied in Notion": {
"main": [
[
{
"node": "Render Result",
"type": "main",
"index": 0
}
]
]
},
"Render Result": {
"main": [
[
{
"node": "Return Page",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"timezone": "America/Los_Angeles",
"saveManualExecutions": true,
"callerPolicy": "workflowsFromSameOwner"
},
"versionId": "5d1c8b03-4e27-49a6-b8f1-7c0a2e9d6534",
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Laksh Job Discovery — Mark Applied Webhook. Uses executeCommand. Webhook trigger; 7 nodes.
Source: https://github.com/lgoyal6/job-discovery/blob/main/workflows/mark-applied-webhook.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Steam + CF Report. Uses executeCommand, mailgun. Webhook trigger; 9 nodes.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
A clean, extensible REST-style API routing template for n8n webhooks with up to 3 path levels. Serves API routes via Webhooks with path variables Normalizes incoming requests into "global" REQUEST and
PUQ Docker NextCloud deploy. Uses respondToWebhook, stickyNote, httpRequest, ssh. Webhook trigger; 44 nodes.
puq-docker-immich-deploy. Uses respondToWebhook, ssh, stickyNote. Webhook trigger; 35 nodes.