
Website Content Crawler
scrape.ly/store/querystone/website-content-crawlerAIDeveloper tools
1 monthly user

Web browser for AI agents and RAG pipelines: search Google, fetch the top result pages, and return clean Markdown or text ready for LLMs. Also accepts a single URL.
Search Google, open the pages that matter, and hand your model clean Markdown instead of a link it still has to read.
Built for RAG pipelines, agents, and research jobs that need the text of a public page in the dataset before the next step of the workflow runs.
query is a Google search or a single public URL. A URL skips search and fetches that page.maxResults chooses how many organic results to store, from 1 to 100 (the run keeps every extracted page in memory until it returns). A blocked search page is retried. A Google results page that still has no public links is loaded once in a remote scraping browser. A result URL that is not a public document is tried again on a new session, then in headless Chrome. Once maxResults pages are stored the run ends. If it is still short and a result URL is missing, the run fails and writes nothing. When Google returns no further public pages and every result URL was stored, the shorter clean set is stored.outputFormats returns markdown, text, html, or any combination. Markdown links are absolute, so they still work after the page is gone.removeElementsCssSelector drops the matching nodes before conversion. Navigation, scripts, and the other default chrome stay out of the prompt.removeCookieWarnings also strips common consent containers from the HTML before conversion.htmlTransformer set to readableText keeps the readable article when extraction is confident, and keeps the cleaned HTML when it is not. none only applies the element removal.metadata taken from that document: title, description, author, keywords, language, canonical URL, Open Graph tags, and JSON-LD. A field that the page does not have is left off the item.HTTP first, for every page that already returns. Headless Chrome loads only a result URL that HTTP did not store, using the residential proxy and no saved cookies. Markdown is converted from the HTML the page sent.
It is a Scrapely run with a dataset, a timeout, and retries. requestTimeoutSecs bounds the whole query. serpMaxRetries retries search. maxRequestRetries retries a page. desiredConcurrency caps how many pages are open at once. Set it to 0 and the run picks a small pool from the memory it was given.
The dataset contains only handled public pages. A direct URL that cannot be stored fails the run and writes nothing. A search that stops while later Google pages are still unread fails the same way. A result URL that stays blocked is retried on a new session. Once maxResults pages are stored the run ends, even if an earlier result URL stayed blocked. If the run is still short and a result URL is missing, it fails and writes nothing. When Google has no further public pages and every result URL was stored, the shorter clean set is stored and the run says why.
proxyConfiguration chooses how target pages are fetched. When Scrapely Proxy is on and no group is set, pages use the residential group. Google Search runs in fast search mode (US results, English interface). If fast search mode fails for a results page (an error, a timeout, or no results on the first page), the log says Switching to browser mode for this query page and that page runs in browser mode: the platform's remote browser with a US exit when the run has one, otherwise a local headless Chromium behind the residential proxy. In browser mode, if Google keeps answering with its consent or unusual-traffic page, the run fails and says so.
Pay per event: SERP page, $1.50 per 1,000 Google results pages ($0.0015 each). One event is charged for each Google results page the search retrieved, in either mode; a run that reads 2 results pages to store 15 documents is charged 2 events. A direct URL doesn't search, so it isn't charged. A run that fails and writes nothing isn't charged. The run checks its maximum total charge before each results page; when the next page isn't covered, it stops searching and stores the clean pages it already has.
{
"htmlTransformer": "none",
"proxyConfiguration": {
"useScrapelyProxy": true
},
"query": "https://en.wikipedia.org/wiki/Retrieval-augmented_generation"
}
One item from a real run of the example input, shortened. Long text is cut and lists show their first entries.
{
"crawl": {
"httpStatusCode": 200,
"httpStatusMessage": "OK",
"loadedAt": "2026-10-12T22:14:51.181Z",
"uniqueKey": "AQUoPf3PyX",
"requestStatus": "handled"
},
"metadata": {
"title": "Retrieval-augmented generation - Wikipedia",
"url": "https://en.wikipedia.org/wiki/Retrieval-augmented_generation",
"languageCode": "en",
"canonicalUrl": "https://en.wikipedia.org/wiki/Retrieval-augmented_generation",
"openGraph": [
{
"property": "…",
"content": "…"
},
{
"property": "…",
"content": "…"
}
],
"headers": {
"accept-ranges": "bytes",
"age": "7110",
"cache-control": "private, s-maxage=0, max-age=0, must-revalidate, no-transform",
"content-encoding": "gzip",
"content-language": "en",
"content-length": "46696",
"content-security-policy": "script-src 'unsafe-eval' blob: 'self' meta.wikimedia.org *.wikimedia.org *.wikipedia.org *.wikinews.org *.wiktionary.org *.wikibooks.org *.wikiversity.org *.…",
"content-type": "text/html; charset=UTF-8",
"date": "Mon, 12 Oct 2026 20:16:18 GMT",
"last-modified": "Mon, 12 Oct 2026 18:31:50 GMT",
"nel": "{ \"report_to\": \"wm_nel\", \"max_age\": 604800, \"failure_fraction\": 0.05, \"success_fraction\": 0.0}",
"report-to": "{ \"group\": \"wm_nel\", \"max_age\": 604800, \"endpoints\": [{ \"url\": \"https://intake-logging.wikimedia.org/v1/events?stream=w3c.reportingapi.network_error&schema_u…",
"reporting-endpoints": "csp-report-to-endpoint='/w/api.php?action=cspreport&format=json';",
"server": "mw-web.eqiad.main-6df4688ffd-gg2zh",
"server-timing": "cache;desc=\"hit-front\", host;desc=\"cp3073\",co_id;desc=\"1572652044\"",
"strict-transport-security": "max-age=106384710; includeSubDomains; preload",
"vary": "Accept-Encoding,X-Subdomain,Cookie,Authorization,User-Agent",
"x-cache": "cp3073 miss, cp3073 hit/1",
"x-cache-status": "hit-front",
"x-client-ip": "78.133.77.167",
"x-content-type-options": "nosniff",
"x-request-id": "a56e96a4-4cb2-42cb-8af6-761fc6df3095"
}
},
"query": "https://en.wikipedia.org/wiki/Retrieval-augmented_generation",
"markdown": "Retrieval-augmented generation - Wikipedia\n[Jump to content](#bodyContent)\n[\n, and crawl:
crawl.httpStatusCodecrawl.httpStatusMessage (OK when the page was handled)crawl.loadedAtcrawl.uniqueKeycrawl.requestStatus (handled for every stored page)crawl.debug only when debugMode is truemetadata is filled from the response and the document:
metadata.urlmetadata.redirectedUrl when the final URL differs from the requested onemetadata.title, metadata.description, metadata.author, metadata.keywords, metadata.languageCodemetadata.canonicalUrlmetadata.openGraph as {property, content} pairsmetadata.jsonLd when a JSON-LD script parsesmetadata.headers from the response, without cookie headersmarkdown, text, and html appear only for the formats you requested, and only when that conversion produced text. A direct URL has no searchResult. A media URL has no body.
Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
querystringRequiredSearch term or URL
Google Search keywords or the URL of a specific page. Search operators work, e.g. san francisco weather, https://www.cnn.com or function calling site:openai.com.
maxResultsintegerOptionaldefault 5Maximum results
The maximum number of top organic Google Search results whose web pages will be extracted, up to 100: the run keeps every extracted page in memory until it returns. If `query` is a URL, then this field is ignored and the Actor only fetches the specific web page.
serpMaxRetriesintegerOptionaldefault 2Google Search retries
Browser mode only. How many more browser sessions to try when Google answers a results page with a consent or unusual-traffic page. If the last one is blocked too, the run fails with that reason.
scrapingToolenumOptionaldefault "raw-http"Select a scraping tool
Select a scraping tool for extracting the target web pages. The Browser tool is more powerful and can handle JavaScript heavy websites, while the Plain HTML tool can't handle JavaScript but is about two times faster.
dynamicContentWaitSecsintegerOptionaldefault 10Target page dynamic content timeout
The maximum time in seconds to wait for dynamic page content to load. The Actor considers the web page as fully loaded once this time elapses or when the network becomes idle.
removeCookieWarningsbooleanOptionaldefault trueRemove cookie warnings
If enabled, the Actor attempts to close or remove cookie consent dialogs to improve the quality of extracted text. Note that this setting increases the latency.
removeElementsCssSelectorstringOptionaldefault "nav, footer, script, style, noscript, svg, img[src^='data:…Remove HTML elements (CSS selector)
CSS selector for elements removed before the page is converted to text, Markdown or HTML. The default removes navigation, headers, footers, modals, scripts and inline images. Set it to a selector that matches nothing (e.g. dummy_keep_everything) to keep everything.
maxRequestRetriesintegerOptionaldefault 1Target page max retries
The maximum number of times the Actor will retry loading the target web page on error. If the last attempt fails, the page will be skipped in the results.
outputFormatsarrayOptionaldefault ["markdown"]Output formats
Select one or more formats to which the target web pages will be extracted and saved in the resulting dataset.
debugModebooleanOptionaldefault falseEnable debug mode
If enabled, the Actor will store debugging information into the resulting dataset under the `debug` field.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true}Proxy configuration
Proxy used to fetch the target pages.
requestTimeoutSecsintegerOptionaldefault 240Request timeout
The maximum time in seconds available for the request, including querying Google Search and scraping the target web pages. For example, OpenAI allows only 45 seconds for custom actions. If the search or the page fetches are still unfinished when this time ends, the run stops and does not write a partial set.
htmlTransformerstringOptionaldefault "none"HTML transformer
How to extract the main content. None only removes the elements from Remove HTML elements. Readable text keeps the main content and falls back to the cleaned HTML when it isn't confident.
desiredConcurrencyintegerOptionaldefault 5Desired browsing concurrency
The desired number of web browsers running in parallel. The system automatically scales the number based on the CPU and memory usage. If the initial value is `0`, the Actor picks the number automatically based on the available memory.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| metadata.url | any | Page URL |
| metadata.title | any | Page title |
| searchResult.resultType | any | Result type |
| markdown | any | Extracted Markdown |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| SERP page | One page of Google search results | $0.0015 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('querystone/rag-web-browser').call({
"query": "https://en.wikipedia.org/wiki/Retrieval-augmented_generation",
"maxResults": 5,
"removeElementsCssSelector": "nav, footer, script, style, noscript, svg, img[src^='data:'],\n[role=\"alert\"],\n[role=\"banner\"],\n[role=\"dialog\"],\n[role=\"alertdialog\"],\n[role=\"region\"][aria-label*=\"skip\" i],\n[aria-modal=\"true\"]",
"proxyConfiguration": {
"useScrapelyProxy": true
},
"htmlTransformer": "none"
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run querystone/rag-web-browserPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=querystone/rag-web-browser"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Searches Google and returns the top pages as clean Markdown.
Fetches a URL and converts it to Markdown.
Search results rendered in a browser for dynamic sites.
Scrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.