SFOLN

Catalogue / SEO & search

Keyword Difficulty Checker

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.

About

What it does

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

EventPricePer 1,000Charged for
Keyword batch
keyword-difficulty-batch
$0.045$45 / 1,000Charged once per upstream request (batch of up to 1,000 keywords) that was processed.
Keyword difficulty score
keyword-difficulty
$0.0006$0.60 / 1,000Charged 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

curl · synchronous run, rows in the response
curl -X POST "https://api.apify.com/v2/actors/sfoln~keyword-difficulty/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["coffee grinder","burr coffee grinder","best espresso machine"]}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/keyword-difficulty"
    }
  }
}
asynchronous run · for large batches
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.

FieldTypeDefaultMeaning
keywords *arrayrequiredKeywords
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.
locationstring"2840"Location
DataForSEO location code (2840 = United States, 2826 = United Kingdom, 2276 = Germany) or full location name (e.g. "United Kingdom").
languageCodestring"en"Language code
Language code, e.g. en, de, fr, es.
maxKeywordsinteger10000Max keywords
Safety cap on how many keywords are processed in this run. Range 1–100000.
concurrencyinteger3Concurrency
How many batches of 1,000 keywords are processed in parallel. Range 1–6.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified DataForSEO item to each result record.
Example input
{
  "keywords": [
    "coffee grinder",
    "burr coffee grinder",
    "best espresso machine"
  ]
}

Output

One record per input item

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.

FieldTypeMeaning
recordTypestringRecord type
keyword = one keyword score; batch = summary of one batch of up to 1,000 keywords. e.g. "keyword"
keywordstringKeyword
Keyword (lower-cased). e.g. "burr coffee grinder"
keywordDifficultyinteger | nullKeyword difficulty
Organic ranking difficulty 0–100 (logarithmic): how hard it is to reach the Google top 10. e.g. 38
locationCodeinteger | nullLocation code
DataForSEO location code. e.g. 2840
languageCodestring | nullLanguage
Language code. e.g. "en"
batchintegerBatch
Batch number (batch records only).
keywordsInBatchintegerKeywords in batch
Batch records only.
keywordsSentintegerKeywords sent
Keywords sent upstream (batch records only).
keywordsWithDifficultyintegerScored keywords
Keywords with a score, each charged keyword-difficulty (batch records only).
keywordsWithoutDataintegerKeywords without data
Batch records only.
keywordsSkippedInvalidintegerInvalid keywords
Keywords rejected as invalid and not sent (batch records only).
keywordsSkippedBudgetintegerKeywords over budget
Keywords not scored or not delivered because the maximum cost per run was reached (batch records only).
keywordsSkippedFreePlanintegerKeywords over the free-plan limit
Keywords beyond the free-plan limit of 20 per batch (batch records only).
queryChargedbooleanBatch fee charged
Whether keyword-difficulty-batch was charged for this batch (batch records only).
inputstring | object | nullInput
Keyword (keyword records) or {batch, keywords} (batch records).
statusstringStatus
ok | not_found | error | skipped_invalid | skipped_budget | skipped_free_plan e.g. "ok"
chargedbooleanCharged
Whether this record incurred a pay-per-event charge.
chargedEventstringCharged event
keyword-difficulty (keyword records).
warningsarrayWarnings
Non-fatal notes (limit reduced, budget reached...).
errorobjectError
{code, message, provider?} when status is not ok.
sourcestringSource
Upstream data source.
fetchedAtstringFetched at
ISO timestamp.
Example record
{
  "recordType": "keyword",
  "keyword": "burr coffee grinder",
  "keywordDifficulty": 38,
  "locationCode": 2840,
  "languageCode": "en",
  "input": "burr coffee grinder",
  "status": "ok",
  "charged": true,
  "chargedEvent": "keyword-difficulty",
  "source": "dataforseo",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents