DEV Community

Cover image for DuckDuckGo MCP: Add Private Web Search to Claude and Track SERP Rankings in 2026
Truffle Pig Data
Truffle Pig Data

Posted on

DuckDuckGo MCP: Add Private Web Search to Claude and Track SERP Rankings in 2026

DuckDuckGo has a property no other major engine offers: its results aren't personalized. Same query, same region, same SERP for everyone, which makes it the cleanest baseline I know for rank measurement, and a natural web-search tool for AI agents that shouldn't inherit anyone's filter bubble. The DuckDuckGo Scraper on Apify turns those SERPs into structured JSON: organic listings with positions, ads, knowledge graph, news, images, videos, and related searches, one dataset item per page.

Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.

Does DuckDuckGo have an API?

Partially, and the partial bit misleads people. DuckDuckGo's public endpoints serve instant-answer material: topic summaries and disambiguation, not the ranked organic results. There's no official SERP API, no key that returns "position 4 for this keyword in de-de." For rank tracking, competitive monitoring, or agent grounding, the results page itself is the product, so you need a scraper that reads it and hands back structure. That's this Actor's whole job.

What the DuckDuckGo scraper returns

The DuckDuckGo Scraper returns each results page as one JSON item containing every SERP block: organic listings with ranking positions, plus ads, knowledge graph, news, inline media, and related searches.

Field Example Notes
Position 3 Rank within the organic listings
Title The Siliconimist Podcast Result headline
URL https://siliconimist.com/ Target link for domain matching
Description A podcast about the chip industry... SERP snippet
Displayed host siliconimist.com With favicon reference
Publication date 2026-06-30 When DuckDuckGo shows one

Sitelinks and rich-snippet content ride along on organic entries, news items carry sources and timestamps, and the knowledge panel arrives as its own block when the query triggers one.

Who this is for

SEO folks who want rank data without personalization noise. Comms and research teams doing news monitoring on brand or topic terms. And agent builders who want a private-flavored web search tool their LLM can call, which is where the MCP angle below comes in.

The manual way, and where it breaks

DuckDuckGo looks scraper-friendly until you try to keep a scraper alive. The HTML endpoint returns a stripped page that omits most SERP blocks, the full page renders through JavaScript, and sustained request patterns hit rate limiting like anywhere else. Regional results need the right localization pair, date filtering hides behind terse URL parameters, and the markup drifts. I wrote the quick-and-dirty version years ago for a side project; it lasted three weeks, which is about average for quick-and-dirty SERP parsers.

The faster way: run the DuckDuckGo Scraper

Apify Console

  1. Open the DuckDuckGo Scraper and click Try for free.
  2. Enter a query, pick a localization like us-en, and set max_pages.
  3. Run it and export the results as JSON or CSV.

REST

curl -X POST "https://api.apify.com/v2/acts/johnvc~DuckDuckGo-Scraper-for-serp-rankings/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "query": "best mechanical keyboard", "localization": "us-en", "max_pages": 2 }'
Enter fullscreen mode Exit fullscreen mode

Run endpoints and dataset retrieval are covered in the Apify API docs.

Check rankings in Python

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("johnvc/DuckDuckGo-Scraper-for-serp-rankings").call(
    run_input={
        "query": "pfas free cookware",
        "localization": "us-en",
        "max_pages": 2,
    }
)

for page in client.dataset(run["defaultDatasetId"]).iterate_items():
    for result in page.get("organic_results", []):
        print(result.get("position"), result.get("title"), result.get("url"))
Enter fullscreen mode Exit fullscreen mode

Match url against your domain and you've got an unpersonalized rank check you can trust between runs.

Find where your domain ranks

The task Check your domain rankings on DuckDuckGo is that Python loop productized: keyword in, position out, no code required.

Track niche visibility, podcast edition

Check your podcast search rankings on DuckDuckGo applies the same run to a discovery problem most podcasters never measure: whether your show surfaces when someone searches its topic.

Monitor the news blocks

Monitor DuckDuckGo news for a topic leans on the date_filter input (d for the past day, w for the week, or a custom range) to pull fresh coverage with sources and timestamps, which is news monitoring with a one-line config.

Straight to CSV

Scrape DuckDuckGo search results to CSV is the export-and-open-in-Excel path for anyone allergic to JSON.

DuckDuckGo MCP: private web search for Claude

This is the setup that gets the most questions. Registered through Apify's MCP server, the Actor becomes a web-search tool that Claude, Claude Code, and Cursor can call, grounding answers in live, unpersonalized SERPs. The task Add DuckDuckGo web search to Claude via MCP walks through the configuration, and you can read more about Claude at claude.ai.

FAQ about the DuckDuckGo scraper

Is there a free DuckDuckGo API, or do I need a scraper?

The free public endpoints cover instant answers, not ranked results. For positions, ads, news blocks, and the knowledge panel you need a scraper; this one bills per page rather than per month.

What does the DuckDuckGo scraper cost to run?

Roughly a cent per results page, plus a fraction-of-a-cent setup fee per run. The default max_pages of 2 keeps a keyword check around two cents, and free Apify credit covers early runs entirely.

How do I turn this scraper into a DuckDuckGo MCP tool?

Connect Apify's MCP server to your client, enable the Actor, and it appears as a callable search tool in Claude, Claude Code, or Cursor. The MCP task linked above documents the exact config block.

Can I schedule the scraper for daily rank and news monitoring?

Yes. Save each keyword as a task, attach an Apify schedule, and you accumulate dated SERP snapshots you can diff for position moves or fresh coverage. Start from the DuckDuckGo Scraper.

Is a DuckDuckGo scraper representative of my Google rankings?

No, and that's not the goal. DuckDuckGo runs its own result mix, and its market share is a fraction of Google's. What it offers is consistency: no personalization means clean baselines, and for privacy-minded audiences it's the SERP that actually matters.

More from Truffle Pig Data

I've covered this Actor from other angles: DuckDuckGo Search API for AI Agents on Medium, the LinkedIn version, and the Peerlist walkthrough on checking your site's rankings. For other engines with the same JSON treatment, there's the Yandex Search API, the Baidu Search Scraper, and the Naver Search API.

Wrapping up

Unpersonalized SERPs are underrated infrastructure: stable enough to measure, private enough to hand to an agent. Run the DuckDuckGo Scraper on one keyword and see where you actually stand.

Top comments (0)