ScrapeNinja
Developer ToolsScrapeNinja is a web scraping API with a fast HTTP engine, a real browser engine, and a server-side Cheerio extractor. Workflows fetch pages, extract structured data with JavaScript extractors, capture screenshots, and grab AJAX responses.
What This Integration Enables
ScrapeNinja's argument is that most scraping tools give you the wrong artifact. A page of HTML sitting in a workflow variable is not data. It is a document that somebody now has to parse, usually in a second tool, usually with code that lives somewhere the workflow does not. ScrapeNinja moves the parse to its own side: an extractor is a small JavaScript function using the Cheerio parser that runs in ScrapeNinja's cloud and returns only the fields you asked for.
The second thing worth knowing is that the engine is a decision, not a default. Scrape uses a conditioned HTTP client with a real Chrome TLS fingerprint and no JavaScript execution, which is fast, cheap, and enough for a surprising number of protected sites. Scrape With Browser runs actual Chrome and costs accordingly. The vendor's own guidance is to try the cheap one on every site first. FlowRunner agents can make that escalation automatically, because the response reports whether the fetch looks blocked rather than leaving a flow to guess from markup. What agents should not do unsupervised is decide that a new extractor is producing correct facts, and that is where the human-in-the-loop step sits.
Without FlowRunner
With FlowRunner
Use Case Scenarios
-
A catalog sync that pays browser cost only when it has to
A pricing workflow runs nightly against a competitor's product pages. The agent calls Scrape first. Where the response comes back with
looksBlockedset or with a target status in the not-expected list, it retries through the browser engine rather than through the same route again, since retrying an identical request against a site that just refused it is a way to spend money confirming a refusal. Extract Data returns the fields, and the records land in PostgreSQL with a movement summary posting to Slack. Setting Text Not Expected matters more than it sounds: ScrapeNinja carries some Cloudflare markers by default, but the block-page string your particular target uses is the one that decides whether tonight's run produces prices or produces interstitials. -
Reading the site's own API instead of its markup
Many pages render from an internal JSON endpoint the site calls in the background. Capture AJAX Response loads the page in a real browser and returns the response of that call, matched on a substring of its URL. What comes back is the site's own structured data, which does not break when the front end is redesigned. For a listings site or a store that ships a new template every quarter, this is the difference between a scrape you maintain and a scrape you set up. The captured payload flows into Google Sheets or into the model step that summarizes it.
-
Content that is not in the page at all
A partner's jobs board or booking widget often lives entirely inside an iframe, which means it is absent from the page's own HTML and invisible to any selector written against it. Scrape Iframe reads the named frame directly, and an extractor supplied alongside runs against the frame rather than the parent, which is almost always what was meant. It matches the iframe's
nameattribute rather than its id, src, or class, which is the detail that costs an afternoon when it is discovered by trial.
Human-in-Loop Highlight
Extract Data is deliberately loud about one failure and silent about the other. An extractor that errors raises rather than returning an empty object, because ScrapeNinja reports extractor errors inside a successful response body, and a silently empty extraction is the kind of thing that goes unnoticed for weeks. That covers the extractor that breaks. It does nothing for the extractor that keeps working and starts reading the wrong element after a redesign, which returns a full, plausible, confidently wrong record every night.
So a new or edited extractor does not go straight to the URL list. The agent runs it against a named sample, and posts the actual output beside the actual page: "New extractor for the supplier catalog, run against 5 URLs. price resolved to 89.00, 129.00, 24.99, and empty on two. The previous extractor returned a value on all 5. The two empties are bundle pages where the price sits in a different node. Ship, or fix the selector first?" The extractor is code, it runs in somebody else's cloud, and everything downstream is about to treat its output as fact. Reading five records takes a person two minutes. Unwinding a month of wrong prices from a database does not.
Agent Capabilities
7 actionsFetch Engines
3- Scrape Fetches a page with the fast engine: a real Chrome TLS fingerprint with no JavaScript execution. The one to try first on every site, because it clears a good deal of anti-scraping protection on fingerprint alone and costs a fraction of the browser engine. A block page still returns as a success, so the response also carries a block signal and the upstream status for the flow to branch on.
- Scrape With Browser Fetches a page with real Chrome, executing JavaScript, waiting for elements, intercepting background requests, and taking screenshots. Slower and more expensive, so it is the escalation rather than the default. Blocking images and media cuts both time and bandwidth substantially and rarely changes what an extractor reads.
- Scrape With Browser V2 Fetches a page with the newer browser engine, which the vendor says performs better against Cloudflare, DataDome, Kasada, and PerimeterX. It is not a strict upgrade: it drops the iframe and background-request interception options the previous engine has, and it is available only through one of the two marketplaces ScrapeNinja is sold through.
Extraction
1- Extract Data Scrapes a page and returns only the extractor's JSON, discarding the HTML. The operation most workflows actually want, since fields are usable in a later step and a document is not. The extractor is required here, and an extraction that returns nothing raises rather than handing back an empty object.
Content Other Fetches Miss
3- Capture AJAX Response Loads a page in a real browser and captures the response of one of the site's own background requests, matched on a substring of the request URL. When a page renders from an internal JSON endpoint, reading that endpoint is far more durable than any selector, because a redesign of the markup does not touch it.
- Scrape Iframe Loads a page in a real browser and returns the HTML of one named frame rather than the main document. The way to reach an embedded widget, such as a jobs board or a booking form, that lives entirely inside a frame and is therefore absent from the page's own HTML. It matches the frame's `name` attribute.
- Screenshot Page Loads a page in a real browser, captures it, and stores the image in FlowRunner file storage. ScrapeNinja returns a screenshot as a URL rather than as bytes, so this fetches it and hands back a stored file that a later step can attach or upload.
Frequently Asked Questions
What can FlowRunner do with ScrapeNinja?
FlowRunner agents can run Scrape, Scrape With Browser, and Scrape With Browser V2 in ScrapeNinja, plus 4 more actions.
Does connecting ScrapeNinja to FlowRunner require OAuth?
No. ScrapeNinja connects to FlowRunner with an API key, no OAuth flow required.
Can ScrapeNinja trigger a FlowRunner workflow automatically?
ScrapeNinja doesn't currently expose triggers in FlowRunner. It connects as an action step inside workflows started by another trigger.
Start building with ScrapeNinja
Free plan, no card required. Connect in minutes.