v1

latestOpenAPI 3.1.02026-07-24490622.0 KB
SEO Research API

Get Lost Ranks Keywords

Returns keywords where a domain's organic search ranking positions declined compared to the previous month. This endpoint identifies ranking losses that remain within the top 100 results to reveal content that needs SEO attention.

Visualize this API live on SpyFu

get/v2/seo/getLostRanksKeywords

Query parameters

querystring required
Example:example.com/blog

Domain, URL, subdomain, or path to analyze. Accepts full domains (example.com), complete URLs (https://example.com/blog), subdomains (blog.example.com), specific paths (example.com/products/), or individual pages.

compareDomainstring
Example:competitor.com

Domain to compare against when evaluating where it outranks you and where you outrank it.

includeTermsstring
Example:hosting,domain,website

Comma-separated list of terms that must be present in the keyword.

includeAnyTermboolean

Used with includeTerms. If true: match any term (OR). If false: require all terms (AND).

excludeTermsstring
Example:free,cheap,discount

Comma-separated list of terms to exclude from results (e.g., branded or irrelevant terms).

excludeHomepageKeywordsboolean

If true, exclude keywords where the domain/URL's homepage (root domain, e.g., example.com) ranks; if false, include all.

searchVolume.minnumber float
Example:1000

Filter to keywords where monthly search volume (Google) is ≥ this value.

searchVolume.maxnumber float
Example:50000

Filter to keywords where monthly search volume (Google) is ≤ this value.

keywordDifficulty.minnumber float
Example:30

Filter to keywords where the keyword difficulty score is ≥ this value (0-100; higher = harder to rank).

keywordDifficulty.maxnumber float
Example:70

Filter to keywords where the keyword difficulty score is ≤ this value (0-100; higher = harder to rank).

rank.minnumber float
Example:1

Filter to keywords where the domain/URL rank position is ≥ this value (1 = best/top organic result).

rank.maxnumber float
Example:10

Filter to keywords where the domain/URL rank position is ≤ this value (1 = best/top organic result).

rankChange.minnumber float
Example:5

Filter to keywords where the domain/URL improved by at least this many positions vs. the previous month (rank_change ≥ value). Positive values mean moved up; negative values mean moved down.

rankChange.maxnumber float
Example:20

Filter to keywords where the month-over-month rank change is at most this many positions (rank_change ≤ value). Positive values mean moved up; negative values mean moved down.

costPerClick.minnumber float
Example:1

Filter to keywords where the average cost per click (CPC) is ≥ this value.

costPerClick.maxnumber float
Example:10

Filter to keywords where the average cost per click (CPC) is ≤ this value.

costPerClickOption'Broad' | 'Exact' | 'Phrase'
Example:Broad

Match type for CPC filtering. Broad = includes variations/related terms; Exact = exact keyword only; Phrase = contains the keyword phrase in order (with additional words allowed).

seoClicks.minnumber float
Example:100

Filter to keywords where estimated monthly organic clicks (SEO clicks) to the domain/url are ≥ this value.

seoClicks.maxnumber float
Example:1000

Filter to keywords where estimated monthly organic clicks (SEO clicks) to the domain/url are ≤ this value.

seoClicksChange.minnumber float
Example:10

Filter to keywords where the month-over-month change in estimated organic clicks is ≥ this value. Positive values indicate click gains; negative values indicate click losses.

seoClicksChange.maxnumber float
Example:500

Filter to keywords where the month-over-month change in estimated organic clicks is ≤ this value. Positive values indicate click gains; negative values indicate click losses.

percentMobileSearches.minnumber float
Example:50

Filter to keywords where the mobile search share (%) is ≥ this value (range 0-100).

percentMobileSearches.maxnumber float
Example:80

Filter to keywords where the mobile search share (%) is ≤ this value (range 0-100).

percentDesktopSearches.minnumber float
Example:20

Filter to keywords where the desktop search share (%) is ≥ this value (range 0-100).

percentDesktopSearches.maxnumber float
Example:50

Filter to keywords where the desktop search share (%) is ≤ this value (range 0-100).

percentNotClicked.minnumber float
Example:10

Filter to keywords where the percentage of searches with no click is ≥ this value (range 0-100).

percentNotClicked.maxnumber float
Example:30

Filter to keywords where the percentage of searches with no click is ≤ this value (range 0-100).

percentPaidClicks.minnumber float
Example:20

Filter to keywords where the share of SERP clicks going to paid ads (%) is ≥ this value (range 0-100).

percentPaidClicks.maxnumber float
Example:60

Filter to keywords where the share of SERP clicks going to paid ads (%) is ≤ this value (range 0-100).

percentOrganicClicks.minnumber float
Example:40

Filter to keywords where the share of SERP clicks going to organic results (%) is ≥ this value (range 0-100).

percentOrganicClicks.maxnumber float
Example:80

Filter to keywords where the share of SERP clicks going to organic results (%) is ≤ this value (range 0-100).

monthlyCost.minnumber float
Example:100

Filter to keywords where the estimated monthly advertising cost is ≥ this value.

monthlyCost.maxnumber float
Example:5000

Filter to keywords where the estimated monthly advertising cost is ≤ this value.

monthlyCostOption'Broad' | 'Exact' | 'Phrase'
Example:Broad

Match type for monthly cost filtering. Broad = includes variations/related terms; Exact = exact keyword only; Phrase = contains the keyword phrase in order (with additional words allowed).

paidCompetitors.minnumber float
Example:5

Filter to keywords where the number of distinct advertisers observed over the last 14 months is ≥ this value.

paidCompetitors.maxnumber float
Example:50

Filter to keywords where the number of distinct advertisers observed over the last 14 months is ≤ this value.

rankingHomepages.minnumber float
Example:2

Filter to keywords where the number of homepage/root-domain URLs in the top 100 results is ≥ this value.

rankingHomepages.maxnumber float
Example:10

Filter to keywords where the number of homepage/root-domain URLs in the top 100 results is ≤ this value.

totalMonthlyClicks.minnumber float
Example:1000

Filter to keywords where total monthly SERP clicks (all domains) are ≥ this value. Independent of rank; includes both organic and paid clicks.

totalMonthlyClicks.maxnumber float
Example:10000

Filter to keywords where total monthly SERP clicks (all domains) are ≤ this value. Includes both organic and paid clicks.

adCount.minnumber float
Example:3

Filter to keywords where the number of distinct advertisers observed over the last 14 months is ≥ this value.

adCount.maxnumber float
Example:25

Filter to keywords where the number of distinct advertisers observed over the last 14 months is ≤ this value.

pageSizeinteger
Example:5

The maximum number of rows returned.

countryCode'AR' | 'AT' | 'AU' | 'BE' | 'BR' | 'CA' | 'CH' | 'DE' | 'DK' | 'ES' | 'FR' | 'IE' | 'IN' | 'IT' | 'JP' | 'MX' | 'NL' | 'NO' | 'NZ' | 'PL' | 'PT' | 'SE' | 'SG' | 'TR' | 'UA' | 'UK' | 'US' | 'ZA'
Example:US

Country market to search. Specifically, this maps to the Google domain version to query against (e.g., google.com for US, google.de for Germany, etc.). <a href='https://developer.spyfu.com/reference/adhistoryapi_getdomainadhistory_get#/'>All Countries</a>

sortBy'SearchVolume' | 'KeywordDifficulty' | 'Rank' | 'RankChange' | 'SeoClicks' | 'SeoClicksChange' | 'PercentMobileSearches' | 'PercentDesktopSearches' | 'PercentNotClicked' | 'PercentPaidClicks' | 'PercentOrganicClicks' | 'BroadCostPerClick' | 'ExactCostPerClick' | 'PhraseCostPerClick' | 'BroadMonthlyCost' | 'ExactMonthlyCost' | 'PhraseMonthlyCost' | 'TotalMonthlyClicks' | 'PaidCompetitors' | 'RankingHomepages'
Example:SearchVolume

Column to sort by.

sortOrder'Ascending' | 'Descending'
Example:Descending

Order to sort the results.

startingRowinteger
Example:1

Row number to start the results with.

adultFilterboolean
Example:true

Exclude adult keywords considered unsafe for work.

onlyAdultKeywordsboolean

Only include adult keywords considered unsafe for work.

exactMatchboolean

Indicates whether to apply exact match filtering for the query. This parameter will result in only exact matches, meaning protocols (http/https) and trailing slashes must be included. For example, a query of "https://example.com/blog" will not match

Response

Successfully retrieved keywords with declined organic rankings. Returns a paginated list of keywords showing ranking losses and search data.

resultCountinteger

Number of results returned

totalMatchingResultsinteger

Total number of organic keywords available that match the query criteria, including results not included in the current page.

Example response

{
  "resultCount": 100,
  "results": [
    {
      "keyword": "running shoes",
      "topRankedUrl": "https://example.com/best-running-shoes",
      "rank": 7,
      "rankChange": -3,
      "searchVolume": 700000,
      "keywordDifficulty": 69,
      "broadCostPerClick": 0.28,
      "phraseCostPerClick": 0.28,
      "exactCostPerClick": 0.28,
      "seoClicks": 3000,
      "seoClicksChange": -600,
      "totalMonthlyClicks": 647000,
      "percentMobileSearches": 0.4,
      "percentDesktopSearches": 0.6,
      "percentNotClicked": 0.075,
      "percentPaidClicks": 0.079,
      "percentOrganicClicks": 0.921,
      "broadMonthlyCost": 6043.5,
      "phraseMonthlyCost": 5695.5,
      "exactMonthlyCost": 5392.5,
      "rankingHomepages": 10,
      "yourRank": 5,
      "yourRankChange": -3,
      "yourUrl": "https://comparedomain.com/blog"
    }
  ],
  "totalMatchingResults": 75000
}