SFOLN

Catalogue / SEO & search

Keyword Suggestions & Research Tool

sfoln/keyword-suggestions · SEO tools, Lead generation, Developer tools On request

Turn a seed keyword into hundreds of long-tail keyword ideas that contain it, each with Google search volume, CPC, competition, keyword difficulty, search intent and 12-month trend. $0.045 per seed ($45 per 1,000) + $0.70 per 1,000 suggestions.

About

What it does

Keyword Suggestions & Research Tool turns a seed keyword into hundreds of long-tail keyword ideas that contain it, each with Google search volume, CPC, paid competition, keyword difficulty, search intent and a 12-month trend (DataForSEO Labs data). Ideal for content planning, SEO briefs, PPC research and AI agents building topic clusters. Suggestions come in the order DataForSEO returns them, and you pay $0.045 per seed plus $0.70 per 1,000 suggestions you actually receive.

Price

Price per delivered record

EventPricePer 1,000Charged for
Seed keyword query
keyword-suggestion-query
$0.045$45 / 1,000Charged once per seed keyword the upstream processed (covers the per-request fee).
Keyword suggestion
keyword-suggestion
$0.0007$0.70 / 1,000Charged once per keyword suggestion record delivered.

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-suggestions/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"seedKeywords":["coffee grinder"],"limitPerSeed":10}'
mcp.json · hosted Apify MCP server
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/keyword-suggestions"
    }
  }
}
asynchronous run · for large batches
POST https://api.apify.com/v2/actors/sfoln~keyword-suggestions/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: Give me 50 long-tail keyword ideas for "coffee grinder" in the US with search volume, keyword difficulty and intent, sorted by volume.

Input

Input fields

Enter one or more seed keywords. Each seed returns up to `limitPerSeed` keyword ideas that contain the seed, in the order DataForSEO returns them.

FieldTypeDefaultMeaning
seedKeywords *arrayrequiredSeed keywords
Seed keywords, one per line. Every suggestion contains the seed phrase (e.g. "coffee grinder" → "best burr coffee grinder"). Accounts on the Apify free plan can process up to 5 seed keywords per run.
limitPerSeedinteger100Suggestions per seed
Maximum suggestions returned per seed, in the order DataForSEO returns them. Each suggestion is billed as keyword-suggestion. Range 1–1000.
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.
includeSeedKeywordbooleanfalseInclude the seed keyword itself
Also return a record with the seed keyword's own metrics (billed as one extra keyword-suggestion).
maxSeedsinteger100Max seeds
Safety cap on how many seed keywords are processed in this run. Range 1–1000.
concurrencyinteger3Concurrency
How many seeds are processed in parallel. Range 1–10.
includeRawbooleanfalseInclude raw upstream response
Attach the unmodified DataForSEO item to each suggestion record.
Example input
{
  "seedKeywords": [
    "coffee grinder"
  ],
  "limitPerSeed": 10
}

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
suggestion = one keyword idea; seed = summary of one seed keyword. e.g. "suggestion"
seedstringSeed
Seed keyword the suggestion was generated from. e.g. "coffee grinder"
keywordstring | nullKeyword
Suggested keyword. e.g. "best burr coffee grinder"
isSeedKeywordbooleanIs seed
True for the seed keyword's own record (includeSeedKeyword).
searchVolumeinteger | nullSearch volume
Average monthly Google searches. e.g. 2900
cpcnumber | nullCPC (USD)
Average cost per click in USD. e.g. 1.12
competitionnumber | nullCompetition
Paid competition 0–1. e.g. 1
competitionLevelstring | nullCompetition level
LOW | MEDIUM | HIGH. e.g. "HIGH"
keywordDifficultyinteger | nullKeyword difficulty
Organic ranking difficulty 0–100. e.g. 42
searchIntentstring | nullSearch intent
Main intent: informational | navigational | commercial | transactional. e.g. "commercial"
secondaryIntentsarraySecondary intents
Other detected intents.
lowTopOfPageBidnumber | nullLow top-of-page bid
USD.
highTopOfPageBidnumber | nullHigh top-of-page bid
USD.
trendMonthlyPctnumber | nullTrend (month)
Search volume change vs previous month, %.
trendQuarterlyPctnumber | nullTrend (quarter)
Change vs previous quarter, %.
trendYearlyPctnumber | nullTrend (year)
Change vs previous year, %.
monthlySearchesarrayMonthly searches
[{year, month, searchVolume}], last 12 months.
wordsCountinteger | nullWords
Number of words in the keyword.
dataUpdatedAtstring | nullData updated
When DataForSEO last refreshed the keyword metrics.
locationCodeinteger | nullLocation code
DataForSEO location code.
languageCodestring | nullLanguage
Language code.
limitRequestedintegerLimit requested
limitPerSeed as requested (seed records only).
limitUsedintegerLimit used
Suggestions requested upstream after the free-plan cap and budget sizing (seed records only).
suggestionsReturnedintegerSuggestions returned
Suggestion records delivered for this seed, excluding the seed-metrics record (seed records only).
suggestionsChargedintegerSuggestions charged
keyword-suggestion events charged for this seed, including the seed-metrics record (seed records only).
totalAvailableinteger | nullTotal available
Total suggestions DataForSEO has for the seed (seed records only).
queryChargedbooleanSeed fee charged
Whether keyword-suggestion-query was charged (seed records only).
inputstring | objectInput
Seed keyword.
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-suggestion (suggestion records; seed records are never charged themselves, see queryCharged).
warningsarrayWarnings
Non-fatal notes (limit reduced, free-plan cap, budget reached...).
sourcestringSource
Upstream data source.
fetchedAtstringFetched at
ISO timestamp.
Example record
{
  "recordType": "suggestion",
  "seed": "coffee grinder",
  "keyword": "best burr coffee grinder",
  "isSeedKeyword": false,
  "searchVolume": 2900,
  "cpc": 1.12,
  "competition": 0.98,
  "competitionLevel": "HIGH",
  "keywordDifficulty": 42,
  "searchIntent": "commercial",
  "secondaryIntents": [
    "transactional"
  ],
  "lowTopOfPageBid": 0.5,
  "highTopOfPageBid": 1.9,
  "trendMonthlyPct": 0,
  "trendQuarterlyPct": 22,
  "trendYearlyPct": -18,
  "monthlySearches": [
    {
      "year": 2026,
      "month": 9,
      "searchVolume": 2900
    }
  ],
  "wordsCount": 4,
  "dataUpdatedAt": "2026-10-01 10:00:00 +00:00",
  "locationCode": 2840,
  "languageCode": "en",
  "input": "coffee grinder",
  "status": "ok",
  "charged": true,
  "chargedEvent": "keyword-suggestion",
  "source": "dataforseo",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}

Machine-readable

This page for agents