# DuckDuckGo Search Results Scraper (`harpoon/duckduckgo-search-scraper`) Actor

Search DuckDuckGo and export every result with position, title, URL, domain, and snippet.

- **URL**: https://apify.com/harpoon/duckduckgo-search-scraper.md
- **Developed by:** [Harpoon](https://apify.com/harpoon) (community)
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 1,000 search results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### DuckDuckGo Search Results Scraper — turn a list of search terms into a clean, ranked dataset of web results

Give it one or more search terms and get back every web result as a structured row: its rank, title, URL, domain, displayed URL, and snippet. Results are de-duplicated and capped per query, so a run is reproducible instead of noisy. Enter your terms, set a cap, and press Start — the form is prefilled and runs as-is.

#### What can DuckDuckGo Search Results Scraper do?

- Search one or many terms in a single run and keep each term's results separate
- Capture the full result row — rank, title, destination URL, domain, displayed URL, and snippet
- Follow pagination automatically to collect up to thousands of results per query
- Rank results per query so you can track position changes over time
- Target a specific region and language so local results rank first
- Export results to JSON, CSV, Excel, or XML
- Run via the API, schedule runs, and integrate through webhooks or MCP

### What data can I extract?

<table>
<tr><th>What you get</th><th>Features</th></tr>
<tr><td>

- **Web result** — `query`, `position`, `page`, `title`, `url`, `domain`, `displayed_url`, `snippet`, `scraped_at`

</td><td>

- One row per result, ranked in the order shown
- Region / language selection (`us-en`, `uk-en`, `de-de`, …)
- Per-query result cap, de-duplicated automatically
- Export to JSON, CSV, Excel, XML
- API access, webhooks, SDKs
- LLM-ready output for MCP, ChatGPT, Claude

</td></tr>
</table>

### How to use DuckDuckGo Search Results Scraper

1. [Create](https://console.apify.com/sign-up) a free Apify account.
2. Open **DuckDuckGo Search Results Scraper** in Apify Console.
3. Enter one search term per line under **Search queries**.
4. Set **Max results per query** and, if you need a specific market, a **Region**.
5. Click **Save & Start**.
6. Download results in JSON, CSV, Excel, or XML.

### Input

Enter one or more **search queries**; each is searched separately and its own results are capped by **Max results per query**. **Region** controls how results are ranked and which language they are in. There is a single mode — search by term — and the untouched form runs with a demo term.

- `search_queries` — the terms to search, one per line.
- `max_results_per_query` — how many results to keep for each term (default 100).
- `region` — region and language used to rank results (default `us-en`).

**Example input**

```json
{
  "search_queries": ["mark ruffalo", "best coffee grinders"],
  "max_results_per_query": 100,
  "region": "us-en"
}
```

See the **Input** tab above for every parameter.

### Output

Results land in a dataset under the **Storage** tab, one row per web result. View them in the
**Overview** table, download in JSON, CSV, Excel, or XML, or pull them via the API.

```json
[
  {
    "query": "mark ruffalo",
    "position": 1,
    "page": 1,
    "title": "Mark Ruffalo - Wikipedia",
    "url": "https://en.wikipedia.org/wiki/Mark_Ruffalo",
    "domain": "en.wikipedia.org",
    "displayed_url": "en.wikipedia.org/wiki/Mark_Ruffalo",
    "snippet": "Learn about the life and career of Mark Ruffalo, an American actor who has starred in films such as You Can Count on Me, The Avengers, and Spotlight. Find out his biography, awards, family, and activism.",
    "scraped_at": "2026-09-26T13:09:24Z"
  },
  {
    "query": "mark ruffalo",
    "position": 2,
    "page": 1,
    "title": "Mark Ruffalo - IMDb",
    "url": "https://www.imdb.com/name/nm0749263/",
    "domain": "imdb.com",
    "displayed_url": "www.imdb.com/name/nm0749263/",
    "snippet": "Mark Ruffalo. Actor: Spotlight. Award-winning actor Mark Ruffalo was born on November 22, 1967, in Kenosha, Wisconsin.",
    "scraped_at": "2026-09-26T13:09:24Z"
  }
]
```

Field names are lowercase snake\_case. `position` is the 1-based rank within its `query`, and `page` records which result page the row was read from.

### What can you do with the data?

#### 1. Track ranking over time

1. Run a fixed list of keywords with **Max results per query** set to the depth you care about.
2. Schedule the Actor daily or weekly.
3. Compare `position` per `query` and `url` across runs to see what moved.

#### 2. Build a research or lead list

1. Enter the topics, products, or competitors you care about.
2. Set a high **Max results per query** to go deep on each term.
3. Export `title`, `url`, and `domain` to CSV and enrich or contact from there.

### How much does DuckDuckGo Search Results Scraper cost?

DuckDuckGo Search Results Scraper is priced **per result** (pay-per-event) at **$0.60 per 1,000 results** ($0.0006 each), plus a small Apify platform fee. Starting a run is free.

- Every web result saved to the dataset is charged as one `search-result` event.
- Results that are not returned — a query that tops out below your cap, or a skipped row — are not charged.
- A run of 10,000 results costs about **$6.00** in event charges, plus platform usage.

See the **Pricing** tab for current rates and plan discounts.

### FAQ

**Do I need an account, cookies, or an API key?**
No. Enter a search term and run — there is nothing to sign in to and no key to paste.

**Can I scrape private or restricted content?**
No. This Actor returns public web results only; it does not access anything behind a login.

**How many results can I get?**
Each search term exposes a finite set of result pages, so a term usually returns tens to a few hundred results. Set **Max results per query** to the depth you need; if a term tops out below your cap, add more specific queries to widen coverage.

**Is it legal to scrape search results?**
The Actor collects publicly available results only. Review Apify's guidance on legal and ethical scraping and your own obligations before using the data commercially.

**Can I use it with the API / SDKs / MCP?**
Yes — see the **API** tab above, or connect through the Apify MCP server.

**Something isn't working.**
A single failed term is skipped and logged rather than failing the whole run, so check the run log for a `skipped` line. If a run returns no results, widen your **Max results per query**, try a different **Region**, or open an issue in the **Issues** tab.

### Notes and limitations

- Search terms expose a finite number of result pages, so a high cap may return fewer rows than requested.
- `snippet` is shown exactly as displayed and can occasionally be empty for some results.
- `position` is the rank within its own query; different queries must be compared by query.
- `region` changes ranking and language and is not a hard geo-filter.

### Support

Found a bug or have feedback? Open an issue in the **Issues** tab.

# Actor input Schema

## `search_queries` (type: `array`):

One or more search terms, one per line, e.g. <code>mark ruffalo</code> or <code>best coffee grinders</code>. Each term is searched separately and its results are capped by <b>Max results per query</b>. Add one per line, or paste a list with <b>Bulk edit</b>. Duplicates are removed automatically.

## `max_results_per_query` (type: `integer`):

How many web results to return for each search term. Search results are finite, so a very high value may return fewer than requested - add more specific queries to go wider.

## `region` (type: `string`):

Region and language used to rank results, e.g. <code>us-en</code> for United States (English). Pick the market you are researching so local results rank first.

## Actor input object example

```json
{
  "search_queries": [
    "mark ruffalo",
    "best coffee grinders"
  ],
  "max_results_per_query": 100,
  "region": "us-en"
}
```

# Actor output Schema

## `dataset` (type: `string`):

One row per web result, with its query, position, title, URL, domain, and snippet. Export as JSON, CSV, Excel, or XML.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "search_queries": [
        "mark ruffalo"
    ],
    "max_results_per_query": 100,
    "region": "us-en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("harpoon/duckduckgo-search-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "search_queries": ["mark ruffalo"],
    "max_results_per_query": 100,
    "region": "us-en",
}

# Run the Actor and wait for it to finish
run = client.actor("harpoon/duckduckgo-search-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "search_queries": [
    "mark ruffalo"
  ],
  "max_results_per_query": 100,
  "region": "us-en"
}' |
apify call harpoon/duckduckgo-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,harpoon/duckduckgo-search-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eS5ldBQaJcSwfxOpG/builds/HLAq3inwQSL2Rjv5s/openapi.json
