v1

latestOpenAPI 3.1.02026-07-24490622.0 KB
SEO Research API

Get Organic Outranking Keywords

Compare two domains' organic rankings in one call. Returns keywords where one domain outranks the other or has just overtaken it, with both sites' ranks, changes, clicks, and URLs. The comparison domain's metrics appear in the your* fields. Choose the mode with keywordSearchType.

get/v2/seo/getOrganicOutrankingKeywords

Query parameters

querystring required
Example:competitor.com

Primary domain to analyze. This domain's ranking data appears in the main response fields (rank, rankChange, seoClicks, etc.). Accepts full domains (example.com), complete URLs, subdomains, or specific paths.

searchType'TheyOutrankYou' | 'TheyJustSurpassedYou' required
Example:TheyOutrankYou

Required. Chooses the ranking scenario for the query/compareDomain pair and governs how results are interpreted. TheyOutrankYou: keywords where query ranks above compareDomain. TheyJustSurpassedYou: recent crossovers where query moved ahead.

compareDomainstring required
Example:yourdomain.com

Domain to compare against. This domain's ranking data appears in the 'your' response fields (yourRank, yourRankChange, yourUrl). The endpoint shows where the query domain currently outranks this comparison domain.

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 query domain'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 query domain's rank position is ≥ this value (1 = best/top organic result).

rank.maxnumber float
Example:10

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

rankChange.minnumber float
Example:5

Filter to keywords where the query domain 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 query domain's 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 query domain are ≥ this value.

seoClicks.maxnumber float
Example:1000

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

seoClicksChange.minnumber float
Example:10

Filter to keywords where the query domain's 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 query domain's 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 6 months is ≥ this value.

paidCompetitors.maxnumber float
Example:50

Filter to keywords where the number of distinct advertisers observed over the last 6 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 6 months is ≥ this value.

adCount.maxnumber float
Example:25

Filter to keywords where the number of distinct advertisers observed over the last 6 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

OK

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
}