Ahrefs Keyword Difficulty Checker — KD Score & SERP avatar

Ahrefs Keyword Difficulty Checker — KD Score & SERP

Pricing

from $26.19 / 1,000 keyword difficulty results

Go to Apify Store
Ahrefs Keyword Difficulty Checker — KD Score & SERP

Ahrefs Keyword Difficulty Checker — KD Score & SERP

Get Ahrefs Keyword Difficulty (KD 0-100) for any keyword in bulk, plus the backlinks-to-rank shortage and the full top-SERP overview (each result with Domain Rating, URL Rating, traffic & keywords). No Ahrefs login, no API key. Pay per keyword.

Pricing

from $26.19 / 1,000 keyword difficulty results

Rating

0.0

(0)

Developer

Vitalii Bondarev

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

38

Total users

9

Monthly active users

3 days ago

Last modified

Share

Get Ahrefs Keyword Difficulty (KD) scores in bulk — with the full top-10 SERP breakdown included. This ahrefs keyword difficulty scraper returns KD 0–100, the referring-domain gap you need to crack the top 10, and a rich serp_overview for every ranking page — no Ahrefs account, no API key, pay only per result.

Features

  • Bulk KD lookup — pass a list of up to 5,000 keywords, get one clean record per keyword
  • Country-specific data — set any two-letter country code (us, gb, de, fr, …)
  • Full SERP breakdown — not just the score: each of the top-10 ranking pages comes back with DR, UR, traffic, keyword count, top keyword, and top keyword volume
  • Backlinks-to-rank gap — the backlinks_to_rank field tells you exactly how many referring domains a new page is short of to reach the top 10
  • Zero buyer key required — the actor uses a real stealth browser that navigates the Ahrefs free-KD page; the page handles its own challenge and fires the data call itself; we intercept the response
  • Failed lookups visible but never billed — if a keyword returns no data, it appears in your dataset with an error note so you have full visibility; you are not charged for it
  • Results streamed per row — each keyword is pushed the moment it is ready, so a timeout never discards completed work

What data you get

One dataset row per keyword:

FieldTypeDescription
keywordstringThe keyword as submitted
countrystringTwo-letter country code
keyword_difficultyinteger 0–100Ahrefs KD score
backlinks_to_rankintegerReferring domains needed to reach top 10
last_updatestringWhen Ahrefs last refreshed this keyword's index
serp_countintegerNumber of results in serp_overview
checked_atISO datetimeWhen the run fetched this keyword
errorstring or nullSet if the lookup failed; null on success
serp_overviewarrayOne object per ranking page (see below)

serp_overview sub-fields (per ranking page):

Sub-fieldDescription
positionSERP rank (1–10)
titlePage title
urlFull URL
domain_ratingAhrefs DR of the root domain
url_ratingAhrefs UR of the specific page
trafficEstimated monthly organic traffic
keywordsTotal keywords the page ranks for
top_keywordThe keyword driving the most traffic to that page
top_volumeMonthly search volume of the top keyword

Example output records (verified cloud run):

{
"keyword": "seo tools",
"country": "us",
"keyword_difficulty": 82,
"backlinks_to_rank": 399,
"serp_count": 7,
"last_update": "2025-05",
"checked_at": "2026-06-21T10:00:00+00:00",
"error": null,
"serp_overview": [
{
"position": 1,
"title": "The Best SEO Tools of 2025",
"url": "https://example.com/seo-tools",
"domain_rating": 91,
"url_rating": 52,
"traffic": 48200,
"keywords": 3100,
"top_keyword": "seo tools",
"top_volume": 110000
}
]
}
{
"keyword": "keyword research",
"country": "us",
"keyword_difficulty": 91,
"backlinks_to_rank": 835,
"serp_count": 9,
"error": null
}

Input

{
"keywords": ["seo tools", "keyword research", "link building"],
"country": "us",
"maxItems": 0,
"proxyConfiguration": {
"useApifyProxy": true,
"apifyProxyGroups": ["RESIDENTIAL"]
}
}
ParameterRequiredDefaultDescription
keywordsYes—List of keywords to check. Also accepts a comma-separated string or [{"keyword": "..."}] objects
countryNo"us"Two-letter country code for the keyword index
maxItemsNo0 (no cap)Optional hard cap on how many keywords to process in one run
proxyConfigurationNoApify RESIDENTIALProxy settings. A residential exit is used by default; no external key needed

Pricing

This actor charges $0.027 per keyword that returns a KD score (charge event: kd-result).

  • A keyword that fails to return data (e.g. not in the Ahrefs index, or a transient access issue) appears in your dataset with an error note — it is never billed
  • That is roughly 10% under comparable keyword-difficulty checkers on the Apify Store
  • Browser compute runs on your Apify account — our cost-of-goods is $0, and that saving goes to you

FAQ

Do I need an Ahrefs subscription or API key? No. This actor uses the Ahrefs free keyword difficulty tool — the same page any visitor can open in a browser. The actor navigates that page in a resilient stealth browser; the page handles its own security challenge and fires the data request itself. No Ahrefs account, no paid API access, and no external key of any kind is required from you.

How many keywords can I run per batch, and how fast is it? The actor supports up to 5,000 keywords per run. Each keyword requires a full browser navigation to reliably reach the protected endpoint, which takes roughly 80–95 seconds. A 3,600-second run (the Apify default timeout) can therefore process around 35–40 keywords. For larger lists, split them across multiple runs, or increase the run timeout in the actor's run options. Completed rows are streamed to your dataset immediately, so you never lose work if a run ends early.

Is the serp_overview data included at no extra charge? Yes. The full serp_overview array — with DR, UR, traffic, keyword count, top keyword, and top volume for every ranking page — is included in every billed kd-result event. There is no separate charge for the SERP data.

How does this compare to other keyword difficulty checkers on the Store? Most alternatives return only the KD score, backlink count, and a timestamp. This actor adds the complete serp_overview array: nine fields per ranking page, letting you see not just how hard a keyword is to rank for, but exactly who you are competing against and how strong each competitor's page is. That extra data is useful for gap analysis, content briefs, and link-building targeting.

Use cases

SEO keyword research — score a seed list before committing resources. A KD of 82 with 399 required backlinks signals a different content investment than a KD of 35 with 40.

Content planning and editorial calendars — combine KD with the serp_overview traffic numbers to prioritize keywords where the top-10 pages earn significant traffic. If page-1 incumbents have low traffic despite ranking, rethink the opportunity.

Niche and site research — feed competitor keyword lists into the actor to understand which of their ranking terms are genuinely defensible vs. winnable. The per-page DR/UR breakdown shows whether the top results are entrenched authority sites or thin pages you can outrank.

Programmatic SEO audits — integrate the dataset output into your pipeline to score hundreds of target pages' primary keywords, flag high-KD outliers, and update difficulty scores on a regular cadence without manual Ahrefs dashboard work.

Link-building prioritization — backlinks_to_rank gives you a concrete referring-domain target. Filter your keyword list to those where the gap is reachable within your link-building budget and focus outreach there first.

Usage statistics

This Actor creates a small, content-free summary at the end of each run. It is used only to monitor reliability and improve this Actor. A copy is saved as USAGE_STATS in your own Apify key-value store, so you can see the exact record created for your run.

Set disableUsageStats to true in the input to opt out. Nothing is sent then; your USAGE_STATS record only says that statistics were disabled.

Only these fields are recorded:

  • schema version, Actor name and build number;
  • UTC start and finish hour (not a precise timestamp);
  • run duration, number of results and time to the first result, each as a coarse range;
  • whether the result was empty, the end status, and an error type from a fixed list;
  • memory setting and counts of charged events;
  • names of the input fields you set, never their values;
  • the selected option for input fields that offer a fixed list of choices (for example a sort order).

We do not collect input text, search terms, URLs, domains, usernames, email addresses, names, proxy credentials, tokens, scraped records, output items, raw error messages, stack traces, or hashes of any of those values. Records are kept for no longer than 13 months, used only as aggregated operational statistics, and never sold or shared.

Additional fields (Phase 2)

This Actor also records your Apify user ID, whether Apify marks the account as paying, the size range of list inputs, the selected country when the input offers a fixed list of countries, and one category from a fixed Actor taxonomy. We use these fields only for aggregate reliability, repeat-use and cross-Actor analysis; reports suppress any cell with fewer than five distinct users.

The same disableUsageStats: true input flag turns these fields off too. The user ID is removed after 13 months; we do not export, sell, share, or attempt to re-identify this data.

Run-outcome signals (v2)

To learn whether a run did what it was asked to do, the record also holds a few more coarse ranges and yes/no flags. None of them contains content:

  • the result limit you asked for (a range, when the input has one) and what share of it was delivered;
  • results delivered per input item you listed (a range);
  • output quality as ranges: how fully the result fields were filled, the share of rows that look like errors, the share of duplicate rows, and how many different fields appeared. These are counted in memory while results are saved; no result content is kept;
  • how the run was started (console, API, schedule, webhook, another Actor);
  • how it ended: stopped by you, timed out, reached the requested limit, stopped by the charge limit, and how many times the platform moved the run;
  • if this Actor reports it: how many items to process worked or failed (ranges) and one failure reason from a fixed list;
  • a short code made from the names of the input fields you set, never their values.

Repeat-run fingerprint (v2)

When your Apify user ID is recorded (see above), the record also holds an 8-character one-way code made from your input (proxy settings left out) and this Actor's name. It only lets us see that the same account ran the same input again soon after an unsatisfying run; we never see the input itself. It is stored only in the database, never published, and reports use it in aggregate with the same five-user minimum. It is the one exception to the statement above that no hashes are collected, and disableUsageStats: true turns it off.