# DuckDuckGo Rank Tracker (`aerodynamic_tripod/duckduckgo-rank-tracker`) Actor

Scrape clean DuckDuckGo organic search results, track your domain and competitors, monitor ranking changes over time, and export SEO-ready SERP data.

- **URL**: https://apify.com/aerodynamic\_tripod/duckduckgo-rank-tracker.md
- **Developed by:** [SearchShark Tools](https://apify.com/aerodynamic_tripod) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## 🦆 DuckDuckGo Rank Tracker

**DuckDuckGo Rank Tracker** lets you collect **clean organic DuckDuckGo search results** and monitor how your domains and competitors rank for important keywords over time.

Track SEO positions, compare competitors, preserve historical ranking data, and export structured SERP results without manually checking DuckDuckGo.

- 🎯 **Track your rankings:** monitor where your domains appear for every keyword
- 🥊 **Monitor competitors:** compare your positions against competing domains
- 📈 **Detect ranking movement:** identify `NEW`, `UP`, `DOWN`, `UNCHANGED`, `LOST`, and `NOT_FOUND` rankings
- 🔎 **Collect organic SERPs:** export ranked DuckDuckGo results with titles, URLs, snippets, and positions
- 🧹 **Get cleaner results:** exact normalized URL deduplication prevents duplicate URLs from receiving multiple ranks
- 🕒 **Preserve history:** keep ranking history across separate Actor runs
- ⚡ **Automate SEO monitoring:** combine the Actor with Apify Tasks, Schedules, API, webhooks, and integrations

***

### 📦 What data does DuckDuckGo Rank Tracker extract?

Each organic SERP result can contain:

| | |
| --- | --- |
| 🔍 **Search keyword** | 🏆 **Organic rank** |
| 📄 **Logical SERP page** | 🔢 **Position within page** |
| 📝 **Result title** | 🔗 **Result URL** |
| 🧹 **Normalized URL** | 💬 **Search snippet** |
| 🗂 **Record type** | 📊 **Rank-ready structured data** |

For tracked domains, the Actor also generates:

| | |
| --- | --- |
| 🌐 **Domain** | 🏷 **Domain role** |
| ✅ **Found / not found** | 🏆 **Current rank** |
| ⏮ **Previous rank** | 📈 **Rank change** |
| 🧭 **Movement status** | ⭐ **Best historical rank** |
| 📉 **Worst historical rank** | 🔢 **Checks count** |
| 📍 **All matched positions** | 🔗 **Matched URLs** |
| 🔎 **Actual checked result depth** | 🗃 **Tracking project history** |

> Rankings are based on the **actual unique organic results collected during that run**. The Actor does not invent missing positions or pretend the requested result limit was reached.

***

### 🚀 Features

DuckDuckGo Rank Tracker is designed for **SEO rank monitoring, competitor research, SERP collection, and scheduled search visibility tracking**.

- **Multiple keywords:** process many search queries in one Actor run
- **Target-domain tracking:** monitor your own websites
- **Competitor tracking:** compare competing domains against the same SERPs
- **Historical ranking memory:** compare current rankings with previous Actor runs
- **Ranking movement detection:** identify gains, losses, new rankings, unchanged rankings, and lost rankings
- **Exact URL deduplication:** the same normalized URL does not receive multiple final ranks
- **Subdomain matching:** optionally treat `blog.example.com` as belonging to `example.com`
- **Safe Search controls:** Strict, Moderate, or Off
- **Time-range filtering:** Any time, past day, week, month, or year
- **Configurable result depth**
- **Configurable logical page depth**
- **Clean title and snippet normalization**
- **Apify Dataset output**
- **Domain ranking summaries in Key-Value Store**
- **Persistent tracking history**
- **Tasks and Schedules compatible**
- **API-friendly structured output**
- **Fallback search retrieval for improved reliability**

***

## ⬇️ Input

You can configure DuckDuckGo Rank Tracker directly from the **Apify Console** or send input programmatically through the **Apify API**.

***

### 🔎 Search keywords

`queries`

Enter one or more DuckDuckGo search queries.

Example:

````text
best web scraping tools
SERP scraper API
SEO rank tracker
website scraping software

# Actor input Schema

## `queries` (type: `array`):

One or more DuckDuckGo search queries. Each keyword is processed independently.
## `targetDomains` (type: `array`):

Domains whose rankings you want to monitor, for example example.com.
## `competitorDomains` (type: `array`):

Competitor domains whose rankings you want to compare against your domains.
## `trackingProject` (type: `string`):

Optional project name used to keep historical rankings together, for example Miami Roofing.
## `enableTracking` (type: `boolean`):

Remember previous positions and calculate ranking gains, losses, new rankings, unchanged rankings, and lost rankings.
## `matchSubdomains` (type: `boolean`):

Treat subdomains such as blog.example.com as belonging to example.com.
## `safeSearch` (type: `string`):

Control DuckDuckGo explicit-content filtering.
## `timeRange` (type: `string`):

Optionally restrict results to recently published or updated pages.
## `maxResultsPerQuery` (type: `integer`):

Maximum number of unique organic results to return for each keyword. The page limit can reduce the actual number returned.
## `maxPagesPerQuery` (type: `integer`):

Maximum search depth for each keyword. Each logical result page contains up to 10 ranking positions.
## `proxyConfiguration` (type: `object`):

Optional Apify Proxy or custom proxy configuration for supported requests.

## Actor input object example

```json
{
  "queries": [
    "best web scraping tools"
  ],
  "targetDomains": [],
  "competitorDomains": [],
  "enableTracking": true,
  "matchSubdomains": true,
  "safeSearch": "moderate",
  "timeRange": "any",
  "maxResultsPerQuery": 50,
  "maxPagesPerQuery": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
````

# Actor output Schema

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

Organic DuckDuckGo search results with keyword, rank, logical page, title, URL, normalized URL, and snippet.

## `domainRanks` (type: `string`):

Current ranking summaries for tracked target and competitor domains, including ranking movement and historical statistics.

# 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 = {
    "queries": [
        "best web scraping tools"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("aerodynamic_tripod/duckduckgo-rank-tracker").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 = {
    "queries": ["best web scraping tools"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("aerodynamic_tripod/duckduckgo-rank-tracker").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 '{
  "queries": [
    "best web scraping tools"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call aerodynamic_tripod/duckduckgo-rank-tracker --silent --output-dataset

```

## MCP server setup

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

```

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/76kLrwndM5Vbcw7Eq/builds/teiKHhnwLIhUiTJnx/openapi.json
