sfoln/keyword-difficulty · SEO tools, Lead generation, Developer tools On request
Check Google keyword difficulty (0–100) in bulk for any country and language, up to 1,000 keywords per batch; only keywords that get a score are charged. $0.045 per batch ($45 per 1,000 batches) + $0.60 per 1,000 scored keywords.
Keyword Difficulty Checker gets the Google keyword difficulty (KD, 0–100) for thousands of keywords at once, for any country and language. Keyword difficulty estimates how hard it is to reach the Google top 10 for a keyword. It is a logarithmic score based on the backlink profiles of the pages that currently rank (DataForSEO Labs data). Use it to sort keyword lists by effort, plan content and spot easy wins, or let AI agents prioritise topics. Keywords are scored in batches of up to 1,000 per request, and you pay $0.045 per batch plus $0.60 per 1,000 keywords that actually get a score.
Price
Price per delivered record
Event
Price
Per 1,000
Charged for
Keyword batch keyword-difficulty-batch
$0.045
$45 / 1,000
Charged once per upstream request (batch of up to 1,000 keywords) that was processed.
Keyword difficulty score keyword-difficulty
$0.0006
$0.60 / 1,000
Charged once per keyword that received a difficulty score.
Apify free plan: up to 5 items per run. Paid plans have no per-run cap; set maxTotalChargeUsd to cap spend.
Run
Call it from code, an agent or the Console
This API is private on Apify for now. Email us and we will publish it for you, usually within two working days. The calls below work once it is public. contact@sfoln.com
POST https://api.apify.com/v2/actors/sfoln~keyword-difficulty/runs?maxTotalChargeUsd=1
GET https://api.apify.com/v2/actor-runs/{runId} # until status is SUCCEEDED
GET https://api.apify.com/v2/datasets/{defaultDatasetId}/items?format=json
Authenticate with an Apify API token. MCP clients can instead sign in with OAuth when prompted. Example prompt for an agent: Check the Google keyword difficulty in the US for "coffee grinder", "burr coffee grinder" and "best espresso machine" and tell me which is easiest to rank for.
Input
Input fields
Paste keywords; they are scored in batches of up to 1,000 per upstream request.
Field
Type
Default
Meaning
keywords *
array
required
Keywords Keywords to score, one per line (lower-cased and de-duplicated). Up to 1,000 keywords are sent per upstream request (one keyword-difficulty-batch fee per 1,000). Accounts on the Apify free plan can process up to 5 batches per run, with at most 20 keywords scored per batch.
location
string
"2840"
Location DataForSEO location code (2840 = United States, 2826 = United Kingdom, 2276 = Germany) or full location name (e.g. "United Kingdom").
languageCode
string
"en"
Language code Language code, e.g. en, de, fr, es.
maxKeywords
integer
10000
Max keywords Safety cap on how many keywords are processed in this run. Range 1–100000.
concurrency
integer
3
Concurrency How many batches of 1,000 keywords are processed in parallel. Range 1–6.
includeRaw
boolean
false
Include raw upstream response Attach the unmodified DataForSEO item to each result record.
Records land in the run's dataset; a synchronous call returns them directly. Each has a status (ok is charged; everything else is free) and a charged flag. The run's OUTPUT record totals items and charges.
Field
Type
Meaning
recordType
string
Record type keyword = one keyword score; batch = summary of one batch of up to 1,000 keywords. e.g. "keyword"
keyword
string
Keyword Keyword (lower-cased). e.g. "burr coffee grinder"
keywordDifficulty
integer | null
Keyword difficulty Organic ranking difficulty 0–100 (logarithmic): how hard it is to reach the Google top 10. e.g. 38
locationCode
integer | null
Location code DataForSEO location code. e.g. 2840
languageCode
string | null
Language Language code. e.g. "en"
batch
integer
Batch Batch number (batch records only).
keywordsInBatch
integer
Keywords in batch Batch records only.
keywordsSent
integer
Keywords sent Keywords sent upstream (batch records only).
keywordsWithDifficulty
integer
Scored keywords Keywords with a score, each charged keyword-difficulty (batch records only).
keywordsWithoutData
integer
Keywords without data Batch records only.
keywordsSkippedInvalid
integer
Invalid keywords Keywords rejected as invalid and not sent (batch records only).
keywordsSkippedBudget
integer
Keywords over budget Keywords not scored or not delivered because the maximum cost per run was reached (batch records only).
keywordsSkippedFreePlan
integer
Keywords over the free-plan limit Keywords beyond the free-plan limit of 20 per batch (batch records only).
queryCharged
boolean
Batch fee charged Whether keyword-difficulty-batch was charged for this batch (batch records only).
input
string | object | null
Input Keyword (keyword records) or {batch, keywords} (batch records).
status
string
Status ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
charged
boolean
Charged Whether this record incurred a pay-per-event charge.