DuckDuckGo Search Scraper — Organic SERP API avatar

DuckDuckGo Search Scraper — Organic SERP API

Under maintenance

Pricing

$0.60 / 1,000 organic search results

Go to Apify Store
DuckDuckGo Search Scraper — Organic SERP API

DuckDuckGo Search Scraper — Organic SERP API

Under maintenance

Get clean, paginated DuckDuckGo organic search results with rank, title, URL, domain, and snippet. Fast HTTP, 68 regions, and pay-per-result pricing.

Pricing

$0.60 / 1,000 organic search results

Rating

0.0

(0)

Developer

DataScraperES

DataScraperES

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 days ago

Last modified

Share

Collect live, paginated organic web search results from DuckDuckGo without setting up a browser, proxy, or scraping infrastructure. Enter one or more search queries, select a region and Safe Search level, and receive structured results ready for SEO analysis, research, spreadsheets, databases, or automation.

Run DuckDuckGo Search Scraper on Apify.

Each result includes its organic position, title, destination URL, domain, displayed URL, snippet, query, region, page number, and retrieval time. The Actor extracts organic web results only: advertisements, images, news, videos, and shopping results are not included.

Why use this DuckDuckGo Search Scraper?

  • Paginated organic results: collect up to 100 results and 10 pages per query.
  • Bulk search: process up to 1,000 queries in one run.
  • Regional search: choose from 68 DuckDuckGo regional markets.
  • Safe Search control: use Strict, Moderate, or Off filtering.
  • Clean destination URLs: DuckDuckGo redirect links are decoded before delivery.
  • Consistent ranking fields: receive both page-level and overall organic positions.
  • Duplicate protection: repeated queries and duplicate destination URLs are removed automatically.
  • Production-friendly runs: automatic retries and per-query isolation prevent one failed query from stopping an entire batch.
  • Simple pay-per-result pricing: pay only for organic results delivered to the dataset.
  • No user proxy setup: open the Actor, provide queries, and start the run.

Common use cases

  • Track organic rankings for keywords across countries and languages.
  • Discover websites and domains ranking for a topic.
  • Build competitor, keyword, and content-research datasets.
  • Collect search results for AI retrieval, classification, or enrichment workflows.
  • Monitor changes in DuckDuckGo search results with scheduled runs.
  • Export search data to JSON, CSV, Excel, or XML.
  • Send results to Google Sheets, Make, Zapier, webhooks, or your own application.

How to scrape DuckDuckGo search results

No coding is required.

  1. Open the Actor's Input tab.
  2. Add one search query per line under Search queries.
  3. Choose the maximum number of results and pages for each query.
  4. Select the desired region and Safe Search setting.
  5. Click Start.
  6. Open the Dataset or Output tab to preview, filter, and download the results.

For a first test, use one query with the defaults: 10 results, one page, no specific region, and Moderate Safe Search.

Input example

This example requests up to 30 organic results for each query, follows up to three result pages, and localizes the search to the United States:

{
"queries": [
"best python web scraping libraries",
"apify actor tutorial"
],
"maxResultsPerQuery": 30,
"maxPagesPerQuery": 3,
"region": "us-en",
"safeSearch": "Moderate"
}

Input options

FieldTypeDefaultAccepted valuesWhat it does
queriesstring arrayRequired1–1,000 queries; maximum 500 characters eachSearch terms to send to DuckDuckGo. Add one query per line in the Input UI. Blank values and case-insensitive duplicates are removed.
maxResultsPerQueryinteger101100Maximum number of unique organic results delivered for each query.
maxPagesPerQueryinteger1110Maximum number of DuckDuckGo pages the Actor may request for each query.
regionstringwt-wtOne of the supported region codesLocalizes the result set to a country or language market. wt-wt does not request a specific region.
safeSearchstringModerateStrict, Moderate, OffControls DuckDuckGo's explicit-content filtering. Values are case-sensitive when using JSON or the API.

Results and pages work together

The Actor stops a query as soon as one of these conditions is reached:

  • maxResultsPerQuery unique results have been collected;
  • maxPagesPerQuery pages have been fetched;
  • DuckDuckGo returns no results or no new unique results;
  • the run reaches the maximum charge selected by the user;
  • repeated request attempts cannot complete the query.

DuckDuckGo can return a variable number of organic results per page. If you request 50 results but allow only one page, the Actor may deliver fewer than 50. Increase maxPagesPerQuery when requesting larger result sets. A practical starting point is one page for 10 results, three pages for 30 results, and up to 10 pages for larger collections.

Region codes

The Input UI displays friendly region names. When calling the Actor through JSON or the API, send the corresponding code.

MarketCode
No specific regionwt-wt
United States — Englishus-en
United States — Spanishue-es
United Kingdomuk-en
Spaines-es
Latin Americaxl-es
Mexicomx-es
Canada — Englishca-en
Canada — Frenchca-fr
Brazilbr-pt
Francefr-fr
Germanyde-de

Safe Search values

ValueRecommended use
StrictApply the strongest explicit-content filtering.
ModerateBalanced filtering and the default for most searches.
OffRequest results without Safe Search filtering.

Output example

The default dataset contains one item for every delivered organic result. A typical item looks like this:

{
"type": "organicResult",
"resultId": "b7e765afe3c62166bb1f69543163e312",
"query": "apify actor tutorial",
"queryId": "efaa5d1aa8e60b8681af52ff",
"region": "us-en",
"safeSearch": "Moderate",
"page": 1,
"pagePosition": 1,
"position": 1,
"title": "Actors | Platform | Apify Documentation",
"url": "https://docs.apify.com/platform/actors",
"domain": "docs.apify.com",
"displayUrl": "docs.apify.com/platform/actors",
"description": "Learn how to build and run Apify Actors.",
"pagesFetched": 1,
"organicResultsFound": 10,
"paginationStoppedReason": "max_results_reached",
"fetchedAt": "2026-07-13T10:30:00+00:00"
}

Output fields

FieldTypeMeaning
typestringAlways organicResult.
resultIdstringStable identifier generated from the query settings and destination URL. Useful for deduplication.
querystringNormalized search query that produced the result.
queryIdstringStable identifier generated from the query, region, and Safe Search setting.
regionstringDuckDuckGo regional market used for the query.
safeSearchstringSafe Search setting used for the query.
pageintegerDuckDuckGo result page where the item appeared, starting at 1.
pagePositionintegerOrganic position within that page, starting at 1.
positionintegerOverall organic position across all fetched pages for the query, starting at 1.
titlestringOrganic result title.
urlstringDecoded destination URL.
domainstring or nullHostname extracted from the destination URL.
displayUrlstring or nullURL text displayed by DuckDuckGo.
descriptionstring or nullSearch-result snippet when available.
pagesFetchedintegerTotal number of pages successfully fetched for this query.
organicResultsFoundintegerNumber of unique organic results found for this query before any final budget truncation.
paginationStoppedReasonstringReason the Actor stopped following result pages.
fetchedAtstringUTC timestamp recorded when the query finished.

position represents the order of the organic results returned by this run. Advertisements are excluded and do not consume ranking positions in the dataset.

Downloading and integrating results

Open the run's Dataset tab to preview the results or export them in formats such as JSON, CSV, Excel, and XML. You can also use Apify integrations to send data to external tools, trigger a webhook when a run finishes, or save the input as a Task and schedule recurring searches.

The Output tab provides direct links to:

  • Organic search results: the default dataset containing billable result rows.
  • Run summary: totals for requested, completed, empty, partial, failed, and budget-skipped queries, plus pages and delivered results.
  • Query diagnostics: details for queries that were empty, partial, failed, or skipped because of the run budget. Successful queries are represented directly by their dataset results.

Run through the Apify API

The Actor's API tab provides ready-to-use examples containing the correct Actor ID for your account. Never expose your Apify API token in public code.

Python client

Install the official client:

$pip install apify-client

Run the Actor and iterate over its dataset:

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_API_TOKEN")
run_input = {
"queries": ["best python web scraping libraries", "apify actor tutorial"],
"maxResultsPerQuery": 30,
"maxPagesPerQuery": 3,
"region": "us-en",
"safeSearch": "Moderate"
}
run = client.actor("datascraperes/duckduckgo-search-results-scraper").call(
run_input=run_input
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["position"], item["title"], item["url"])

The Actor can also be addressed by its immutable ID: WMQyI6FacMcnQLdeh.

Synchronous HTTP request

For small runs, you can start the Actor and receive the dataset items in one request:

curl -X POST \
"https://api.apify.com/v2/acts/datascraperes~duckduckgo-search-results-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"queries": ["apify actor tutorial"],
"maxResultsPerQuery": 10,
"maxPagesPerQuery": 1,
"region": "us-en",
"safeSearch": "Moderate"
}'

For large query lists, use the asynchronous Actor run endpoint or the Python client so the caller does not need to keep one HTTP request open.

Pricing

The Actor uses pay-per-event pricing. One organic-result event costs $0.00015 and corresponds to one organic result successfully delivered to the default dataset.

Delivered resultsActor price
10$0.0015
100$0.015
1,000$0.15
10,000$1.50

There is no Actor start fee, and platform usage is included in the result price. Empty queries, failed requests, advertisements, diagnostic records, and results that cannot be delivered because of the user's maximum charge are not billed.

Before starting a run, Apify displays the event price and lets you set a maximum charge per run. The Actor respects that limit and stops starting new queries when the remaining budget cannot fund another requested result batch. The final price can therefore be lower than the theoretical maximum if DuckDuckGo returns fewer results or the run reaches the spending limit.

Maximum estimated result charge:

number of queries × maxResultsPerQuery × $0.00015

For example, 100 queries with a maximum of 30 results each have a maximum result charge of 100 × 30 × $0.00015 = $0.45.

Tips for reliable searches

  • Start with a small run to confirm that the selected region and query wording return the expected market.
  • Increase both maxResultsPerQuery and maxPagesPerQuery when you need deeper rankings.
  • Use a specific regional code for local SEO research. wt-wt does not force a country market.
  • Use the same query, region, and Safe Search values across scheduled runs when comparing rankings over time.
  • Use resultId for query-specific deduplication and queryId to group results from the same search settings.
  • Set a maximum charge before large runs to keep spending predictable.

Limitations

  • The Actor currently supports DuckDuckGo organic web results only. It does not return ads, images, news, videos, maps, or shopping results.
  • DuckDuckGo controls which results are available and how many appear on each page, so the requested maximum is not guaranteed.
  • Rankings can change with time, region, language, Safe Search settings, and changes made by DuckDuckGo.
  • description, displayUrl, or domain can be null when the source result does not provide a usable value.
  • The maximum input is 1,000 unique queries, 100 results per query, and 10 pages per query.
  • Search-page changes or temporary access restrictions can cause an individual query to finish as partial or failed. Other queries continue independently.

Frequently asked questions

Does this Actor scrape DuckDuckGo advertisements?

No. Only organic web results are delivered and billed.

Not currently. The output contract is intentionally focused on clean organic web results.

Why did I receive fewer results than requested?

The page limit may have been reached, DuckDuckGo may have returned fewer results, duplicate URLs may have been removed, no additional page may have been available, a query may have exhausted its retries, or the run may have reached its maximum charge. Check paginationStoppedReason and the Query diagnostics link in the Output tab.

Is position the paid or organic ranking?

It is the organic ranking within the results delivered for that query. Ads are excluded.

Are duplicate queries processed twice?

No. Leading and trailing whitespace is removed, repeated internal whitespace is normalized, and duplicate queries are removed case-insensitively. The first spelling of each query is retained.

Do I need to configure a proxy?

No. Proxy handling is managed by the Actor and is not part of the user input.

Can I schedule ranking checks?

Yes. Save your input as an Apify Task, attach a Schedule, and export or forward each completed dataset using an integration or webhook.

This Actor collects publicly visible search-result metadata. You are responsible for ensuring that your use complies with applicable laws, contractual requirements, and the rights of third parties. If your use case involves personal data or regulated information, obtain appropriate legal advice.

Support

If a run does not behave as expected, open the Actor's Issues tab and include:

  • the Apify run ID;
  • the input used, without API tokens or other secrets;
  • the query and region affected;
  • the expected and actual behavior.

This information makes it possible to reproduce and resolve the problem quickly.