DuckDuckGo & Bing Search Scraper - No Login, Real URLs avatar

DuckDuckGo & Bing Search Scraper - No Login, Real URLs

Pricing

from $3.30 / 1,000 results pages

Go to Apify Store
DuckDuckGo & Bing Search Scraper - No Login, Real URLs

DuckDuckGo & Bing Search Scraper - No Login, Real URLs

Scrape DuckDuckGo and Bing search results for your keywords: position, title, real website URL, snippet and domain. Pick region, safe search and time range, or compare both engines in one run. One row per result. No login.

Pricing

from $3.30 / 1,000 results pages

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

11 days ago

Last modified

Categories

Security

Limited permissions

Share

Add search queries, pick DuckDuckGo, Bing or both, and get the public search results as one row per result: position, title, real website URL, snippet and domain. No login, no API key; you pay per loaded results page (about 10 results), $0.0049 for the first page of one query with the start fee.

Use it for SEO and rank checks, research lists of websites, and as a web search tool for AI agents. The prefilled run (apify, 10 results, DuckDuckGo) finishes in a few seconds.

DuckDuckGo & Bing Search Scraper: search queries in, DuckDuckGo and Bing results out, one row per result with engine, position and domain

Table of contents

What it does

The Actor opens the public results pages of DuckDuckGo (its simple "lite" page) and Bing for each query, in the region you choose, and reads more pages until it has maxResults results or the engine has no more. For each result it saves:

  • position in the engine's result list (continues across pages);
  • title, snippet (description) and the real website URL (Bing's and DuckDuckGo's redirect links are decoded);
  • displayed URL and domain;
  • the engine, query, region and page it came from.

With engine: both every query is searched on both engines, so you can compare them in one Dataset.

Good fit

  • Check where a site appears on DuckDuckGo and Bing for a keyword list.
  • Collect the top 10–100 URLs for a topic for SEO, content or lead research.
  • Give an AI agent a cheap web search with clean rows.
  • Compare DuckDuckGo and Bing results for the same queries.

Not a fit / limits

  • Only organic web results. Ads, news, images, videos, maps, "People also ask" and AI answers are not returned.
  • Results are not personalised and not tied to a city.
  • Bing with the site: operator returns only its first page (about 10 results).
  • The engines sometimes block automated traffic. The Actor changes IP addresses and retries, but it never solves CAPTCHAs (see Troubleshooting).

Quick start

  1. Open the Input tab.
  2. In Search queries (queries), keep the prefilled apify or add your own queries, one per line.
  3. Keep Search engine DuckDuckGo (default), or choose Bing or Both.
  4. Keep Region United States (English) or choose another one.
  5. Keep Results per query (maxResults) at 10 (prefill), or set up to 100.
  6. Click Start.
  7. Open the Output tab and check engine, position, title and url.

Expected result: 10 rows for apify on DuckDuckGo in about 5 seconds.

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Rank check on two enginesqueries, engine: both, regionresult rowengine, query, position, domainSchedule + Google Sheets or API
Topic researchqueries, maxResults: 50result rowtitle, url, descriptionExport CSV / JSON
Web search for AI agentsqueries, maxResults: 5result rowtitle, url, descriptionMCP or API
Fresh pages onlyqueries, timeRange: weekresult rowurl, descriptionWebhook or Slack

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExample
queriesSearch queriesarray of textyesprefill ["apify"]1–500 queries, up to 256 characters eachOne search per query and engine. Operators like site:example.com and "exact phrase" are sent as typed. Duplicates and extra spaces are removed.["best running shoes", "python asyncio tutorial"]
engineSearch enginetextnodefault duckduckgoduckduckgo, bing, bothWhich engine(s) to search. both searches every query on each engine."both"
regionRegiontextnodefault us-enus-en, uk-en, ca-en, au-en, in-en, ie-en, de-de, at-de, ch-de, fr-fr, be-fr, es-es, mx-es, ar-es, it-it, nl-nl, br-pt, pt-pt, pl-pl, se-sv, jp-jp, kr-kr, tr-tr, wt-wt (no region)Country and language of the results. wt-wt is DuckDuckGo-only; Bing then searches as the United States."de-de"
maxResultsResults per queryintegernodefault 10, prefill 101–100Maximum results per query and engine. The Actor opens more pages until it has this many or the engine has no more.50
safeSearchSafe searchtextnodefault moderatemoderate, strict, offAdult content filter of the engine"strict"
timeRangeTime rangetextnodefault anyany, day, week, month, yearOnly pages the engine dates within this period"month"
proxyConfigurationProxyobjectnoempty (built-in route)Apify proxy groups or your own proxy URLsLeave empty: the Actor connects directly and switches to Apify residential proxy in the chosen country by itself when an engine blocks it. Set your own proxy to turn this off and use only yours.{"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]}

An empty queries list stops the run with a clear input error and no page charge.

Interacting settings

WhenInput AInput BEffective behaviorCost effect
Two enginesengine: bothmaxResults: 10Up to 10 results from each engine, so up to 20 rows per queryPages of both engines are charged
Bing outside the USengine: bing or bothregion not us-enBing is searched through a residential IP in that country; slowerSame price per page
Engine has fewer resultsmaxResults: 100a rare queryThe Actor stops at the last page the engine hasOnly loaded pages with results are charged
No regionregion: wt-wtengine: bingBing searches as the United StatesNo change
Own proxyproxyConfigurationanyNo automatic switch to residential proxySame price per page; your own proxy is paid by you

Input examples

Compare both engines in Germany, top 20

{
"queries": ["fahrrad kaufen", "laufschuhe herren"],
"engine": "both",
"region": "de-de",
"maxResults": 20
}

Expected behavior: 2 queries × 2 engines, up to 20 results each. Expected output: about 80 rows with engine, position, title, url. Cost note: about 8 pages + 1 start ≈ $0.032 on the Free plan.

Fresh results from the last week

{
"queries": ["apify actor release"],
"engine": "duckduckgo",
"timeRange": "week",
"maxResults": 10
}

Output

One Dataset row per result. A query without results on an engine gets one not_found row; a search that could not be loaded gets one free error row. The Results view shows the main columns.

Output fields

FieldMeaningTypeCan be empty?Example / enum
statusRow statustextnocomplete, not_found, error
engineSearch engine of this rowtextnoduckduckgo, bing
queryYour search querytextno"apify"
positionPlace in the engine's results for this query, from 1, across pagesnumbernull on not_found/error rows1
titleResult titletextnull on status rows"Apify: Marketplace of ready-to-run tools for AI"
urlReal website URLtextnull on status rows"https://apify.com/"
displayedUrlAddress as the engine shows it under the titletextyes"apify.com"
domainHost of the URL without www.textnull on status rows"apify.com"
descriptionSnippet texttextyes
pageEngine result page the row came from (1 = first)numbernull on error rows1
regionRegion code of the searchtextno"us-en"
searchUrlSearch page address. For DuckDuckGo pages after the first, the first page addresstextno
errorCodeMachine-readable reason on error rowstextnull except error rowsSOURCE_BLOCKED
statusReasonPlain-language reason on not_found and error rowstextnull on result rows"Bing returned no results for this query."
fetchedAtWhen the page was loaded (ISO 8601, UTC)textno"2026-10-15T05:44:38.881Z"

null means the engine did not show this value. It is not zero and not an error.

Output entities and surfaces

SituationWhereShapeWhat to do
Normal resultDatasetone row per result, status: completeUse engine, position, url
No results for a queryDatasetone not_found row per engineCheck the spelling or operators
Only unrelated resultsDatasetone free error row, errorCode: UNRELATED_RESULTSCheck the spelling or try the other engine
Some searches failedDataset + RUN_SUMMARYfree error rows, run status PARTIALRun the failed queries again later
Run stopped by time or charge limitRUN_SUMMARYstatus CAPPED, rows so far are keptRaise the limit or split the queries

RUN_SUMMARY in the Key-value store has the run status (COMPLETE, PARTIAL, NO_RESULTS, CAPPED, ERROR), the stop reason, totals (queries, pages, rows, not found, errors, charged pages), the same totals per engine and, for each query and engine, its status (results, not_found, error, not_processed), pages and results.

The Apify run shows SUCCEEDED for COMPLETE, NO_RESULTS and CAPPED, and for PARTIAL when only single searches failed. It shows FAILED when the input is invalid or an engine kept refusing all requests; rows already saved stay in the Dataset.

Output example

First row of the prefill run (apify, DuckDuckGo, us-en):

{
"status": "complete",
"engine": "duckduckgo",
"query": "apify",
"position": 1,
"title": "Apify: Marketplace of ready-to-run tools for AI",
"url": "https://apify.com/",
"displayedUrl": "apify.com",
"domain": "apify.com",
"description": "Apify is a marketplace of ready-to-run tools for AI. Get real-time web data, track competitors, generate leads, monitor social media, and integrate your apps and agents.",
"page": 1,
"region": "us-en",
"searchUrl": "https://lite.duckduckgo.com/lite/?q=apify&kl=us-en",
"errorCode": null,
"statusReason": null,
"fetchedAt": "2026-10-15T05:44:38.881Z"
}

A Bing row looks the same, with "engine": "bing" and the displayed URL as Bing prints it, for example "https://realpython.com › async-io-python".

Moving from a one-row-per-page format

Some search tools save one row per page with a nested list of results. Here each result is its own row:

One-row-per-page fieldThis Actor
searchQuery.termquery
searchQuery.pagepage
organicResults[].title / url / descriptionone row each: title, url, description
organicResults[].positionposition
organicResults[].displayedUrldisplayedUrl

Pricing and limits

Pricing unit

You pay per loaded results page that gave results (serp-page) plus a small start fee per run. A DuckDuckGo or Bing page has about 10 results (DuckDuckGo: 10 on the first page, then up to about 15). Platform usage (proxy, compute) is included in the price.

EventFreeBronzeSilverGold+
Run start (apify-actor-start)$0.001$0.001$0.001$0.001
Results page (serp-page)$0.0039$0.0037$0.0035$0.0033
  • A search with no results costs one page: the engine was asked and answered.
  • error rows and retried or blocked pages are free. This includes queries answered only with results unrelated to the query (UNRELATED_RESULTS).
  • If an engine answers nothing usable for 90 seconds (timeouts, errors or blocks), the Actor stops that engine, so a broken engine never makes a run expensive.
  • If you set a maximum charge for the run, the Actor stops before it, keeps the rows and ends with status CAPPED.

Cost examples (Free plan)

ScenarioInput scopePagesCharge
Prefill1 query, DuckDuckGo, 10 results1$0.0049
Small keyword list10 queries, one engine, 10 results10$0.040
Both engines10 queries, both, 10 results20$0.079
Top 1001 query, one engine, 100 resultsabout 8–9about $0.032–0.036
Query without results1 query, one engine1$0.0049

Limits

  • Up to 500 queries and 100 results per query and engine in one run.
  • 40 queries × 100 results on both engines (8,000 rows) took about 23 minutes in tests. After 3,600 seconds the run stops with status CAPPED and keeps all rows; split bigger lists across runs.
  • The engine decides how many results a query has; some queries end before maxResults.
  • Bing outside the United States is slower, because it goes through a residential IP in that country.

API, export and integrations

  • API: start the Actor with the same JSON input and read the Dataset items. See the API tab for ready code.
  • Export: download the Dataset as JSON, CSV, Excel or HTML from the Output tab.
  • Scheduling: create a Schedule with your keyword list to check rankings every day or week.
  • Integrations: send results to Google Sheets, Slack, Zapier or Make with Apify integrations.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/duckduckgo-bing-search
  • Smallest input:
{ "queries": ["apify"], "maxResults": 5 }
  • Key output fields: engine, position, title, url, description.
  • One page takes a few seconds and costs $0.0049 with the start fee. Keep maxResults at 10 or less for quick answers.

Troubleshooting

Some searches have error rows with SOURCE_BLOCKED

Symptom: the run is PARTIAL, some queries have one error row. Likely reason: the engine showed a block or CAPTCHA page to all tried IP addresses. Check: statusReason and RUN_SUMMARY. Action: run only the failed queries again later. Error rows are not charged.

Fewer results than maxResults

Symptom: a query has 23 results, you asked for 50. Likely reason: the engine has no more pages for this query, or Bing with site: returns only page 1. A warning in RUN_SUMMARY says when Bing repeated earlier results and the Actor stopped. Action: nothing to fix; only loaded pages with results are charged.

A not_found row for a normal query

Likely reason: the engine returned no results. Check the spelling, remove operators, or try the other engine.

error rows with UNRELATED_RESULTS

Symptom: a free error row says the engine answered only with results unrelated to the query. Likely reason: a nonsense or very rare query, or Bing showed an unrelated page to every tried IP address. When most queries of an engine end like this, the Actor stops that engine to keep the run cheap. Action: check the spelling, or run the query again later or on the other engine. These rows are not charged.

Results look different from my browser

Likely reason: your browser shows personalised results for your location and account. The Actor gets anonymous results for the chosen region.

FAQ

Do I need a DuckDuckGo or Bing account or API key?

No. The Actor reads public results pages without login or cookies of any account.

Why are the URLs real website addresses?

Both engines wrap results in redirect links. The Actor decodes them, so url is the page itself and domain is ready for grouping.

Is the order the same as on duckduckgo.com or bing.com?

position follows the order on the results pages for the chosen region. DuckDuckGo uses its simple "lite" page, which can differ a little from the full page.

How do I search only one site?

Add the operator to the query, for example site:apify.com scraper. On Bing you get the first page only.

Support

For bugs, questions or feature requests, open the Issues tab of this Actor. Add the run ID, your input (queries can be shortened) and the statusReason text. Never send tokens, cookies or passwords.