{"workflow":{"id":14167,"name":"Scrape, search and browse the web with a Firecrawl AI agent webhook","views":1418,"recentViews":25,"totalViews":1418,"createdAt":"2026-03-18T19:06:35.875Z","description":"Turn any prompt into structured web data. Send a POST request with a natural language prompt and an optional JSON schema, and get back clean, structured results scraped from the web by an AI agent powered by Firecrawl.\n\n## Use Cases\n\n- **Data Enrichment**: Feed company names or URLs from your CRM and get back structured firmographic data (industry, funding, team size, tech stack).\n- **Lead Generation**: Ask the agent to find pricing, contact pages, or product details for a list of competitors.\n- **Market Research**: Extract structured pricing plans, feature comparisons, or product catalogs from any website.\n- **Content Aggregation**: Pull structured news, events, or job postings from across the web on a schedule.\n- **Sales Intelligence**: Enrich prospect lists with company info, recent news, or tech stack details before outreach.\n\n## How It Works\n\n```\nPOST /webhook/scrape-agent\n```\n\n1. **Receive Scrape Request** receives a POST request with `prompt` and an optional `output_schema`.\n2. **Validate Output Schema** checks the schema. If none is provided, it falls back to a permissive default. If the schema is malformed, it returns a clear error via **Return Schema Error**.\n3. **Research & Extract Web Data** takes the prompt and uses the full Firecrawl toolkit to research the web:\n   - **Search** (`/search`): Finds relevant pages and sources across the web.\n   - **Scrape** (`/scrape`): Extracts clean, structured content from any URL.\n   - **Interact** (interactContext, interact, interactStop): Lets the agent interact with scraped pages in a live session. After scraping a page, the agent can click buttons, fill forms, navigate dynamic content, and extract data that static scraping cannot reach, all without managing sessions manually.\n   \n   This combination gives the AI agent complete web navigation capabilities. It can discover sources, read pages, and interact with dynamic content autonomously.\n4. **Format Response to Schema** (Structured Output Parser) formats the agent's response to match the provided (or default) schema.\n5. **Return Structured Results** sends the structured JSON back to the caller.\n\n## Setup Requirements\n\n- **Firecrawl API Key**: Sign up at [firecrawl.dev](https://www.firecrawl.dev) and grab your API key. Connect it in the Firecrawl credential nodes.\n- **LLM Provider**: Configure your Primary Chat Model and Fallback Chat Model nodes (e.g., OpenRouter, OpenAI, Anthropic). The template uses two model nodes for reliability, plus a separate Parser Chat Model for the output parser.\n- **n8n Instance**: Self-hosted or cloud. Make sure the webhook node is set to accept POST requests.\n\n## API Reference\n\n### Endpoint\n\n```\nPOST https://your-n8n-instance/webhook/scrape-agent\n```\n\n### Request Body\n\n| Field | Type | Required | Description |\n|-------|------|----------|-------------|\n| `prompt` | string | Yes | Natural language instruction for the agent |\n| `output_schema` | object | No | JSON Schema defining the desired output structure |\n\n### Response\n\nReturns a JSON object matching the provided schema, or a flexible object if no schema was given.\n\n---\n\n## Testing Examples\n\n### 1. Basic Request (No Schema)\n\nThe agent decides the output structure on its own.\n\n```bash\ncurl -X POST \"https://your-n8n-instance/webhook/scrape-agent\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Find the latest pricing for Firecrawl\"\n  }' | jq\n```\n\n**Expected output**: A JSON object with whatever structure the agent finds most appropriate for the data. Since no schema was provided, the internal default (`{ \"type\": \"object\", \"additionalProperties\": true }`) is used.\n\n### 2. Request With a Custom Schema\n\nYou define exactly the shape of data you want back.\n\n```bash\ncurl -X POST \"https://your-n8n-instance/webhook/scrape-agent\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Find the latest pricing for Firecrawl\",\n    \"output_schema\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"source\": { \"type\": \"string\" },\n        \"plans\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"name\": { \"type\": \"string\" },\n              \"price\": { \"type\": \"string\" },\n              \"credits\": { \"type\": \"string\" },\n              \"highlights\": {\n                \"type\": \"array\",\n                \"items\": { \"type\": \"string\" }\n              }\n            }\n          }\n        }\n      }\n    }\n  }' | jq\n```\n\n**Expected output**:\n\n```json\n{\n  \"output\": {\n    \"source\": \"https://www.firecrawl.dev/pricing\",\n    \"plans\": [\n      {\n        \"name\": \"Free\",\n        \"price\": \"$0 (one-time)\",\n        \"credits\": \"500 credits (one-time)\",\n        \"highlights\": [\n          \"Scrape up to 500 pages\",\n          \"2 concurrent requests\",\n          \"Low rate limits\",\n          \"No credit card required\"\n        ]\n      },\n      {\n        \"name\": \"Hobby\",\n        \"price\": \"$16/month (billed yearly, save $38)\",\n        \"credits\": \"3,000 credits / month\",\n        \"highlights\": [\n          \"Scrape up to 3,000 pages\",\n          \"5 concurrent requests\",\n          \"Basic support\",\n          \"$9 per extra 1k credits\"\n        ]\n      }\n    ]\n  }\n}\n```\n\n### 3. Invalid Schema (String Instead of Object)\n\n```bash\ncurl -X POST \"https://your-n8n-instance/webhook/scrape-agent\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Find the latest pricing for Firecrawl\",\n    \"output_schema\": \"not a valid schema\"\n  }' | jq\n```\n\n**Expected output**:\n\n```json\n{\n  \"error\": true,\n  \"message\": \"Invalid output_schema: must be a JSON object with a valid 'type' property (object, array, string, number, boolean)\",\n  \"example_schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": { \"type\": \"string\" },\n      \"price\": { \"type\": \"number\" }\n    }\n  }\n}\n```\n\n### 4. Invalid Schema (Array Instead of Object)\n\n```bash\ncurl -X POST \"https://your-n8n-instance/webhook/scrape-agent\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Find the latest pricing for Firecrawl\",\n    \"output_schema\": [1, 2, 3]\n  }' | jq\n```\n\n**Expected output**: Same error response as above.\n\n### 5. Invalid Schema (Missing `type` Property)\n\n```bash\ncurl -X POST \"https://your-n8n-instance/webhook/scrape-agent\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Find the latest pricing for Firecrawl\",\n    \"output_schema\": {\n      \"properties\": {\n        \"name\": { \"type\": \"string\" }\n      }\n    }\n  }' | jq\n```\n\n**Expected output**: Same error response as above.\n\n### 6. Invalid Schema (Invalid `type` Value)\n\n```bash\ncurl -X POST \"https://your-n8n-instance/webhook/scrape-agent\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"prompt\": \"Find the latest pricing for Firecrawl\",\n    \"output_schema\": {\n      \"type\": \"banana\"\n    }\n  }' | jq\n```\n\n**Expected output**: Same error response as above.\n\n---\n\n## Workflow Architecture\n\n```\nReceive Scrape Request (POST)\n  |\n  v\nValidate Output Schema\n  |--- Error --&gt; Return Schema Error (error JSON)\n  |--- Success --&gt; Research & Extract Web Data (AI Agent)\n                     |\n                     |--- Primary Chat Model\n                     |--- Fallback Chat Model\n                     |--- Search & Scrape:\n                     |      - /search with Firecrawl\n                     |      - /scrape with Firecrawl\n                     |--- Interact Tool:\n                     |      - Interact context with Firecrawl\n                     |      - Execute interaction with Firecrawl\n                     |      - Stop interaction with Firecrawl\n                     |\n                     v\n                   Return Structured Results\n                     |\n                     |--- Format Response to Schema (Output Parser)\n                            |\n                            |--- Parser Chat Model\n```\n\n## Schema Validation Logic\n\nThe **Validate Output Schema** node runs this validation before passing data to the agent:\n\n- If `output_schema` is **missing or null**, the default permissive schema is used: `{ \"type\": \"object\", \"additionalProperties\": true }`.\n- If `output_schema` is **present**, it must be a JSON object (not a string, array, or primitive).\n- It must have a `type` property with a valid value: `object`, `array`, `string`, `number`, or `boolean`.\n- If validation fails, the workflow returns an error response with a helpful message and example schema.\n\n## Notes\n\n- The **Format Response to Schema** node (Structured Output Parser) requires the schema to be passed as a JSON string. The expression `{{ JSON.stringify($('Validate Output Schema').item.json.output_schema) }}` handles this conversion.\n- The agent has access to Firecrawl's full toolkit: search, scrape, and interact. With all three connected, the agent has complete web navigation powers. It can discover sources via search, extract content via scrape, and interact with dynamic JavaScript-heavy pages via interact. The interact tools let the agent scrape a page first and then continue working with it in a live session, clicking buttons, filling forms, and navigating deeper, all without manual session management. The agent autonomously decides which tools to use based on the prompt.\n- Response times vary depending on the complexity of the prompt and how many pages the agent needs to visit. Simple lookups take a few seconds; deep research can take longer.","workflow":{"id":"NGnt5dWPVpVGTwOF","meta":{"instanceId":"ba63db282a94e75c9ed970aa4cb5b2f9d6030188b3dfa060dd78ea9e1993f61a","templateCredsSetupCompleted":true},"name":"Scrape, search and browse the web with a Firecrawl AI agent webhook","tags":[],"nodes":[{"id":"b4b5e2a2-3f60-406f-81b4-f7fcad4f9144","name":"Receive Scrape Request","type":"n8n-nodes-base.webhook","position":[224,672],"webhookId":"48e70613-6302-4edc-9364-921e1e95929f","parameters":{"path":"scrape-agent","options":{},"httpMethod":"POST","responseMode":"responseNode"},"typeVersion":2.1},{"id":"82a9cc43-5e23-4fbb-8d35-aff63475013a","name":"Validate Output Schema","type":"n8n-nodes-base.code","onError":"continueErrorOutput","position":[448,672],"parameters":{"jsCode":"const body = $input.first().json.body;\n\n// No schema provided, use permissive default\nif (!body.output_schema) {\n  return [{\n    json: {\n      prompt: body.prompt,\n      output_schema: {\n        type: \"object\",\n        additionalProperties: true\n      }\n    }\n  }];\n}\n\n// Validate the provided schema\nconst schema = body.output_schema;\n\nif (typeof schema !== \"object\" || Array.isArray(schema)) {\n  throw new Error(\"output_schema must be a JSON object\");\n}\n\nif (!schema.type) {\n  throw new Error(\"output_schema must have a 'type' property\");\n}\n\nconst validTypes = [\"object\", \"array\", \"string\", \"number\", \"boolean\"];\nif (!validTypes.includes(schema.type)) {\n  throw new Error(`output_schema.type must be one of: ${validTypes.join(\", \")}`);\n}\n\n// Schema is valid, pass it through\nreturn [{\n  json: {\n    prompt: body.prompt,\n    output_schema: schema\n  }\n}];"},"typeVersion":2},{"id":"132edac3-6602-4963-bf8a-d9a3c3d28733","name":"Return Schema Error","type":"n8n-nodes-base.respondToWebhook","position":[640,800],"parameters":{"options":{},"respondWith":"json","responseBody":"{\n  \"error\": true,\n  \"message\": \"Invalid output_schema: must be a JSON object with a valid 'type' property (object, array, string, number, boolean)\",\n  \"example_schema\": {\n    \"type\": \"object\",\n    \"properties\": {\n      \"name\": { \"type\": \"string\" },\n      \"price\": { \"type\": \"number\" }\n    }\n  }\n}"},"typeVersion":1.5},{"id":"5785b8ae-1c34-4587-83d4-a072c485ef46","name":"Research & Extract Web Data","type":"@n8n/n8n-nodes-langchain.agent","position":[992,656],"parameters":{"text":"={{ $('Receive Scrape Request').item.json.body.prompt }}","options":{"maxIterations":40,"systemMessage":"Use Firecrawl's tools to search, then scrape whatever the user's prompt requires. Make sure to  answer the user's query in the best way possible. Consider using search to find the URL before trying to scrape if the user does not specify one.                                                \n                                                                                                    \nWhen using the search tool, at least one source must be selected (web, images, or news).          \n\n Do not use the search tool if you already have the URL.\n\nIMPORTANT:\nIf a URL is provided, try using the scrape tool before using the search tool.\n\nCRITICAL: In Node/JS mode use process.stdout.write(data + \"\\n\") instead of console.log() to return data (console.log output is NOT captured), use unique variable names per call to avoid re-declaration errors in the persistent REPL, and NEVER put agent-browser commands or plain English in the Code field when Language is Node — agent-browser is Bash only.\n\nIf the website has heavy JavaScript or problems while fetching data (such as requiring interaction for pagination, clicking through elements, filling forms, or navigating deeper), only then use the Interact feature. First scrape the page to get a scrapeId, then use the Interact tool with a prompt or code to perform the needed interactions. \n\nALWAYS use the \"Interact Context\" tool to get full context on how to use the interact tools before using them."},"promptType":"define","needsFallback":true,"hasOutputParser":true},"typeVersion":3.1},{"id":"0cfe18d0-f86d-4eae-80e5-d2d3672fcda9","name":"Return Structured Results","type":"n8n-nodes-base.respondToWebhook","position":[1424,656],"parameters":{"options":{}},"typeVersion":1.5},{"id":"10f8ba2e-c1f3-4d9c-ad74-48fc9c0d422a","name":"Primary Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","position":[864,800],"parameters":{"model":"anthropic/claude-sonnet-4.6","options":{}},"credentials":{"openRouterApi":{"id":"sUeQtILma9E44HnE","name":"OpenRouter account"}},"typeVersion":1},{"id":"4b8f8364-1692-42fa-a005-3642a60390b5","name":"Fallback Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","position":[1024,800],"parameters":{"model":"anthropic/claude-haiku-4.5","options":{}},"credentials":{"openRouterApi":{"id":"sUeQtILma9E44HnE","name":"OpenRouter account"}},"typeVersion":1},{"id":"e7192283-1b70-4d50-abb8-e2fae7b24ae6","name":"Parser Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","position":[1376,912],"parameters":{"model":"anthropic/claude-haiku-4.5","options":{}},"credentials":{"openRouterApi":{"id":"sUeQtILma9E44HnE","name":"OpenRouter account"}},"typeVersion":1},{"id":"e023509d-a032-469f-aa06-ee10d10daebc","name":"Format Response to Schema","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[1392,816],"parameters":{"autoFix":true,"schemaType":"manual","inputSchema":"={{ JSON.stringify($('Validate Output Schema').item.json.output_schema) }}"},"typeVersion":1.3},{"id":"d1b90a28-a9b1-4552-8ee2-f81b708932ac","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[160,-32],"parameters":{"width":624,"height":624,"content":"## Firecrawl Interact Agent\nSend a POST request with a URL, a natural language prompt, and an optional JSON schema. An AI agent uses Firecrawl to scrape the page, then interact with it, clicking buttons, filling forms, navigating dynamic content, and extracting structured data that matches your schema.\n**Use cases:** form-driven data extraction, authenticated page scraping, paginated content collection, dynamic SPA navigation, multi-step checkout or search flows.\n## How it works\n1. **Receive Interact Request** accepts a POST with a `url`, `prompt`, and optional `output_schema`.\n2. **Validate Output Schema** checks if the schema is valid JSON. If missing, a permissive default is used. If malformed, a clear error is returned immediately.\n3. **Scrape & Interact** first scrapes the target URL to get initial content and a `scrapeId`, then uses Firecrawl's interact feature to click, fill forms, and navigate the live page based on the prompt. No manual session management is required.\n4. **Format Response to Schema** parses the agent's output into structured JSON matching the provided or default schema.\n5. **Return Structured Results** sends the final JSON back to the caller.\n## Setup steps\n1. **Firecrawl API key:** Sign up at [firecrawl.dev](https://www.firecrawl.dev) and connect your key to all Firecrawl credential nodes.\n2. **LLM providers:** Configure the Primary Chat Model and Fallback Chat Model nodes with your preferred provider (OpenRouter, OpenAI, Anthropic, etc.). Also set up the Parser Chat Model used by the output formatter.\n3. **Activate the workflow** and copy your webhook URL.\n4. **Test it:** Send a POST with a `url` and `prompt` to confirm everything works."},"typeVersion":1},{"id":"6f01b690-3570-447f-adbf-69fb5fb65bc3","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[160,608],"parameters":{"color":7,"width":624,"height":304,"content":"## Input & Validation"},"typeVersion":1},{"id":"1854ff48-aa38-493b-b42d-6919c3e5884e","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[800,608],"parameters":{"color":7,"width":512,"height":304,"content":"## AI Agent & LLM Models"},"typeVersion":1},{"id":"89dedb88-3334-472f-9e81-684dd069743c","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[1328,608],"parameters":{"color":7,"width":336,"height":416,"content":"## Output & Response"},"typeVersion":1},{"id":"01de6598-5edf-4bb0-a91c-032027a1d1f0","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[816,1040],"parameters":{"color":7,"width":848,"height":640,"content":"## Firecrawl Tools"},"typeVersion":1},{"id":"2be3ff3c-deb6-4057-84f6-b60ad61e7143","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[1056,1360],"parameters":{"color":5,"width":592,"height":304,"content":"## Browser Tool"},"typeVersion":1},{"id":"626fbcc2-952a-44d9-9278-4d62182e14af","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[960,1088],"parameters":{"color":4,"width":352,"height":240,"content":"## Search & Scrape"},"typeVersion":1},{"id":"db7882fd-6b95-4571-86c0-d12c37db0c0e","name":"/scrape with Firecrawl","type":"@mendable/n8n-nodes-firecrawl.firecrawlTool","position":[1008,1168],"parameters":{"url":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('URL', ``, 'string') }}","parsers":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Parsers', ``, 'string') }}","operation":"scrape","requestOptions":{}},"credentials":{"firecrawlApi":{"id":"2SnLAelRpQ8H5tju","name":"Firecrawl account"}},"typeVersion":1},{"id":"466ac39c-e56f-4c59-b6f7-236e68131f5d","name":"/search with Firecrawl","type":"@mendable/n8n-nodes-firecrawl.firecrawlTool","position":[1184,1168],"parameters":{"query":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Query', ``, 'string') }}","sources":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Sources', ``, 'string') }}","resource":"MapSearch","operation":"search","requestOptions":{}},"credentials":{"firecrawlApi":{"id":"2SnLAelRpQ8H5tju","name":"Firecrawl account"}},"typeVersion":1},{"id":"24377630-a048-4a29-8374-7e62d7a83008","name":"Interact context with Firecrawl","type":"@mendable/n8n-nodes-firecrawl.firecrawlTool","position":[1136,1408],"parameters":{"resource":"Interact","requestOptions":{}},"credentials":{"firecrawlApi":{"id":"2SnLAelRpQ8H5tju","name":"Firecrawl account"}},"typeVersion":1},{"id":"26069d9a-ae64-423e-9172-9cc2a920d918","name":"Execute interaction with Firecrawl","type":"@mendable/n8n-nodes-firecrawl.firecrawlTool","position":[1296,1488],"parameters":{"code":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Code', ``, 'string') }}","resource":"Interact","scrapeId":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Scrape_ID', ``, 'string') }}","operation":"interact","interactMode":"code","requestOptions":{}},"credentials":{"firecrawlApi":{"id":"2SnLAelRpQ8H5tju","name":"Firecrawl account"}},"typeVersion":1},{"id":"9b777540-a930-40c0-8e18-c6692b6ac8bb","name":"Stop interaction with Firecrawl","type":"@mendable/n8n-nodes-firecrawl.firecrawlTool","position":[1472,1488],"parameters":{"resource":"Interact","scrapeId":"={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Scrape_ID', ``, 'string') }}","operation":"interactStop","requestOptions":{}},"credentials":{"firecrawlApi":{"id":"2SnLAelRpQ8H5tju","name":"Firecrawl account"}},"typeVersion":1}],"active":true,"pinData":{"Receive Scrape Request":[{"json":{"body":{"prompt":"Go to airank.dev and get the top 20 first LLMs from the main table in the home page"},"query":{},"params":{},"headers":{"host":"quickconnect1.stage-app.n8n.cloud","accept":"*/*","cf-ray":"9e1e6002da0b0d0b-GRU","cdn-loop":"cloudflare; loops=1; subreqs=1","cf-ew-via":"15","cf-worker":"n8n.cloud","x-real-ip":"177.200.39.12","user-agent":"curl/8.7.1","cf-ipcountry":"BR","content-type":"application/json","content-length":"59","x-warp-trusted":"yes","accept-encoding":"gzip, br","x-forwarded-for":"177.200.39.12, 172.69.39.2","x-warp-provider":"cloudflare","cf-connecting-ip":"177.200.39.12","x-forwarded-host":"quickconnect1.stage-app.n8n.cloud","x-forwarded-port":"443","x-forwarded-proto":"https","x-forwarded-server":"traefik-stage-users-gwc-1-7cb4dbf9bf-6dqgk"},"webhookUrl":"https://quickconnect1.stage-app.n8n.cloud/webhook-test/scrape-agent","executionMode":"test"}}]},"settings":{"binaryMode":"separate","availableInMCP":false,"executionOrder":"v1"},"versionId":"823b4c27-e6a2-41a3-a7e1-ac3bec06d801","connections":{"Parser Chat Model":{"ai_languageModel":[[{"node":"Format Response to Schema","type":"ai_languageModel","index":0}]]},"Primary Chat Model":{"ai_languageModel":[[{"node":"Research & Extract Web Data","type":"ai_languageModel","index":0}]]},"Fallback Chat Model":{"ai_languageModel":[[{"node":"Research & Extract Web Data","type":"ai_languageModel","index":1}]]},"/scrape with Firecrawl":{"ai_tool":[[{"node":"Research & Extract Web Data","type":"ai_tool","index":0}]]},"/search with Firecrawl":{"ai_tool":[[{"node":"Research & Extract Web Data","type":"ai_tool","index":0}]]},"Receive Scrape Request":{"main":[[{"node":"Validate Output Schema","type":"main","index":0}]]},"Validate Output Schema":{"main":[[{"node":"Research & Extract Web Data","type":"main","index":0}],[{"node":"Return Schema Error","type":"main","index":0}]]},"Format Response to Schema":{"ai_outputParser":[[{"node":"Research & Extract Web Data","type":"ai_outputParser","index":0}]]},"Research & Extract Web Data":{"main":[[{"node":"Return Structured Results","type":"main","index":0}]]},"Interact context with Firecrawl":{"ai_tool":[[{"node":"Research & Extract Web Data","type":"ai_tool","index":0}]]},"Stop interaction with Firecrawl":{"ai_tool":[[{"node":"Research & Extract Web Data","type":"ai_tool","index":0}]]},"Execute interaction with Firecrawl":{"ai_tool":[[{"node":"Research & Extract Web Data","type":"ai_tool","index":0}]]}}},"lastUpdatedBy":29,"workflowInfo":{"nodeCount":21,"nodeTypes":{"n8n-nodes-base.code":{"count":1},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.stickyNote":{"count":7},"@n8n/n8n-nodes-langchain.agent":{"count":1},"n8n-nodes-base.respondToWebhook":{"count":2},"@n8n/n8n-nodes-langchain.lmChatOpenRouter":{"count":3},"@mendable/n8n-nodes-firecrawl.firecrawlTool":{"count":5},"@n8n/n8n-nodes-langchain.outputParserStructured":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Firecrawl","username":"firecrawl","bio":"","verified":true,"links":[],"avatar":"https://gravatar.com/avatar/145ca947664fc7f7d1772e11835fa6e42678f604e2fac83255bc1633c48d98be?r=pg&d=retro&size=200"},"nodes":[{"id":47,"icon":"file:webhook.svg","name":"n8n-nodes-base.webhook","codex":{"data":{"alias":["HTTP","API","Build","WH"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"trigger\"]","defaults":{"name":"Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Webhook","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":535,"icon":"file:webhook.svg","name":"n8n-nodes-base.respondToWebhook","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.respondtowebhook/"}]},"categories":["Core Nodes","Utility"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"transform\"]","defaults":{"name":"Respond to Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Respond to Webhook","typeVersion":2,"nodeCategories":[{"id":7,"name":"Utility"},{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":1119,"icon":"fa:robot","name":"@n8n/n8n-nodes-langchain.agent","codex":{"data":{"alias":["LangChain","Chat","Conversational","Plan and Execute","ReAct","Tools"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"AI Agent","color":"#404040"},"iconData":{"icon":"robot","type":"icon"},"displayName":"AI Agent","typeVersion":3,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1179,"icon":"fa:code","name":"@n8n/n8n-nodes-langchain.outputParserStructured","codex":{"data":{"alias":["json","zod"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.outputparserstructured/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Output Parsers"]}}},"group":"[\"transform\"]","defaults":{"name":"Structured Output Parser"},"iconData":{"icon":"code","type":"icon"},"displayName":"Structured Output Parser","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]},{"id":1281,"icon":"file:openrouter.svg","name":"@n8n/n8n-nodes-langchain.lmChatOpenRouter","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenrouter/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Language Models","Root Nodes"],"Language Models":["Chat Models (Recommended)"]}}},"group":"[\"transform\"]","defaults":{"name":"OpenRouter Chat Model"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjOTRBM0I4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjx0aXRsZT5PcGVuUm91dGVyPC90aXRsZT48cGF0aCBkPSJNMTYuODA0IDEuOTU3bDcuMjIgNC4xMDV2LjA4N0wxNi43MyAxMC4yMWwuMDE3LTIuMTE3LS44MjEtLjAzYy0xLjA1OS0uMDI4LTEuNjExLjAwMi0yLjI2OC4xMS0xLjA2NC4xNzUtMi4wMzguNTc3LTMuMTQ3IDEuMzUyTDguMzQ1IDExLjAzYy0uMjg0LjE5NS0uNDk1LjMzNi0uNjguNDU1bC0uNTE1LjMyMi0uMzk3LjIzNC4zODUuMjMuNTMuMzM4Yy40NzYuMzE0IDEuMTcuNzk2IDIuNzAxIDEuODY2IDEuMTEuNzc1IDIuMDgzIDEuMTc3IDMuMTQ3IDEuMzUybC4zLjA0NWMuNjk0LjA5MSAxLjM3NS4wOTQgMi44MjUuMDMzbC4wMjItMi4xNTkgNy4yMiA0LjEwNXYuMDg3TDE2LjU4OSAyMmwuMDE0LTEuODYyLS42MzUuMDIyYy0xLjM4Ni4wNDItMi4xMzcuMDAyLTMuMTM4LS4xNjItMS42OTQtLjI4LTMuMjYtLjkyNi00Ljg4MS0yLjA1OWwtMi4xNTgtMS41YTIxLjk5NyAyMS45OTcgMCAwMC0uNzU1LS40OThsLS40NjctLjI4YTU1LjkyNyA1NS45MjcgMCAwMC0uNzYtLjQzQzIuOTA4IDE0LjczLjU2MyAxNC4xMTYgMCAxNC4xMTZWOS44ODhsLjE0LjAwNGMuNTY0LS4wMDcgMi45MS0uNjIyIDMuODA5LTEuMTI0bDEuMDE2LS41OC40MzgtLjI3NGMuNDI4LS4yOCAxLjA3Mi0uNzI2IDIuNjg2LTEuODUzIDEuNjIxLTEuMTMzIDMuMTg2LTEuNzggNC44ODEtMi4wNTkgMS4xNTItLjE5IDEuOTc0LS4yMTMgMy44MTQtLjEzOGwuMDItMS45MDd6Ij48L3BhdGg+PC9zdmc+Cg=="},"displayName":"OpenRouter Chat Model","typeVersion":1,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":32,"name":"Market Research"},{"id":48,"name":"AI RAG"}],"image":[]}}