How it will work: 3 steps
- Follow us on ApifyThe tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
apifyin Search queries. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
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.
- 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.
Good for
- 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 good fit
- 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).
Who uses it
SEO specialists
Check where a site ranks on DuckDuckGo and Bing for a keyword list.
AI agent builders
Give an agent a cheap web search with clean rows.
Content researchers
Collect the top pages for a topic in a few minutes.
Price
Prices will be shown after release.
Questions
Do I get ads or news results?
No. You get organic web results only. Ads, news, images, maps and AI answers are not included.
Why are the links real website URLs?
Both engines use redirect links. The tool decodes them, so you get the page address itself.
How many results can I get per keyword?
Up to 100 results per query and engine. A run can have up to 500 queries.
Do I pay for blocked pages?
No. Error rows and blocked or retried pages are free.
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.
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.
Details
Step by step on Apify
- Open the Input tab.
- In Search queries (
queries), keep the prefilledapifyor add your own queries, one per line. - Keep Search engine
DuckDuckGo(default), or chooseBingorBoth. - Keep Region
United States (English)or choose another one. - Keep Results per query (
maxResults) at10(prefill), or set up to100. - Click Start.
- Open the Output tab and check
engine,position,titleandurl.
Use cases
| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Rank check on two engines | queries, engine: both, region | result row | engine, query, position, domain | Schedule + Google Sheets or API |
| Topic research | queries, maxResults: 50 | result row | title, url, description | Export CSV / JSON |
| Web search for AI agents | queries, maxResults: 5 | result row | title, url, description | MCP or API |
| Fresh pages only | queries, timeRange: week | result row | url, description | Webhook or Slack |
Tips for better results
- Pick a region to get results for one country.
- Use the time range filter to find fresh pages only.
- Split very long keyword lists into several runs.
Limits and good to know
- A search with no results costs one page: the engine was asked and answered
errorrows 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 - 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
CAPPEDand 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
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"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"
}Data fields (15)
| Field | Type | Meaning |
|---|---|---|
status | string | complete = search result; not_found = the engine returned no results for this query (one charged page); error = the search failed after retries (free). |
engine | string | Search engine of this row: duckduckgo or bing. |
query | string | Your search query. |
position | integer | Place in the engine's results for this query, from 1, continuing across pages; null on not_found/error rows. |
title | string | Result title. |
url | string | Real website URL (decoded from the engine's redirect link). |
displayedUrl | string | Address as the engine shows it under the title. |
domain | string | Host of the URL without www. |
description | string | Snippet text. |
page | integer | Engine result page the row came from (1 = first page). |
region | string | Region code of the search, e.g. us-en. |
searchUrl | string | Search page address. For DuckDuckGo pages after the first (loaded by form submit) this is the first page address. |
errorCode | string | Machine-readable reason on error rows, e.g. SOURCE_BLOCKED or UNRELATED_RESULTS (only unrelated results; not charged); null otherwise. |
statusReason | string | Plain-language explanation on not_found and error rows. |
fetchedAt | string | When the page was loaded (ISO 8601, UTC). |
Input settings (7)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Search queries required | queries | array | ["apify"] |
| Search engine | engine | string | "duckduckgo" |
| Region | region | string | "us-en" |
| Results per query | maxResults | integer | 10 |
| Safe search | safeSearch | string | "moderate" |
| Time range | timeRange | string | "any" |
| Proxy | proxyConfiguration | object |
Use cases with this tool
Each guide shows all the steps and the other tools.