DuckDuckGo SERP API — Web Search Results as JSON
Documentation menu
FetchLayer FetchLayer API

Search DuckDuckGo web results

Ranked organic web results for a query: each result’s position, title, URL, the URL as printed under the title, domain, snippet and the date DuckDuckGo shows beside it. Ads shown with the results come back separately in ads and never take a position, so positions count organic results only; a URL DuckDuckGo repeats on a later page is counted once, so positions have no gaps and no duplicates. When DuckDuckGo shows a summary box above the results it comes back as zeroClick. limit defaults to 10, the first page, and goes up to 200; DuckDuckGo lists at most about 190–200 organic results for any query and then stops, at which point endOfResults is true. Continue a search with nextCursor, sent with the same query, region, safeSearch and timeRange — a cursor sent with different filters is a 400. Results reflect a US searcher (us-en) unless you set region, and rankings differ between regions. A query that matches nothing is a 200 with an empty results list, not an error. Set includeSitelinks to also get the links shown under first-page results. DuckDuckGo publishes no total-result count. Billing: each result page read counts as one request (pagesScraped) — 10 results on the first page and up to 15 on each after; a short first page may mean one more page is read to reach limit, and a sitelinks read adds one. To find where one site ranks, use rank-check instead: it costs one request at any depth.

POST /search Web search
https://api.fetchlayer.dev/duckduckgo/search
OpenAPI JSON

Headers

Authorization string required

Bearer token — your FetchLayer API key.

Parameters

query string required

The search query, as you would type it (1–500 characters).

region string optional

Region code: us-en, uk-en, de-de, fr-fr, es-es, it-it, jp-jp, in-en, au-en, ca-en, br-pt and 52 more (64 codes, DuckDuckGo’s own list), or wt-wt for no region. Results and rankings differ by region. (default: us-en)

safeSearch string optional

DuckDuckGo’s own filter level: strict, moderate or off. DuckDuckGo still returns a site for a query that names it outright. (default: moderate)

timeRange string optional

any, day, week, month or year: only results published within it. (default: any)

limit number optional

Organic results to return (1–200), or -1 for the maximum. (default: 10)

pages number optional

Most result pages to read in this request (1–20), or -1. Defaults to as many as limit needs. Each page read counts as one request.

cursor string optional

A previous response’s nextCursor. Send it with the same query, region, safeSearch and timeRange.

includeSitelinks boolean optional

Also return the links DuckDuckGo shows under first-page results (sitelinks). Reading them adds one page to pagesScraped, only when they were actually read; when they can’t be, a note says so and nothing extra is billed. (default: false)

format string optional

json or markdown. (default: json)

timeoutMs number optional

Time limit for each page read, in milliseconds (1000–120000).

Response Fields

search

Search DuckDuckGo web results

resultType string

search, rank-check, instant-answer, suggestions, news, videos or images.

requestedUrl string

The DuckDuckGo page this result corresponds to.

notes string[]

Caveats about this particular result — a list that may be incomplete, a depth DuckDuckGo could not reach, a later page that could not be read. Empty when there are none. Read it on every call.

transport string

The source this data came from. Always "duckduckgo".

scrapedAt string

ISO 8601 timestamp of when the data was collected.

query string

The query that was run.

region string

The region the results are for.

safeSearch string

The safe search level applied.

timeRange string

The time range applied.

results object[]

Organic results, in ranked order.

results[].position number

1-based position among organic results, counted across pages. Ads never take a position.

results[].page number

The result page it appeared on.

results[].title string

The result title.

results[].url string

The destination URL.

results[].displayedUrl string

The URL as printed under the title, or null.

results[].domain string

Hostname of url.

results[].snippet string

The text under the result, or null.

results[].date string

The date DuckDuckGo shows beside the result, as given (e.g. 2026-08-03T00:00:00), or null. No time zone is stated, so none is added.

results[].sitelinks object[] | null

With includeSitelinks, the links shown under a first-page result, each with title, url and snippet; null where there are none or includeSitelinks is off.

resultCount number

Results in this response. DuckDuckGo publishes no total-result count anywhere; page with nextCursor until endOfResults.

ads object[]

Ads shown with the results, never ranked: page, title, url (the advertiser’s landing page, when stated), domain, displayedUrl, snippet.

zeroClick object

The summary box above the results — heading, abstract, url, source (e.g. "Wikipedia"), imageUrl — or null.

endOfResults boolean

DuckDuckGo has no further results for this query.

pagesScraped number

Result pages read. Each counts as one request against your plan. When the first page comes back short, one more may be read to reach limit, and a sitelinks read adds one.

pagesRequested number

The most pages this request would have read. Compare with pagesScraped.

nextCursor string

Pass back as cursor, with the same query and filters, to continue. null at the end.

hasNextPage boolean

Whether there is more to fetch.

Request

curl -X POST "https://api.fetchlayer.dev/duckduckgo/search" \
  -H "Authorization: Bearer ss-your-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"open source crm","limit":10}'

Response

{
  "resultType": "search",
  "requestedUrl": "https://duckduckgo.com/?q=open+source+crm&kl=us-en&kp=-1",
  "scrapedAt": "2026-09-15T19:47:52.280Z",
  "transport": "duckduckgo",
  "notes": [],
  "query": "open source crm",
  "region": "us-en",
  "safeSearch": "moderate",
  "timeRange": "any",
  "results": [
    {
      "position": 1,
      "page": 1,
      "title": "Best Open Source CRM Software for 2026: Top 8 Picks Reviewed",
      "url": "https://crm.org/crmland/open-source-crm",
      "displayedUrl": "crm.org/crmland/open-source-crm",
      "domain": "crm.org",
      "snippet": "Open source CRMs give you full control over your data, workflows, and hosting. We reviewed 8 top tools for flexibility, control, and cost-saving features—perfect for teams that like to self-host. Read more!",
      "date": "2026-01-19T00:00:00"
    },
    {
      "position": 2,
      "page": 1,
      "title": "9 Best Open Source CRMs Of 2026 - Forbes Advisor",
      "url": "https://www.forbes.com/advisor/business/software/best-open-source-crm/",
      "displayedUrl": "www.forbes.com/advisor/business/software/best-open-source-crm/",
      "domain": "www.forbes.com",
      "snippet": "In this roundup, you’ll learn about the best open source CRM software options. We’ll discuss features, costs and what to look for when choosing CRM software.",
      "date": "2026-02-09T00:00:00"
    },
    {
      "position": 3,
      "page": 1,
      "title": "10 Best Open Source CRM Software Reviewed In 2026",
      "url": "https://croclub.com/tools/best-open-source-crm-software/",
      "displayedUrl": "croclub.com/tools/best-open-source-crm-software/",
      "domain": "croclub.com",
      "snippet": "Discover the best open source CRM software for your team. Compare features, pros & cons, prices, and more in my complete guide.",
      "date": "2026-08-03T00:00:00"
    }
  ],
  "resultCount": 10,
  "ads": [
    {
      "page": 1,
      "title": "Top 10 CRM Tools - Free List of the Top Products",
      "url": "https://www.capterra.com/sem-compare-b/customer-relationship-management-software/",
      "domain": "capterra.com",
      "displayedUrl": "capterra.com",
      "snippet": "No Matter Your Mission, Get The Right CRM Tools To Accomplish It. Easily Find The CRM Tools You’re Looking For w/ Our Comparison Grid."
    }
  ],
  "zeroClick": null,
  "endOfResults": false,
  "pagesScraped": 1,
  "pagesRequested": 1,
  "nextCursor": "eyJ2IjoxLCJmIjoiNlJjMDVmZjVvZ1BNIiwiZm9ybSI6…",
  "hasNextPage": true
}