# Cheapest DuckDuckGo SERP/Search | $0.25/1K Searches (`litescrape/duckduckgo-search`) Actor

Scrape DuckDuckGo Search for $0.25 per 1k requests. Get organic results with regional, Safe Search and date filters. Pay per search page, with run usage included.

- **URL**: https://apify.com/litescrape/duckduckgo-search.md
- **Developed by:** [Lite Scraper](https://apify.com/litescrape) (community)
- **Categories:** Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.25 / 1,000 successful api requests

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## Cheapest DuckDuckGo SERP/Search | $0.25/1K Searches

Scrape DuckDuckGo Search for $0.25 per 1k requests. Get organic results with regional, Safe Search and date filters. Pay per search page, with run usage included.

Web search with regional, safety, and date filters.

### Price

**$0.25 per 1,000 searches** ($0.00025 per successful API response). A search is one successful results page or source response. Each continuation page counts as another search; individual result rows cost no extra.

Each successful response saved to the run is one paid event, including valid empty responses. Multiple places, reviews, or products in one response do not create additional paid events.

Failed requests are unbilled. Retries and a resumed run do not charge the same request twice. There is no Actor startup fee or separate per-row fee; platform usage during the run is included. Standard Apify charges for post-run storage access may still apply. Payments are handled by Apify; no separate service key or proxy purchase is required.

Free-plan users receive up to 25 successful requests per Apify user per UTC day across this catalog, subject to the service trial allowance. Paid runs respect the input request limit and Apify spending limit.

### Quick start

Use a single input below, or supply `requests` as a list of parameter objects. Top-level API fields are shared defaults, and each batch object overrides them. Identifiers in examples demonstrate the format; use an identifier returned by the matching provider for production work.

```json
{
  "q": "coffee brewing methods",
  "kl": "us-en",
  "maxRequests": 10,
  "maxPagesPerInput": 1
}
```

### Input parameters

| Field | Type | Required | Meaning |
| --- | --- | --- | --- |
| `q` | string | Required per input | Search query. |
| `kl` | string | Optional / conditional | Native kl parameter. See the source-specific constraints; unsupported combinations return an unbilled validation error. |
| `df` | string | Optional / conditional | Date filter: d, w, m, y, or YYYY-MM-DD..YYYY-MM-DD. |
| `m` | integer | Optional / conditional | Results per response; cannot be combined with search\_assist. |
| `safe` | string | Optional / conditional | 1 strict, -1 moderate, -2 off. |
| `search_assist` | boolean | Optional / conditional | Search assistance; cannot be combined with m. |
| `start` | integer | Optional / conditional | Result offset. Prefer automatic pagination over calculating offsets. |
| `timeout` | number | Optional / conditional | Optional budget for the entire request in seconds, measured from gateway receipt until the response is ready to send. Includes admission, queueing and settlement. Must be greater than 0 and at most 90. On expiry, the call is not billed and returns 503 request\_deadline\_exceeded with retryable=true and a request ID. Omit to retain the standard server deadline. |

The source validates conditional parameter combinations. Validation errors do not trigger a paid request event. Provider availability determines which optional result groups appear.

### Batches, pagination, and limits

- `requests`: up to 1,000 input parameter objects in one run.
- `maxRequests`: total successful API requests, including pages; default 100. At that limit the event price is at most $0.025.
- `maxPagesPerInput`: default 1. Increase to follow native continuation links where this endpoint supplies them. No synthetic pagination is invented.
- `maxResults`: maximum dataset rows; default 1,000. Already in-flight requests can complete and be billed, with full JSON saved even if their rows exceed this cap.
- `maxConcurrency`: default 2, maximum 8. Service capacity and trial limits may reduce it.
- `includeArtifacts`: optionally retain available raw source artifacts in this run. Default false.

### Output

The default dataset contains source records with `requestId`, `inputIndex`, `page`, `group`, readable `title`, `url`, `rating`, and `text` fields when available, the complete record in `data`, and `responseUrl`. A successful response without a primary result group gets a response row.

Each `responseUrl` points to a stored response envelope; its `response.body` contains the complete API JSON, including optional modules and pagination. `SUMMARY` reports successful requests, failures, row count, and event charges. `ERRORS` records unsuccessful requests. If every request fails, the run fails with no request-event charges.

Follow-up API links, including pagination and related reviews or products, are Apify request objects: `{ "url": "https://api.apify.com/v2/actors/litescrape~<actor>/runs", "method": "POST", "input": { ... } }`. POST the supplied `input` as JSON to `url` using your own Apify authorization header. Each follow-up starts a new run limited to one successful request; use `maxPagesPerInput` for automatic pagination inside this run. Source website links are unchanged. `search_metadata.json_endpoint` links to the saved Apify response. Available artifact links point to files copied to Apify; unavailable artifact links are omitted.

JSON exports preserve nested fields. Select the flat overview fields for CSV. Artifact manifests use `artifacts-<requestId>` keys and link to copied source files when available. Private run data requires the appropriate Apify access.

### Price comparison

**Lowest price in this 2026-09-20 comparison for DuckDuckGo web pages averaging at least 10 usable organic results per billed request.**

**Illustrative workload:** 1,000 successful requests × 10 usable organic results per request = 10,000 organic results. Our total is **$0.25**, equivalent to **$0.025 per 1,000 organic results**.

These are calculated prices, not measured scraper runs or guaranteed page yields. Count unique usable source records actually delivered, including the cost of empty responses, continuation pages and lookups needed to obtain the fields you need. An array of request objects does not turn multiple API calls into one billed request.

| Actor | Lowest applicable tier | Published-charge subtotal for this workload | Effective price / 1,000 output units |
| --- | --- | ---: | ---: |
| **Litescrape** | Same request rate on every plan | **$0.25** | **$0.025** |
| [fetch\_cat/duckduckgo-search-results-scraper](https://apify.com/fetch_cat/duckduckgo-search-results-scraper) ([active prices](https://api.apify.com/v2/acts/fetch_cat~duckduckgo-search-results-scraper)) | DIAMOND | $0.26726 | $0.026726 |
| [arman-bd/duckduckgo-search-scraper](https://apify.com/arman-bd/duckduckgo-search-scraper) ([active prices](https://api.apify.com/v2/acts/arman-bd~duckduckgo-search-scraper)) | DIAMOND | $0.90005 | $0.090005 |

Each competitor gets its lowest published tier, including enterprise tiers, without adding a plan subscription cost. Required compared events use the same tier; known startup charges assume one run and the minimum one billed GB. Unquantified compute/proxy charges, optional enrichment and any omitted additional fees can only increase the displayed competitor subtotal. Output completeness and reliability were not benchmarked.

- The lowest competing discounted row fee is $0.026226/1K rows; ours is $0.025/1K at 10 rows/request. Image results are a different event and are not counted as organic web results.

Cheapest means the lowest calculated price for the stated workload among the named paid Apify Actors in this dated audit. It is not a claim about every Actor, every plan, every workload, or equal output quality. Free/platform-only Actors, monthly rentals and bring-your-own-paid-key wrappers do not establish a comparable fixed total from their Actor fee alone. They may cost less on particular workloads.

The comparison uses the linked active pricing snapshots and public documentation checked on the audit date. Recheck live pricing before relying on a competitor comparison. No provider affiliation or equal-quality claim is implied.

### Support

Use this Actor's Issues tab on Apify and include the run ID plus a description of the unexpected result. Do not post credentials.

This is an independent tool from Litescrape. Provider names identify the source; they do not imply affiliation or endorsement.

# Actor input Schema

## `q` (type: `string`):

Search query.

## `kl` (type: `string`):

Native kl parameter. See the source-specific constraints; unsupported combinations return an unbilled validation error.

## `df` (type: `string`):

Date filter: d, w, m, y, or YYYY-MM-DD..YYYY-MM-DD.

## `m` (type: `integer`):

Results per response; cannot be combined with search\_assist.

## `safe` (type: `string`):

1 strict, -1 moderate, -2 off.

## `search_assist` (type: `boolean`):

Search assistance; cannot be combined with m.

## `start` (type: `integer`):

Result offset. Prefer automatic pagination over calculating offsets.

## `timeout` (type: `number`):

Optional budget for the entire request in seconds, measured from gateway receipt until the response is ready to send. Includes admission, queueing and settlement. Must be greater than 0 and at most 90. On expiry, the call is not billed and returns 503 request\_deadline\_exceeded with retryable=true and a request ID. Omit to retain the standard server deadline.

## `requests` (type: `array`):

Optional list of parameter objects. Top-level API fields are shared defaults; each object overrides them. Maximum 1,000 inputs.

## `maxRequests` (type: `integer`):

Run-wide cap on successful API requests, including continuation pages. 1,000 requests cost $0.25.

## `maxResults` (type: `integer`):

Cap exported rows. An in-flight response can still be saved and billed in full. Complete JSON responses remain in storage.

## `maxPagesPerInput` (type: `integer`):

1 returns the first page only. Additional pages follow source continuation links when available; every successful page is a paid request.

## `maxConcurrency` (type: `integer`):

Upper concurrency bound. The service may apply a lower limit for capacity or trial quotas.

## `includeArtifacts` (type: `boolean`):

Copy available raw source artifacts to this run. Availability varies by endpoint; unavailable artifacts do not invalidate a saved JSON response.

## Actor input object example

```json
{
  "q": "coffee brewing methods",
  "kl": "us-en",
  "maxRequests": 100,
  "maxResults": 1000,
  "maxPagesPerInput": 1,
  "maxConcurrency": 2,
  "includeArtifacts": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

## `errors` (type: `string`):

No description

# 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 = {
    "q": "coffee brewing methods",
    "kl": "us-en"
};

// Run the Actor and wait for it to finish
const run = await client.actor("litescrape/duckduckgo-search").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 = {
    "q": "coffee brewing methods",
    "kl": "us-en",
}

# Run the Actor and wait for it to finish
run = client.actor("litescrape/duckduckgo-search").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 '{
  "q": "coffee brewing methods",
  "kl": "us-en"
}' |
apify call litescrape/duckduckgo-search --silent --output-dataset

```

## MCP server setup

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

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/pxxVTzagMNUyX4ctl/builds/ThZ3yCzBRfPdNacj0/openapi.json
