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

Scrape DuckDuckGo search results for any query: title, URL, description, date, domain, site name and sitelinks, in dozens of regions, with time and safe search filters.
Turn any DuckDuckGo search into a clean table of results: title, URL, description, publish date, domain, site name and sitelinks for every organic result. Run one query or hundreds at once, in dozens of regions, with DuckDuckGo's own time and safe search filters. No login, no API key, and 1,000 results cost about $0.45.
| Field | What it does |
|---|---|
queries | Search queries or DuckDuckGo search URLs, one per line. Operators such as site:, quotes and -word work. |
maxResultsPerQuery | Results to save per query. 0 saves every result DuckDuckGo shows. |
region | DuckDuckGo region code, for example us-en, uk-en, de-de, jp-jp or wt-wt (worldwide). |
timeFrame | any, d (past day), w (past week), m (past month) or y (past year). |
dateFrom / dateTo | A custom date range (YYYY-MM-DD). Overrides the time frame. |
safeSearch | moderate, strict or off. |
proxyConfiguration | Proxy settings. The datacenter group is the default and works well. |
{
"queries": ["web scraping", "electric cars"],
"maxResultsPerQuery": 20,
"region": "us-en",
"timeFrame": "any",
"safeSearch": "moderate"
}
One row per organic result.
| Field | Description |
|---|---|
query | The query this result belongs to |
position | Rank of the result for this query (1 = top) |
title | Page title |
url | Result URL |
displayUrl | The URL as DuckDuckGo shows it |
hostname | Domain of the result |
siteName | Site name shown by DuckDuckGo, when there is one |
description | Snippet as plain text |
rawDescription | Snippet with DuckDuckGo's HTML highlighting |
time / date | Publish date when DuckDuckGo shows one (full timestamp and YYYY-MM-DD) |
icon | Favicon URL |
sitelinks | Extra links shown under the result (title, URL, description) |
page | Results page the row came from |
region | Region used for the search |
searchUrl | The DuckDuckGo search URL for this query |
Example row from a real run:
{
"query": "web scraping",
"position": 1,
"title": "What is Web Scraping and How to Use It? - GeeksforGeeks",
"url": "https://www.geeksforgeeks.org/blogs/what-is-web-scraping-and-how-to-use-it/",
"displayUrl": "www.geeksforgeeks.org/blogs/what-is-web-scraping-and-how-to-use-it/",
"hostname": "www.geeksforgeeks.org",
"siteName": "GeeksForGeeks",
"description": "Web scraping is an automated method to extract large amounts of data from websites. This data, usually in HTML format, is converted into structured formats like spreadsheets or databases for further use. ...",
"rawDescription": "<b>Web</b> <b>scraping</b> is an automated method to extract large amounts of data from websites. ...",
"time": "2025-11-12T00:00:00.0000000",
"date": "2025-11-12",
"icon": "https://external-content.duckduckgo.com/ip3/www.geeksforgeeks.org.ico",
"sitelinks": [
{
"title": "Introduction to Web Scraping",
"url": "https://www.geeksforgeeks.org/web-scraping/introduction-to-web-scraping/",
"description": null
}
],
"page": 1,
"region": "us-en",
"searchUrl": "https://duckduckgo.com/?q=web%20scraping&kl=us-en&kp=-1&ia=web"
}
You pay $0.45 per 1,000 results ($0.00045 per saved result). Queries with no results and failed queries add no result fees.
Platform usage (compute and proxy traffic) is billed on top and is very small: our 10 queries × 100 results test (1,000 results) used about $0.002 of platform usage, so that job came to about $0.45 in total. Set a maximum charge per run and the scraper stops cleanly when it is reached.
Is it legal to scrape DuckDuckGo? The scraper only collects public search results that anyone can see without an account. Check the rules that apply to your use case and how you use the data, especially if the results contain personal data.
Do I need a login, API key or my own proxy? No. It works without an account, and the built-in datacenter proxy is enough.
How many results can I get per query? As many as DuckDuckGo shows. In our tests that was about 175 to 300 results for narrow queries and up to about 2,000 for broad shopping queries such as "espresso machine". The scraper collects everything up to your limit and the status message tells you when a query had fewer. For more results, add more queries; there is no limit on the number of queries. One test run collected 70,366 results from 60 queries in about 11 minutes.
Why is the date or site name empty for some results? DuckDuckGo shows a publish date only for some pages (news, blogs, forums) and a site name only for some domains. The fields stay empty when DuckDuckGo has nothing to show.
Can I schedule it or use it from code? Yes. Schedule runs in the console, or start them through the API and read the dataset as JSON, CSV or Excel.
Can I reuse input from a similar actor on another platform?
Mostly. A single query text and a maxRecords limit are accepted as well. Time frame values are any, d, w, m and y, and safe search values are moderate, strict and off.
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.
queriesarrayOptionalSearch queries
What to search for, one query per line, exactly as you would type it into DuckDuckGo. Search operators such as site:, quotes and -word work. You can also paste a DuckDuckGo search URL; its query, region, safe search and time filter are used.
maxResultsPerQueryintegerOptionaldefault 20Maximum results per query
How many organic results to save for each query. DuckDuckGo shows about 175 to 300 results for narrow queries and up to about 2,000 for broad ones, so a query can return fewer than you ask for. Set 0 to save every result DuckDuckGo shows.
Region, time filter and safe search, the same options as on duckduckgo.com.
regionenumOptionaldefault "us-en"Region
The DuckDuckGo region (market and language) to search in.
timeFrameenumOptionaldefault "any"Time frame
Only return pages from this period. Ignored when a custom date range is set below.
dateFromstringOptionalCustom range: from
Start of a custom date range (YYYY-MM-DD). With only an end date, the range starts in 2000.
dateTostringOptionalCustom range: to
End of a custom date range (YYYY-MM-DD). With only a start date, the range ends today.
safeSearchenumOptionaldefault "moderate"Safe search
Filter adult content, like the safe search switch on duckduckgo.com.
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Proxies used to reach DuckDuckGo. The datacenter group works well and is the cheapest.
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 |
|---|---|---|
| query | string | null | |
| position | number | null | |
| title | string | null | |
| url | string | null | |
| displayUrl | string | null | |
| hostname | string | null | |
| siteName | string | null | |
| description | string | null | |
| rawDescription | string | null | |
| time | string | null | |
| date | string | null | |
| icon | string | null | |
| sitelinks | array | null | |
| page | number | null | |
| region | string | null | |
| searchUrl | string | null |
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 |
|---|---|---|
| Search result | One organic DuckDuckGo search result saved to the dataset. Queries with no results and failed queries are not charged. | $0.00045 |
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/duckduckgo-scraper').call({
"queries": [
"web scraping",
"electric cars"
],
"maxResultsPerQuery": 20,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// 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/duckduckgo-scraperPaste 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/duckduckgo-scraper"
}
}
}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.
Electric car pages DuckDuckGo found in the last 7 days, 15 results.
15 results for 'elektroauto test' from the German DuckDuckGo market.
Top 5 results for three product searches in one run.
Goes past the first page: 60 ranked results for 'python tutorial'.
Olympics coverage from July and August 2024, strict safe search.
Paste a DuckDuckGo URL; the query and the UK region come from the URL.
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.