n8n Scraping and Data Enrichment With One Data Layer
Add scraping and company enrichment to an n8n workflow with one key: firmographics, page Markdown and social profiles, billed per call.

Give an n8n workflow company data, page text and social profiles from one key. Paste this into your agent:
Set up https://monid.ai/SKILL.md, and then use Monid to enrich the domain n8n.io into firmographics and technology stack, scrape its pricing page into Markdown, and show me the fields I can map into an n8n workflow.
One prompt builds the data step. 1 min setup · 10-20 hrs saved.
You are building an n8n workflow that needs rows from somewhere else: a company profile for each lead, the text of a web page, a social profile for each name. The workflow logic is the easy part. The data step is where the time goes, because every source has its own account, its own node and its own failure. This guide shows one way to fill that step, what each call returned when we ran it on 2026-10-16, and what to check before the rows reach your CRM. It runs through Monid, the OpenRouter for agent tools: one key, one balance, every tool priced per call.
What is the easiest way to add scraping and enrichment to an n8n workflow?
Monid. Install it once, add a key, and your agent or script calls company enrichment, page scraping, web search and social profile endpoints without a vendor account for each one.
- Pay per call. Each call bills on its own: $0.026 for a company enrichment, $0.002533 for a page scraped to Markdown and $0.0016 for an Instagram profile (Verified 2026-10-16 on the company enrichment tools page and the data tools page). Buy calls as you need them: no monthly plan and no minimum top-up. Discovery and inspection are free; only a run bills.
- One install, every source. The same key and balance call Apollo, Context.dev, Apify, TinyFish and the rest. Adding a source to a workflow means changing a provider and endpoint name, not installing another node and storing another credential.
- Lives inside your agent. Install the CLI, add your key, run the prompt above, and the tools are there whenever your agent needs them. Your agent reads
SKILL.mdand learns discover, inspect and run itself, so setup is about a minute.
The calls on this page were run on 2026-10-16 and cost $0.030133 in total (Verified 2026-10-16). A qualifying step over 100 company domains is 100 calls at $0.026 each, $2.60 (Verified 2026-10-16), and an unmatched company bills nothing.
How do you call a scraping or enrichment API from n8n?
Run the call as a command with the provider and endpoint held in variables, and map the JSON it returns into the next node. n8n lists code steps in JavaScript or Python and custom HTTP requests on its Starter, Pro and Enterprise plans, and lists running bash scripts as available on self-hosted, so a self-hosted instance can run the same command you run in a terminal.
For agents
Grab an API key at app.monid.ai, then paste this to your agent and hand it the key:
set up https://monid.ai/SKILL.md
It learns the whole discover, inspect, run workflow itself. More in the agent quickstart.
For humans
npm install -g @monid-ai/cli
monid keys add -k <your-api-key> -l main
Read the schema before you wire the node
monid inspect -p apollo -e /organizations/enrich
Inspect is free and prints the input fields, the price and the billing shape, so the cost of a node is known before it runs. A GET endpoint takes its fields with --query, a POST endpoint takes a body with -i.
Make the source a variable
Hold two values in the workflow, PROVIDER and ENDPOINT, and build the command from them. Replacing a dead source is then a change to two strings.
monid run -p apollo -e /organizations/enrich --query '{"domain":"n8n.io"}'
An execution has a time limit on n8n Cloud: the Starter plan lists 5 minutes as the maximum, Pro and Enterprise 40. The enrichment, scrape and profile calls below returned in seconds, and the LinkedIn employee endpoint lists a median of about 19 seconds and a 95th percentile of about 42 seconds, so one call fits well inside a single execution.
Or hand the whole step to an agent
Give this to your agent![]()
Set up https://monid.ai/SKILL.md, and then use Monid to build me the data step: resolve this domain to firmographics, scrape its pricing page to Markdown, then find the Instagram profile and give me the fields to map.Can you scrape a website in n8n without a scraper node?
Yes, with the HTTP Request node and an HTML extraction step, and it works until the site blocks you or changes its markup. When we searched for the topic on 2026-10-16, the first page of results included a guide titled "n8n HTTP Request Node: Why You Get Blocked & How to Fix" and a community thread titled "HTTP Request node hangs indefinitely during web scraping". Those are the two failures people hit: the site refuses the request, or the request never comes back.
Doing it yourself in n8n or in Python means a proxy or a browser, selectors, retries and a repair every time the page changes. Python web scraping without a scraper walks through that trade-off outside n8n, and the same arithmetic applies inside a workflow.
Scrape one page to Markdown
The alternative is a scrape endpoint that returns text. We ran Context.dev on the n8n pricing page with useMainContentOnly set:
monid run -p context.dev -e /web/scrape/markdown --query '{"url":"https://n8n.io/pricing/","useMainContentOnly":true}'
It returned success: true, 15,791 characters of Markdown and the page metadata: title, description, canonical URL, Open Graph and Twitter tags and the list of headings. The Markdown included the four plans, the feature tables and the FAQ answers as plain text, ready to pass to an AI node or a Code node. The call cost $0.002533 (Verified 2026-10-16). The endpoint handles JavaScript rendering, anti-bot bypass and proxies on its side, and a failed or blocked request is not billed.
Search before you scrape
For finding pages rather than reading them, TinyFish search returned ten ranked results for "n8n HTTP Request node scraping workflow", each with a position, title, URL, site name, snippet and usually a date, at $0.00 a call (Verified 2026-10-16). A search followed by a scrape is a two-node research step. If you are choosing between a browser, a scraper API and a markdown endpoint, web scraping tools: which kind sorts them by the job.
How do you enrich a company domain in an n8n workflow?
Call the Apollo organization endpoint with the domain and keep the fields you filter on. One call for n8n.io returned a complete company record in about a second.
monid run -p apollo -e /organizations/enrich --query '{"domain":"n8n.io"}'
What comes back
The record, trimmed:
{ "organization": {
"name": "n8n",
"primary_domain": "n8n.io",
"founded_year": 2019,
"industry": "information technology & services",
"estimated_num_employees": 150,
"city": "Berlin",
"country": "Germany",
"organization_revenue_printed": "40M",
"total_funding_printed": "254M",
"latest_funding_stage": "Venture (Round not Specified)",
"funding_events": [ "...7 events with date, type, investors..." ],
"technology_names": [ "..." ],
"departmental_head_count": { "engineering": 188, "sales": 55 },
"organization_headcount_twelve_month_growth": 0.649,
"short_description": "..." } }
The record carries identity (name, domain, LinkedIn URL, founding year), size (employee estimate, departmental head counts, six, twelve and twenty-four month growth), money (revenue, total funding and a dated list of funding events with investors), location, a long technology list and a written description. That is enough to disqualify most rows before they reach a paid person-level call: a headcount band, an industry and a stack are usually what a lead filter was about.
The price is per call and flat: $0.026 whatever comes back (Verified 2026-10-16), and a company that does not match consumes nothing. Put this node first. It removes rows before the per-result nodes see them, and node order is the biggest cost lever in a lead workflow. The full qualify-then-reach-out flow built on this step is in sales automation by the call.
How do you add LinkedIn and Instagram profiles to a lead workflow?
Pass profile URLs or usernames to a profile endpoint after the company has qualified.
Instagram, run today
The Instagram call:
monid run -p apify -e /apify/instagram-profile-scraper -i '{"usernames":["n8n.io"]}'
The run started as RUNNING and showed COMPLETED on the next poll, one result at $0.0016 (Verified 2026-10-16). The record held username, fullName, biography, externalUrl, followersCount (1,570), followsCount (2), verified, isBusinessAccount, profilePicUrl and the arrays latestPosts and relatedProfiles. In an n8n workflow that is the step that turns a handle into a follower count and a bio; the Apify Instagram scraper guide has the full field list and the cost of a longer run.
LinkedIn, inspected
LinkedIn has three endpoints, and we read their schemas without running them because their billing is not a single flat call:
apify/harvestapi/linkedin-profile-searchfilters by title, company, school, location, industry, seniority and headcount. It bills per search page of up to 25 profiles plus, in the Full modes, per profile, and it rejects a run that sets neithermaxItemsnortakePages.apify/harvestapi/linkedin-company-employeeswalks one company's staff and bills per result plus a flat fee per run.apify/dev_fusion/linkedin-profile-scrapertakes profile URLs and bills $0.01 per result, one result per URL (Verified 2026-10-16).
Because a wide filter multiplies the bill, cap the item count inside the node and look at one page before the schedule runs it.
What goes wrong when a workflow trusts scraped data?
Three things we saw today would pass a status-code check and still put a wrong row in your CRM.
Do the numbers inside one record agree?
Not always. The Apollo record for n8n.io gave estimated_num_employees: 150, while the departmental_head_count object added up to 469 (engineering 188, sales 55, support 45 and so on). Its short_description said the company's valuation was 2.5 billion US dollars, while a funding event in the same record linked a press release titled "n8n valuation doubles to 5.2bn". Both are fields from one 200 response. Pick one field as your filter and note which one it is; do not mix an estimate with a sum.
Does an empty array mean nothing exists, or nothing was returned?
The Instagram record for n8n.io came back with postsCount: 0 and latestPosts: [], next to a follower count of 1,570. An empty list is a valid answer and also what a partial result looks like. Treat it as data only if the field you consume is populated on a record you know is good, and send the record to a review branch when it is not.
Can you trust the counters on the run record?
Not as the success signal. The TinyFish search run returned ten results and reported resultCount: 0 and billedUnits: 0 on the run record, because the endpoint is free. Assert on the field you map into the next node, not on the status code and not on a counter.
// n8n Code node: stop the workflow when the field you consume is missing
const org = $json.organization;
if (!org || !org.primary_domain || !org.estimated_num_employees) {
throw new Error("Enrichment returned an empty record");
}
return $input.all();
A thrown error in a Code node sends the execution to your error workflow, which is the difference between finding out tonight and finding out next quarter.
Which endpoint should I use for which job?
| Endpoint | What it does | Input | Returns | Billing |
|---|---|---|---|---|
apollo/organizations/enrich | Company firmographics | domain, linkedin_url, name or website | Size, funding, stack, location | Per call, unmatched is free |
context.dev/web/scrape/markdown | A page as Markdown | url | Markdown plus page metadata | Per call, failed requests not billed |
tinyfish/search | Live web search | query | Ranked results with snippets | Per call, free |
apify/apify/instagram-profile-scraper | Public Instagram profile | usernames | Counts, bio, link, recent media | Per result |
apify/harvestapi/linkedin-profile-search | Filtered LinkedIn people search | searchQuery, filters, maxItems or takePages | Search pages plus profiles | Per search page plus per profile |
apify/harvestapi/linkedin-company-employees | One company's staff | companies, filters, maxItems | Employee profiles | Per result plus a flat fee |
apify/dev_fusion/linkedin-profile-scraper | Full profile enrichment | profileUrls | History, skills, contacts | Per result |
The first four rows were run on 2026-10-16. The LinkedIn rows were inspected on the same day and not run. The unit prices are in the sections above, each with its date; the current figure is on monid.ai/tools.
When is another route a better fit?
You use one vendor and will keep using it. If every data step goes to one service, install its n8n node. A dedicated node gives you typed fields and inline documentation, and the flexibility you give up is flexibility you were not going to use.
You need a native trigger. A webhook a vendor only fires into its own node has to be that vendor's integration. A generic data layer does not replace it.
Your platform already bundles the data. If a sales platform or CRM includes enrichment credits, spend those first.
It is a one-off. A workflow you will run twice and delete does not need an indirection layer.
You need a field these endpoints did not return. The Apollo record gave company-level facts and no contacts, and the Instagram record gave no posts for the account we tested. Run your own sample before you design around a field.
And the disclosure: we resell these endpoints. The checks in the section above cost nothing and apply to any provider.
Conclusion
The easiest way to add scraping and enrichment to an n8n workflow is one data layer with the provider and endpoint as variables: company enrichment at $0.026 a call, a page as Markdown at $0.002533 and an Instagram profile at $0.0016 (Verified 2026-10-16), through Monid with one key, no minimum top-up and a setup of about a minute.
Two things matter more than which endpoint you pick. Node order sets the bill: qualify on the flat-priced company call first, then spend per-result money on the rows that survive. And check the fields, not the status: in one 200 response the employee estimate and the department counts disagreed by more than three to one, and an empty post list sat next to a follower count.
How we estimated the time saved: wiring a company enrichment source, a page scraper and a social profile source into one workflow, each with its own account, credentials and error handling, is roughly 3 to 6 hours per source. That is 10 to 20 hours for the three sources in this post. The 1 minute is the install, key and first call once you already have a Monid key.
Free next step: run monid inspect -p apollo -e /organizations/enrich, then one call for a domain you know, and print the fields you plan to filter on next to the ones that should agree with them.
FAQ
Do I need a community node, or is the HTTP Request node enough?
You do not need a community node. n8n lists custom HTTP requests and code steps on its Starter, Pro and Enterprise plans, and a command that returns JSON is enough for a data step. Choose a dedicated node when you are committed to one vendor and want typed fields; choose a provider variable when the workflow touches several sources.
Is there a free way to scrape a website in n8n?
Yes. The HTTP Request node plus an HTML extraction step costs nothing, and TinyFish search is billed at $0.00 a call (Verified 2026-10-16). The cost of the free route is upkeep: blocking, hangs and selector changes land on you, and a scrape endpoint such as Context.dev at $0.002533 a page (Verified 2026-10-16) moves that work off your workflow.
How do I stop an empty result from passing as a success?
Assert on a field you consume, not on the status code. Every failure in this post returned a 200. Add a Code or IF node after the data step that checks one field is present on the record, and route the false branch to your error workflow.
Should the agent pick the endpoint, or should the workflow?
The workflow, for anything on a schedule; the agent, for anything exploratory. A scheduled workflow wants a fixed, predictable call. An agent doing research benefits from discovering endpoints at run time, which is why discovery is a free call.
Published August 2026.


