openapi: 3.0.3 info: title: Account Account API Keyword Research API API version: v2 servers: - url: https://api.spyfu.com/apis/accounts_api security: - Basic_Authentication_Token: [] - Query_Parameter_Token: [] - HMAC_Authentication_Header: [] tags: - name: Keyword Research API paths: /v2/related/getKeywordExpansions: get: operationId: RelatedKeywordsV2Api_GetKeywordExpansions_GET summary: Get Keywords, All Sorts description: 'Performs 5 types of keyword research via keywordSearchType parameter: PhraseMatch (thematic similarities), Questions (interrogative queries), AlsoBuysAdsFor (co-targeted PPC terms), AlsoRanksFor (co-ranking SEO terms), Transactions (commercial intent). Set keywordSearchType to select method.' parameters: - name: query in: query description: The keyword to query for. required: true schema: type: string example: shoes example: shoes - name: keywordSearchType in: query description: 'Required. Selects keyword research method: PhraseMatch=thematically related, Questions=interrogative forms, AlsoBuysAdsFor=keywords co-targeted in ads, AlsoRanksFor=keywords co-ranking organically, Transactions=purchase-intent keywords. Each returns different keyword relationships.' required: true schema: type: string default: PhraseMatch enum: - AlsoBuysAdsFor - AlsoRanksFor - PhraseMatch - Questions - Transactions x-enum-descriptions: AlsoBuysAdsFor: Returns keywords that advertisers commonly target together with the query keyword in PPC campaigns. Analyzes co-targeting patterns in paid search advertising. AlsoRanksFor: Returns keywords that websites ranking for the query keyword also rank for organically. Analyzes co-ranking patterns in organic search results. PhraseMatch: Returns keywords thematically and semantically related to the query keyword. Finds terms with similar meaning, context, or category associations. Questions: Returns question-format keywords related to the query topic. Includes who, what, when, where, why, how queries that users search. Transactions: Returns keywords with commercial/transactional intent related to the query. Identifies buying-signal terms like buy, price, deal, discount, review. example: PhraseMatch example: PhraseMatch - name: includeTerms in: query description: Comma-separated list of terms that must be present in the keyword. schema: type: string example: hosting,domain,website - name: includeAnyTerm in: query description: 'Used with includeTerms. If true: match any term (OR). If false: require all terms (AND).' schema: type: boolean default: false example: false - name: excludeTerms in: query description: Comma-separated list of terms to exclude from results (e.g., branded or irrelevant terms). schema: type: string example: free,cheap,discount - name: searchVolume.min in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: searchVolume.max in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: liveSearchVolume.min in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: liveSearchVolume.max in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: keywordDifficulty.min in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: keywordDifficulty.max in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: costPerClick.min in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClick.max in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClickOption in: query description: Cost per click keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: wordCount.min in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: wordCount.max in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: clicks.min in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: clicks.max in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: isQuestion in: query description: Filter on if the keyword is a question. schema: type: boolean default: false example: false example: false - name: isTransactionalIntent in: query description: Filter on if the keyword has transactional intent. schema: type: boolean default: false example: false example: false - name: serpFirstResult in: query description: 'Filter to keywords where this specific domain ranks #1 in organic search results. Useful for identifying keywords where a particular competitor dominates.' schema: type: string example: example.com - name: mobileSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: mobileSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: desktopSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: desktopSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: notClickedSearchesPercentage.min in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: notClickedSearchesPercentage.max in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: paidClickSearchPercentage.min in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: paidClickSearchPercentage.max in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: organicClicksSearchPercentage.min in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: organicClicksSearchPercentage.max in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: monthlyCost.min in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCost.max in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCostOption in: query description: Monthly Cost keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: rankingHomepages.min in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: rankingHomepages.max in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: adCount.min in: query description: Filter by the number of total advertisers schema: type: number format: float - name: adCount.max in: query description: Filter by the number of total advertisers schema: type: number format: float - name: pageSize in: query description: The maximum number of rows returned. schema: type: integer format: int32 default: 5 maximum: 10000 minimum: 1 example: 5 example: 5 - name: countryCode in: query description: 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.). All Countries schema: type: string default: US enum: - 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 example: US - name: sortBy in: query description: Column to sort by. schema: type: string default: null enum: - SearchVolume - LiveSearchVolume - RankingDifficulty - TotalMonthlyClicks - PercentMobileSearches - PercentDesktopSearches - PercentSearchesNotClicked - PercentPaidClicks - PercentOrganicClicks - BroadCostPerClick - PhraseCostPerClick - ExactCostPerClick - BroadMonthlyClicks - PhraseMonthlyClicks - ExactMonthlyClicks - BroadMonthlyCost - PhraseMonthlyCost - ExactMonthlyCost - PaidCompetitors - RankingHomepages x-enumDescriptions: SearchVolume: Monthly search volume LiveSearchVolume: Real-time search volume data RankingDifficulty: SEO competition difficulty score TotalMonthlyClicks: Estimated total monthly clicks PercentMobileSearches: Percentage of searches from mobile devices PercentDesktopSearches: Percentage of searches from desktop devices PercentSearchesNotClicked: Percentage of searches resulting in no clicks PercentPaidClicks: Percentage of clicks going to paid results PercentOrganicClicks: Percentage of clicks going to organic results BroadCostPerClick: Broad match cost per click estimate PhraseCostPerClick: Phrase match cost per click estimate ExactCostPerClick: Exact match cost per click estimate BroadMonthlyClicks: Estimated monthly clicks for broad match PhraseMonthlyClicks: Estimated monthly clicks for phrase match ExactMonthlyClicks: Estimated monthly clicks for exact match BroadMonthlyCost: Estimated monthly cost for broad match PhraseMonthlyCost: Estimated monthly cost for phrase match ExactMonthlyCost: Estimated monthly cost for exact match PaidCompetitors: Number of paid search competitors RankingHomepages: Number of homepages ranking organically example: SearchVolume example: SearchVolume - name: sortOrder in: query description: Order to sort the results. schema: type: string default: Descending enum: - Ascending - Descending example: Descending example: Descending - name: startingRow in: query description: Row number to start the results with. schema: type: integer format: int32 default: 1 maximum: 10000 minimum: 1 example: 1 example: 1 - name: adultFilter in: query description: Exclude adult keywords considered unsafe for work. schema: type: boolean default: true example: true example: true - name: onlyAdultKeywords in: query description: Only include adult keywords considered unsafe for work. schema: type: boolean default: false example: false example: false responses: '200': description: OK content: application/json: schema: type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: "The total number of results available that matches the query including\r\nitems that might not be included in the returned results/page." type: integer format: int64 readOnly: true results: type: array items: type: object properties: keyword: description: By looking at strong competitors in this niche and their most trusted keywords over time, we suggest similar keywords here that we found to be profitable for your competition. type: string nullable: true example: red shoes searchVolume: description: This is the estimated number of times this past month that people have searched this keyword. The numbers reflect searches done in the US on Google.com (or in the UK on Google.co.uk if you are looking at UK data). We blend data from multiple sources to give a truer snapshot of activity on this keyword. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: This metric displays a more likely SV based on recent trends or out-of-date estimates. The original volume remains unchanged in any domain's rolled-up metrics. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: We've calculated how difficult it would be to rank on this keyword. The score is based on a scale of 0-100 (with 100 being the most difficult to rank for). Compare this number to other keywords you're targeting to get an idea of how to prioritize your SEO campaign. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: This is the total number of all clicks (organic and paid) made on the SERP over the past month. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: When we have a breakdown of how many of the searches for this keyword come from mobile vs desktop, we will show it here. type: number format: double nullable: true example: 0.52009505 percentDesktopSearches: description: When we have a breakdown of how many of the searches for this keyword come from desktop vs mobile, we will show it here. type: number format: double nullable: true example: 0.47990492 percentSearchesNotClicked: description: Some SERPs return enough information that the user does not have to click any results. There might also be unexpected results that cause the user to abandon the SERP without any clicks. This is the rate that searchers leave the page without clicking any result. type: number format: double nullable: true example: 0.1792681 percentPaidClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to the paid ads. type: number format: double nullable: true example: 0.52188635 percentOrganicClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to organic results. type: number format: double nullable: true example: 0.47811362 broadCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.67 exactCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly clicks for broad match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly clicks for phrase match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 42150.3 exactMonthlyClicks: description: Estimated monthly clicks for exact match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 25542 exactMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 19041.6 paidCompetitors: description: This is the total number of advertisers we've seen over the last 14 months for this keyword. It's helpful to know how competitive the field is and how many advertisers have tested this keyword over time. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: This is the list of distinct advertisers we've seen over the last 14 months for this keyword. type: array items: type: string nullable: true rankingHomepages: description: We roll up the number of home pages that rank within the first 50 results for this keyword. (It doesn't count ads, only organic results.) A homepage might be "https://webmd.com" vs a longer path like "https://www.webmd.com/fitness-exercise". type: integer format: int32 nullable: true example: 8 serpFeaturesCsv: description: Comma-separated list of SERP features present for this keyword (e.g., Images, Videos, Maps, Shopping), indicating competition for organic real estate. type: string nullable: true example: Images,Maps serpFirstResult: description: Domain name of the top-ranking organic result for this keyword, useful for identifying category leaders. type: string nullable: true example: example.com isQuestion: description: Indicates whether this keyword is phrased as a question (who, what, when, where, why, how). type: boolean example: false isNotSafeForWork: description: Indicates whether this keyword is flagged as containing adult or inappropriate content. type: boolean example: false additionalProperties: false readOnly: true nullable: true additionalProperties: false '400': description: Bad Request '401': description: User failed authorization '500': description: Internal Server Error tags: - Keyword Research API /v2/related/getRelatedKeywords: get: operationId: RelatedKeywordsV2Api_GetRelatedKeywords_GET summary: Get Related Keywords description: 'Returns thematically related keywords that share similar categories and themes with your seed keyword. This endpoint helps expand your keyword reach with relevant, competitive terms to broaden your content strategy and advertising opportunities. [Visualize this API live on SpyFu](https://www.spyfu.com/keyword/related?query=running+shoes)' parameters: - name: query in: query description: Seed keyword to find thematically related keywords for. required: true schema: type: string example: running shoes example: running shoes - name: includeTerms in: query description: Comma-separated list of terms that must be present in the keyword. schema: type: string example: hosting,domain,website - name: includeAnyTerm in: query description: 'Used with includeTerms. If true: match any term (OR). If false: require all terms (AND).' schema: type: boolean default: false example: false - name: excludeTerms in: query description: Comma-separated list of terms to exclude from results (e.g., branded or irrelevant terms). schema: type: string example: free,cheap,discount - name: searchVolume.min in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: searchVolume.max in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: liveSearchVolume.min in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: liveSearchVolume.max in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: keywordDifficulty.min in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: keywordDifficulty.max in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: costPerClick.min in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClick.max in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClickOption in: query description: Cost per click keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: wordCount.min in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: wordCount.max in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: clicks.min in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: clicks.max in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: isQuestion in: query description: Filter on if the keyword is a question. schema: type: boolean default: false example: false example: false - name: isTransactionalIntent in: query description: Filter on if the keyword has transactional intent. schema: type: boolean default: false example: false example: false - name: serpFirstResult in: query description: 'Filter to keywords where this specific domain ranks #1 in organic search results. Useful for identifying keywords where a particular competitor dominates.' schema: type: string example: example.com - name: mobileSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: mobileSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: desktopSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: desktopSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: notClickedSearchesPercentage.min in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: notClickedSearchesPercentage.max in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: paidClickSearchPercentage.min in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: paidClickSearchPercentage.max in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: organicClicksSearchPercentage.min in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: organicClicksSearchPercentage.max in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: monthlyCost.min in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCost.max in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCostOption in: query description: Monthly Cost keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: rankingHomepages.min in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: rankingHomepages.max in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: adCount.min in: query description: Filter by the number of total advertisers schema: type: number format: float - name: adCount.max in: query description: Filter by the number of total advertisers schema: type: number format: float - name: pageSize in: query description: The maximum number of rows returned. schema: type: integer format: int32 default: 5 maximum: 10000 minimum: 1 example: 5 example: 5 - name: countryCode in: query description: 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.). All Countries schema: type: string default: US enum: - 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 example: US - name: sortBy in: query description: Column to sort by. schema: type: string default: null enum: - SearchVolume - LiveSearchVolume - RankingDifficulty - TotalMonthlyClicks - PercentMobileSearches - PercentDesktopSearches - PercentSearchesNotClicked - PercentPaidClicks - PercentOrganicClicks - BroadCostPerClick - PhraseCostPerClick - ExactCostPerClick - BroadMonthlyClicks - PhraseMonthlyClicks - ExactMonthlyClicks - BroadMonthlyCost - PhraseMonthlyCost - ExactMonthlyCost - PaidCompetitors - RankingHomepages x-enumDescriptions: SearchVolume: Monthly search volume LiveSearchVolume: Real-time search volume data RankingDifficulty: SEO competition difficulty score TotalMonthlyClicks: Estimated total monthly clicks PercentMobileSearches: Percentage of searches from mobile devices PercentDesktopSearches: Percentage of searches from desktop devices PercentSearchesNotClicked: Percentage of searches resulting in no clicks PercentPaidClicks: Percentage of clicks going to paid results PercentOrganicClicks: Percentage of clicks going to organic results BroadCostPerClick: Broad match cost per click estimate PhraseCostPerClick: Phrase match cost per click estimate ExactCostPerClick: Exact match cost per click estimate BroadMonthlyClicks: Estimated monthly clicks for broad match PhraseMonthlyClicks: Estimated monthly clicks for phrase match ExactMonthlyClicks: Estimated monthly clicks for exact match BroadMonthlyCost: Estimated monthly cost for broad match PhraseMonthlyCost: Estimated monthly cost for phrase match ExactMonthlyCost: Estimated monthly cost for exact match PaidCompetitors: Number of paid search competitors RankingHomepages: Number of homepages ranking organically example: SearchVolume example: SearchVolume - name: sortOrder in: query description: Order to sort the results. schema: type: string default: Descending enum: - Ascending - Descending example: Descending example: Descending - name: startingRow in: query description: Row number to start the results with. schema: type: integer format: int32 default: 1 maximum: 10000 minimum: 1 example: 1 example: 1 - name: adultFilter in: query description: Exclude adult keywords considered unsafe for work. schema: type: boolean default: true example: true example: true - name: onlyAdultKeywords in: query description: Only include adult keywords considered unsafe for work. schema: type: boolean default: false example: false example: false responses: '200': description: Successfully retrieved related keywords. Returns keyword data for thematically similar terms that share categories and themes, perfect for expanding content reach and competitive keyword targeting. content: application/json: schema: type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: "The total number of results available that matches the query including\r\nitems that might not be included in the returned results/page." type: integer format: int64 readOnly: true results: type: array items: type: object properties: keyword: description: By looking at strong competitors in this niche and their most trusted keywords over time, we suggest similar keywords here that we found to be profitable for your competition. type: string nullable: true example: red shoes searchVolume: description: This is the estimated number of times this past month that people have searched this keyword. The numbers reflect searches done in the US on Google.com (or in the UK on Google.co.uk if you are looking at UK data). We blend data from multiple sources to give a truer snapshot of activity on this keyword. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: This metric displays a more likely SV based on recent trends or out-of-date estimates. The original volume remains unchanged in any domain's rolled-up metrics. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: We've calculated how difficult it would be to rank on this keyword. The score is based on a scale of 0-100 (with 100 being the most difficult to rank for). Compare this number to other keywords you're targeting to get an idea of how to prioritize your SEO campaign. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: This is the total number of all clicks (organic and paid) made on the SERP over the past month. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: When we have a breakdown of how many of the searches for this keyword come from mobile vs desktop, we will show it here. type: number format: double nullable: true example: 0.52009505 percentDesktopSearches: description: When we have a breakdown of how many of the searches for this keyword come from desktop vs mobile, we will show it here. type: number format: double nullable: true example: 0.47990492 percentSearchesNotClicked: description: Some SERPs return enough information that the user does not have to click any results. There might also be unexpected results that cause the user to abandon the SERP without any clicks. This is the rate that searchers leave the page without clicking any result. type: number format: double nullable: true example: 0.1792681 percentPaidClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to the paid ads. type: number format: double nullable: true example: 0.52188635 percentOrganicClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to organic results. type: number format: double nullable: true example: 0.47811362 broadCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.67 exactCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly clicks for broad match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly clicks for phrase match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 42150.3 exactMonthlyClicks: description: Estimated monthly clicks for exact match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 25542 exactMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 19041.6 paidCompetitors: description: This is the total number of advertisers we've seen over the last 14 months for this keyword. It's helpful to know how competitive the field is and how many advertisers have tested this keyword over time. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: This is the list of distinct advertisers we've seen over the last 14 months for this keyword. type: array items: type: string nullable: true rankingHomepages: description: We roll up the number of home pages that rank within the first 50 results for this keyword. (It doesn't count ads, only organic results.) A homepage might be "https://webmd.com" vs a longer path like "https://www.webmd.com/fitness-exercise". type: integer format: int32 nullable: true example: 8 serpFeaturesCsv: description: Comma-separated list of SERP features present for this keyword (e.g., Images, Videos, Maps, Shopping), indicating competition for organic real estate. type: string nullable: true example: Images,Maps serpFirstResult: description: Domain name of the top-ranking organic result for this keyword, useful for identifying category leaders. type: string nullable: true example: example.com isQuestion: description: Indicates whether this keyword is phrased as a question (who, what, when, where, why, how). type: boolean example: false isNotSafeForWork: description: Indicates whether this keyword is flagged as containing adult or inappropriate content. type: boolean example: false additionalProperties: false readOnly: true nullable: true additionalProperties: false '400': description: Bad Request - Invalid parameters provided (e.g., malformed keyword query or invalid country code) '401': description: Unauthorized - Invalid API credentials or insufficient permissions to access keyword research data '500': description: Internal Server Error - A server-side error occurred while processing the request tags: - Keyword Research API /v2/related/getQuestionKeywords: get: operationId: RelatedKeywordsV2Api_GetQuestionKeywords_GET summary: Get Question Keywords description: 'Returns question-based keywords related to your seed topic to inspire content creation and FAQ development. This endpoint identifies what people are asking about your subject matter, revealing content opportunities that answer common user questions and drive organic traffic. [Visualize this API live on SpyFu](https://www.spyfu.com/keyword/related?query=running+shoes)' parameters: - name: query in: query description: Seed keyword to find related question keywords for. required: true schema: type: string example: running shoes example: running shoes - name: includeTerms in: query description: Comma-separated list of terms that must be present in the keyword. schema: type: string example: hosting,domain,website - name: includeAnyTerm in: query description: 'Used with includeTerms. If true: match any term (OR). If false: require all terms (AND).' schema: type: boolean default: false example: false - name: excludeTerms in: query description: Comma-separated list of terms to exclude from results (e.g., branded or irrelevant terms). schema: type: string example: free,cheap,discount - name: searchVolume.min in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: searchVolume.max in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: liveSearchVolume.min in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: liveSearchVolume.max in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: keywordDifficulty.min in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: keywordDifficulty.max in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: costPerClick.min in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClick.max in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClickOption in: query description: Cost per click keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: wordCount.min in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: wordCount.max in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: clicks.min in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: clicks.max in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: isQuestion in: query description: Filter on if the keyword is a question. schema: type: boolean default: false example: false example: false - name: isTransactionalIntent in: query description: Filter on if the keyword has transactional intent. schema: type: boolean default: false example: false example: false - name: serpFirstResult in: query description: 'Filter to keywords where this specific domain ranks #1 in organic search results. Useful for identifying keywords where a particular competitor dominates.' schema: type: string example: example.com - name: mobileSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: mobileSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: desktopSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: desktopSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: notClickedSearchesPercentage.min in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: notClickedSearchesPercentage.max in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: paidClickSearchPercentage.min in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: paidClickSearchPercentage.max in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: organicClicksSearchPercentage.min in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: organicClicksSearchPercentage.max in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: monthlyCost.min in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCost.max in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCostOption in: query description: Monthly Cost keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: rankingHomepages.min in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: rankingHomepages.max in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: adCount.min in: query description: Filter by the number of total advertisers schema: type: number format: float - name: adCount.max in: query description: Filter by the number of total advertisers schema: type: number format: float - name: pageSize in: query description: The maximum number of rows returned. schema: type: integer format: int32 default: 5 maximum: 10000 minimum: 1 example: 5 example: 5 - name: countryCode in: query description: 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.). All Countries schema: type: string default: US enum: - 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 example: US - name: sortBy in: query description: Column to sort by. schema: type: string default: null enum: - SearchVolume - LiveSearchVolume - RankingDifficulty - TotalMonthlyClicks - PercentMobileSearches - PercentDesktopSearches - PercentSearchesNotClicked - PercentPaidClicks - PercentOrganicClicks - BroadCostPerClick - PhraseCostPerClick - ExactCostPerClick - BroadMonthlyClicks - PhraseMonthlyClicks - ExactMonthlyClicks - BroadMonthlyCost - PhraseMonthlyCost - ExactMonthlyCost - PaidCompetitors - RankingHomepages x-enumDescriptions: SearchVolume: Monthly search volume LiveSearchVolume: Real-time search volume data RankingDifficulty: SEO competition difficulty score TotalMonthlyClicks: Estimated total monthly clicks PercentMobileSearches: Percentage of searches from mobile devices PercentDesktopSearches: Percentage of searches from desktop devices PercentSearchesNotClicked: Percentage of searches resulting in no clicks PercentPaidClicks: Percentage of clicks going to paid results PercentOrganicClicks: Percentage of clicks going to organic results BroadCostPerClick: Broad match cost per click estimate PhraseCostPerClick: Phrase match cost per click estimate ExactCostPerClick: Exact match cost per click estimate BroadMonthlyClicks: Estimated monthly clicks for broad match PhraseMonthlyClicks: Estimated monthly clicks for phrase match ExactMonthlyClicks: Estimated monthly clicks for exact match BroadMonthlyCost: Estimated monthly cost for broad match PhraseMonthlyCost: Estimated monthly cost for phrase match ExactMonthlyCost: Estimated monthly cost for exact match PaidCompetitors: Number of paid search competitors RankingHomepages: Number of homepages ranking organically example: SearchVolume example: SearchVolume - name: sortOrder in: query description: Order to sort the results. schema: type: string default: Descending enum: - Ascending - Descending example: Descending example: Descending - name: startingRow in: query description: Row number to start the results with. schema: type: integer format: int32 default: 1 maximum: 10000 minimum: 1 example: 1 example: 1 - name: adultFilter in: query description: Exclude adult keywords considered unsafe for work. schema: type: boolean default: true example: true example: true - name: onlyAdultKeywords in: query description: Only include adult keywords considered unsafe for work. schema: type: boolean default: false example: false example: false responses: '200': description: Successfully retrieved question keywords. Returns keyword data focused on interrogative phrases and user questions, ideal for content strategy and FAQ development to address common user inquiries. content: application/json: schema: type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: "The total number of results available that matches the query including\r\nitems that might not be included in the returned results/page." type: integer format: int64 readOnly: true results: type: array items: type: object properties: keyword: description: By looking at strong competitors in this niche and their most trusted keywords over time, we suggest similar keywords here that we found to be profitable for your competition. type: string nullable: true example: red shoes searchVolume: description: This is the estimated number of times this past month that people have searched this keyword. The numbers reflect searches done in the US on Google.com (or in the UK on Google.co.uk if you are looking at UK data). We blend data from multiple sources to give a truer snapshot of activity on this keyword. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: This metric displays a more likely SV based on recent trends or out-of-date estimates. The original volume remains unchanged in any domain's rolled-up metrics. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: We've calculated how difficult it would be to rank on this keyword. The score is based on a scale of 0-100 (with 100 being the most difficult to rank for). Compare this number to other keywords you're targeting to get an idea of how to prioritize your SEO campaign. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: This is the total number of all clicks (organic and paid) made on the SERP over the past month. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: When we have a breakdown of how many of the searches for this keyword come from mobile vs desktop, we will show it here. type: number format: double nullable: true example: 0.52009505 percentDesktopSearches: description: When we have a breakdown of how many of the searches for this keyword come from desktop vs mobile, we will show it here. type: number format: double nullable: true example: 0.47990492 percentSearchesNotClicked: description: Some SERPs return enough information that the user does not have to click any results. There might also be unexpected results that cause the user to abandon the SERP without any clicks. This is the rate that searchers leave the page without clicking any result. type: number format: double nullable: true example: 0.1792681 percentPaidClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to the paid ads. type: number format: double nullable: true example: 0.52188635 percentOrganicClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to organic results. type: number format: double nullable: true example: 0.47811362 broadCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.67 exactCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly clicks for broad match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly clicks for phrase match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 42150.3 exactMonthlyClicks: description: Estimated monthly clicks for exact match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 25542 exactMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 19041.6 paidCompetitors: description: This is the total number of advertisers we've seen over the last 14 months for this keyword. It's helpful to know how competitive the field is and how many advertisers have tested this keyword over time. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: This is the list of distinct advertisers we've seen over the last 14 months for this keyword. type: array items: type: string nullable: true rankingHomepages: description: We roll up the number of home pages that rank within the first 50 results for this keyword. (It doesn't count ads, only organic results.) A homepage might be "https://webmd.com" vs a longer path like "https://www.webmd.com/fitness-exercise". type: integer format: int32 nullable: true example: 8 serpFeaturesCsv: description: Comma-separated list of SERP features present for this keyword (e.g., Images, Videos, Maps, Shopping), indicating competition for organic real estate. type: string nullable: true example: Images,Maps serpFirstResult: description: Domain name of the top-ranking organic result for this keyword, useful for identifying category leaders. type: string nullable: true example: example.com isQuestion: description: Indicates whether this keyword is phrased as a question (who, what, when, where, why, how). type: boolean example: false isNotSafeForWork: description: Indicates whether this keyword is flagged as containing adult or inappropriate content. type: boolean example: false additionalProperties: false readOnly: true nullable: true additionalProperties: false '400': description: Bad Request - Invalid parameters provided (e.g., malformed keyword query or invalid country code) '401': description: Unauthorized - Invalid API credentials or insufficient permissions to access keyword research data '500': description: Internal Server Error - A server-side error occurred while processing the request tags: - Keyword Research API /v2/related/getAlsoBuysAdsForKeywords: get: operationId: RelatedKeywordsV2Api_GetAlsoBuysAdsForKeywords_GET summary: Get Also Buys Ads For Keywords description: 'Returns related keywords that top advertisers also buy when targeting your seed keyword. This endpoint reveals cross-advertising patterns and keyword expansion opportunities by analyzing what other successful campaigns target alongside your keyword. [Visualize this API live on SpyFu](https://www.spyfu.com/keyword/related?query=running+shoes)' parameters: - name: query in: query description: Seed keyword to find related advertising keywords for. required: true schema: type: string example: running shoes example: running shoes - name: includeTerms in: query description: Comma-separated list of terms that must be present in the keyword. schema: type: string example: hosting,domain,website - name: includeAnyTerm in: query description: 'Used with includeTerms. If true: match any term (OR). If false: require all terms (AND).' schema: type: boolean default: false example: false - name: excludeTerms in: query description: Comma-separated list of terms to exclude from results (e.g., branded or irrelevant terms). schema: type: string example: free,cheap,discount - name: searchVolume.min in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: searchVolume.max in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: liveSearchVolume.min in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: liveSearchVolume.max in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: keywordDifficulty.min in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: keywordDifficulty.max in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: costPerClick.min in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClick.max in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClickOption in: query description: Cost per click keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: wordCount.min in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: wordCount.max in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: clicks.min in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: clicks.max in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: isQuestion in: query description: Filter on if the keyword is a question. schema: type: boolean default: false example: false example: false - name: isTransactionalIntent in: query description: Filter on if the keyword has transactional intent. schema: type: boolean default: false example: false example: false - name: serpFirstResult in: query description: 'Filter to keywords where this specific domain ranks #1 in organic search results. Useful for identifying keywords where a particular competitor dominates.' schema: type: string example: example.com - name: mobileSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: mobileSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: desktopSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: desktopSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: notClickedSearchesPercentage.min in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: notClickedSearchesPercentage.max in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: paidClickSearchPercentage.min in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: paidClickSearchPercentage.max in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: organicClicksSearchPercentage.min in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: organicClicksSearchPercentage.max in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: monthlyCost.min in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCost.max in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCostOption in: query description: Monthly Cost keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: rankingHomepages.min in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: rankingHomepages.max in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: adCount.min in: query description: Filter by the number of total advertisers schema: type: number format: float - name: adCount.max in: query description: Filter by the number of total advertisers schema: type: number format: float - name: pageSize in: query description: The maximum number of rows returned. schema: type: integer format: int32 default: 5 maximum: 10000 minimum: 1 example: 5 example: 5 - name: countryCode in: query description: 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.). All Countries schema: type: string default: US enum: - 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 example: US - name: sortBy in: query description: Column to sort by. schema: type: string default: null enum: - SearchVolume - LiveSearchVolume - RankingDifficulty - TotalMonthlyClicks - PercentMobileSearches - PercentDesktopSearches - PercentSearchesNotClicked - PercentPaidClicks - PercentOrganicClicks - BroadCostPerClick - PhraseCostPerClick - ExactCostPerClick - BroadMonthlyClicks - PhraseMonthlyClicks - ExactMonthlyClicks - BroadMonthlyCost - PhraseMonthlyCost - ExactMonthlyCost - PaidCompetitors - RankingHomepages x-enumDescriptions: SearchVolume: Monthly search volume LiveSearchVolume: Real-time search volume data RankingDifficulty: SEO competition difficulty score TotalMonthlyClicks: Estimated total monthly clicks PercentMobileSearches: Percentage of searches from mobile devices PercentDesktopSearches: Percentage of searches from desktop devices PercentSearchesNotClicked: Percentage of searches resulting in no clicks PercentPaidClicks: Percentage of clicks going to paid results PercentOrganicClicks: Percentage of clicks going to organic results BroadCostPerClick: Broad match cost per click estimate PhraseCostPerClick: Phrase match cost per click estimate ExactCostPerClick: Exact match cost per click estimate BroadMonthlyClicks: Estimated monthly clicks for broad match PhraseMonthlyClicks: Estimated monthly clicks for phrase match ExactMonthlyClicks: Estimated monthly clicks for exact match BroadMonthlyCost: Estimated monthly cost for broad match PhraseMonthlyCost: Estimated monthly cost for phrase match ExactMonthlyCost: Estimated monthly cost for exact match PaidCompetitors: Number of paid search competitors RankingHomepages: Number of homepages ranking organically example: SearchVolume example: SearchVolume - name: sortOrder in: query description: Order to sort the results. schema: type: string default: Descending enum: - Ascending - Descending example: Descending example: Descending - name: startingRow in: query description: Row number to start the results with. schema: type: integer format: int32 default: 1 maximum: 10000 minimum: 1 example: 1 example: 1 - name: adultFilter in: query description: Exclude adult keywords considered unsafe for work. schema: type: boolean default: true example: true example: true - name: onlyAdultKeywords in: query description: Only include adult keywords considered unsafe for work. schema: type: boolean default: false example: false example: false responses: '200': description: Successfully retrieved related advertising keywords. Returns keyword data showing what other successful advertisers also target, revealing cross-campaign patterns and expansion opportunities. content: application/json: schema: type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: "The total number of results available that matches the query including\r\nitems that might not be included in the returned results/page." type: integer format: int64 readOnly: true results: type: array items: type: object properties: keyword: description: By looking at strong competitors in this niche and their most trusted keywords over time, we suggest similar keywords here that we found to be profitable for your competition. type: string nullable: true example: red shoes searchVolume: description: This is the estimated number of times this past month that people have searched this keyword. The numbers reflect searches done in the US on Google.com (or in the UK on Google.co.uk if you are looking at UK data). We blend data from multiple sources to give a truer snapshot of activity on this keyword. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: This metric displays a more likely SV based on recent trends or out-of-date estimates. The original volume remains unchanged in any domain's rolled-up metrics. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: We've calculated how difficult it would be to rank on this keyword. The score is based on a scale of 0-100 (with 100 being the most difficult to rank for). Compare this number to other keywords you're targeting to get an idea of how to prioritize your SEO campaign. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: This is the total number of all clicks (organic and paid) made on the SERP over the past month. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: When we have a breakdown of how many of the searches for this keyword come from mobile vs desktop, we will show it here. type: number format: double nullable: true example: 0.52009505 percentDesktopSearches: description: When we have a breakdown of how many of the searches for this keyword come from desktop vs mobile, we will show it here. type: number format: double nullable: true example: 0.47990492 percentSearchesNotClicked: description: Some SERPs return enough information that the user does not have to click any results. There might also be unexpected results that cause the user to abandon the SERP without any clicks. This is the rate that searchers leave the page without clicking any result. type: number format: double nullable: true example: 0.1792681 percentPaidClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to the paid ads. type: number format: double nullable: true example: 0.52188635 percentOrganicClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to organic results. type: number format: double nullable: true example: 0.47811362 broadCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.67 exactCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly clicks for broad match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly clicks for phrase match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 42150.3 exactMonthlyClicks: description: Estimated monthly clicks for exact match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 25542 exactMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 19041.6 paidCompetitors: description: This is the total number of advertisers we've seen over the last 14 months for this keyword. It's helpful to know how competitive the field is and how many advertisers have tested this keyword over time. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: This is the list of distinct advertisers we've seen over the last 14 months for this keyword. type: array items: type: string nullable: true rankingHomepages: description: We roll up the number of home pages that rank within the first 50 results for this keyword. (It doesn't count ads, only organic results.) A homepage might be "https://webmd.com" vs a longer path like "https://www.webmd.com/fitness-exercise". type: integer format: int32 nullable: true example: 8 serpFeaturesCsv: description: Comma-separated list of SERP features present for this keyword (e.g., Images, Videos, Maps, Shopping), indicating competition for organic real estate. type: string nullable: true example: Images,Maps serpFirstResult: description: Domain name of the top-ranking organic result for this keyword, useful for identifying category leaders. type: string nullable: true example: example.com isQuestion: description: Indicates whether this keyword is phrased as a question (who, what, when, where, why, how). type: boolean example: false isNotSafeForWork: description: Indicates whether this keyword is flagged as containing adult or inappropriate content. type: boolean example: false additionalProperties: false readOnly: true nullable: true additionalProperties: false '400': description: Bad Request - Invalid parameters provided (e.g., malformed keyword query or invalid country code) '401': description: Unauthorized - Invalid API credentials or insufficient permissions to access keyword research data '500': description: Internal Server Error - A server-side error occurred while processing the request tags: - Keyword Research API /v2/related/getAlsoRanksForKeywords: get: operationId: RelatedKeywordsV2Api_GetAlsoRanksForKeywords_GET summary: Get Also Ranks For Keywords description: 'Returns related keywords that top-ranking domains for your seed keyword also rank for organically. This endpoint reveals SEO content opportunities and keyword expansion ideas by analyzing what successful sites target alongside your keyword. [Visualize this API live on SpyFu](https://www.spyfu.com/keyword/related?query=running+shoes)' parameters: - name: query in: query description: Seed keyword to find related organic ranking keywords for. required: true schema: type: string example: running shoes example: running shoes - name: includeTerms in: query description: Comma-separated list of terms that must be present in the keyword. schema: type: string example: hosting,domain,website - name: includeAnyTerm in: query description: 'Used with includeTerms. If true: match any term (OR). If false: require all terms (AND).' schema: type: boolean default: false example: false - name: excludeTerms in: query description: Comma-separated list of terms to exclude from results (e.g., branded or irrelevant terms). schema: type: string example: free,cheap,discount - name: searchVolume.min in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: searchVolume.max in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: liveSearchVolume.min in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: liveSearchVolume.max in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: keywordDifficulty.min in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: keywordDifficulty.max in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: costPerClick.min in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClick.max in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClickOption in: query description: Cost per click keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: wordCount.min in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: wordCount.max in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: clicks.min in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: clicks.max in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: isQuestion in: query description: Filter on if the keyword is a question. schema: type: boolean default: false example: false example: false - name: isTransactionalIntent in: query description: Filter on if the keyword has transactional intent. schema: type: boolean default: false example: false example: false - name: serpFirstResult in: query description: 'Filter to keywords where this specific domain ranks #1 in organic search results. Useful for identifying keywords where a particular competitor dominates.' schema: type: string example: example.com - name: mobileSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: mobileSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: desktopSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: desktopSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: notClickedSearchesPercentage.min in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: notClickedSearchesPercentage.max in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: paidClickSearchPercentage.min in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: paidClickSearchPercentage.max in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: organicClicksSearchPercentage.min in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: organicClicksSearchPercentage.max in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: monthlyCost.min in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCost.max in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCostOption in: query description: Monthly Cost keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: rankingHomepages.min in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: rankingHomepages.max in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: adCount.min in: query description: Filter by the number of total advertisers schema: type: number format: float - name: adCount.max in: query description: Filter by the number of total advertisers schema: type: number format: float - name: pageSize in: query description: The maximum number of rows returned. schema: type: integer format: int32 default: 5 maximum: 10000 minimum: 1 example: 5 example: 5 - name: countryCode in: query description: 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.). All Countries schema: type: string default: US enum: - 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 example: US - name: sortBy in: query description: Column to sort by. schema: type: string default: null enum: - SearchVolume - LiveSearchVolume - RankingDifficulty - TotalMonthlyClicks - PercentMobileSearches - PercentDesktopSearches - PercentSearchesNotClicked - PercentPaidClicks - PercentOrganicClicks - BroadCostPerClick - PhraseCostPerClick - ExactCostPerClick - BroadMonthlyClicks - PhraseMonthlyClicks - ExactMonthlyClicks - BroadMonthlyCost - PhraseMonthlyCost - ExactMonthlyCost - PaidCompetitors - RankingHomepages x-enumDescriptions: SearchVolume: Monthly search volume LiveSearchVolume: Real-time search volume data RankingDifficulty: SEO competition difficulty score TotalMonthlyClicks: Estimated total monthly clicks PercentMobileSearches: Percentage of searches from mobile devices PercentDesktopSearches: Percentage of searches from desktop devices PercentSearchesNotClicked: Percentage of searches resulting in no clicks PercentPaidClicks: Percentage of clicks going to paid results PercentOrganicClicks: Percentage of clicks going to organic results BroadCostPerClick: Broad match cost per click estimate PhraseCostPerClick: Phrase match cost per click estimate ExactCostPerClick: Exact match cost per click estimate BroadMonthlyClicks: Estimated monthly clicks for broad match PhraseMonthlyClicks: Estimated monthly clicks for phrase match ExactMonthlyClicks: Estimated monthly clicks for exact match BroadMonthlyCost: Estimated monthly cost for broad match PhraseMonthlyCost: Estimated monthly cost for phrase match ExactMonthlyCost: Estimated monthly cost for exact match PaidCompetitors: Number of paid search competitors RankingHomepages: Number of homepages ranking organically example: SearchVolume example: SearchVolume - name: sortOrder in: query description: Order to sort the results. schema: type: string default: Descending enum: - Ascending - Descending example: Descending example: Descending - name: startingRow in: query description: Row number to start the results with. schema: type: integer format: int32 default: 1 maximum: 10000 minimum: 1 example: 1 example: 1 - name: adultFilter in: query description: Exclude adult keywords considered unsafe for work. schema: type: boolean default: true example: true example: true - name: onlyAdultKeywords in: query description: Only include adult keywords considered unsafe for work. schema: type: boolean default: false example: false example: false responses: '200': description: Successfully retrieved related organic keywords. Returns keyword data showing what top-ranking domains also target, revealing SEO content opportunities and keyword expansion strategies. content: application/json: schema: type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: "The total number of results available that matches the query including\r\nitems that might not be included in the returned results/page." type: integer format: int64 readOnly: true results: type: array items: type: object properties: keyword: description: By looking at strong competitors in this niche and their most trusted keywords over time, we suggest similar keywords here that we found to be profitable for your competition. type: string nullable: true example: red shoes searchVolume: description: This is the estimated number of times this past month that people have searched this keyword. The numbers reflect searches done in the US on Google.com (or in the UK on Google.co.uk if you are looking at UK data). We blend data from multiple sources to give a truer snapshot of activity on this keyword. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: This metric displays a more likely SV based on recent trends or out-of-date estimates. The original volume remains unchanged in any domain's rolled-up metrics. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: We've calculated how difficult it would be to rank on this keyword. The score is based on a scale of 0-100 (with 100 being the most difficult to rank for). Compare this number to other keywords you're targeting to get an idea of how to prioritize your SEO campaign. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: This is the total number of all clicks (organic and paid) made on the SERP over the past month. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: When we have a breakdown of how many of the searches for this keyword come from mobile vs desktop, we will show it here. type: number format: double nullable: true example: 0.52009505 percentDesktopSearches: description: When we have a breakdown of how many of the searches for this keyword come from desktop vs mobile, we will show it here. type: number format: double nullable: true example: 0.47990492 percentSearchesNotClicked: description: Some SERPs return enough information that the user does not have to click any results. There might also be unexpected results that cause the user to abandon the SERP without any clicks. This is the rate that searchers leave the page without clicking any result. type: number format: double nullable: true example: 0.1792681 percentPaidClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to the paid ads. type: number format: double nullable: true example: 0.52188635 percentOrganicClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to organic results. type: number format: double nullable: true example: 0.47811362 broadCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.67 exactCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly clicks for broad match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly clicks for phrase match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 42150.3 exactMonthlyClicks: description: Estimated monthly clicks for exact match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 25542 exactMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 19041.6 paidCompetitors: description: This is the total number of advertisers we've seen over the last 14 months for this keyword. It's helpful to know how competitive the field is and how many advertisers have tested this keyword over time. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: This is the list of distinct advertisers we've seen over the last 14 months for this keyword. type: array items: type: string nullable: true rankingHomepages: description: We roll up the number of home pages that rank within the first 50 results for this keyword. (It doesn't count ads, only organic results.) A homepage might be "https://webmd.com" vs a longer path like "https://www.webmd.com/fitness-exercise". type: integer format: int32 nullable: true example: 8 serpFeaturesCsv: description: Comma-separated list of SERP features present for this keyword (e.g., Images, Videos, Maps, Shopping), indicating competition for organic real estate. type: string nullable: true example: Images,Maps serpFirstResult: description: Domain name of the top-ranking organic result for this keyword, useful for identifying category leaders. type: string nullable: true example: example.com isQuestion: description: Indicates whether this keyword is phrased as a question (who, what, when, where, why, how). type: boolean example: false isNotSafeForWork: description: Indicates whether this keyword is flagged as containing adult or inappropriate content. type: boolean example: false additionalProperties: false readOnly: true nullable: true additionalProperties: false '400': description: Bad Request - Invalid parameters provided (e.g., malformed keyword query or invalid country code) '401': description: Unauthorized - Invalid API credentials or insufficient permissions to access keyword research data '500': description: Internal Server Error - A server-side error occurred while processing the request tags: - Keyword Research API /v2/related/getTransactionKeywords: get: operationId: RelatedKeywordsV2Api_GetTransactionKeywords_GET summary: Get Transactional Keywords description: 'Returns high-intent keywords with strong buying signals related to your seed topic. This endpoint identifies commercial keywords that indicate users are ready to purchase, perfect for targeting conversion-focused campaigns and capturing bottom-funnel traffic. [Visualize this API live on SpyFu](https://www.spyfu.com/keyword/related?query=running+shoes)' parameters: - name: query in: query description: Seed keyword to find related transactional keywords for. required: true schema: type: string example: running shoes example: running shoes - name: includeTerms in: query description: Comma-separated list of terms that must be present in the keyword. schema: type: string example: hosting,domain,website - name: includeAnyTerm in: query description: 'Used with includeTerms. If true: match any term (OR). If false: require all terms (AND).' schema: type: boolean default: false example: false - name: excludeTerms in: query description: Comma-separated list of terms to exclude from results (e.g., branded or irrelevant terms). schema: type: string example: free,cheap,discount - name: searchVolume.min in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: searchVolume.max in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: liveSearchVolume.min in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: liveSearchVolume.max in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: keywordDifficulty.min in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: keywordDifficulty.max in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: costPerClick.min in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClick.max in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClickOption in: query description: Cost per click keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: wordCount.min in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: wordCount.max in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: clicks.min in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: clicks.max in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: isQuestion in: query description: Filter on if the keyword is a question. schema: type: boolean default: false example: false example: false - name: isTransactionalIntent in: query description: Filter on if the keyword has transactional intent. schema: type: boolean default: false example: false example: false - name: serpFirstResult in: query description: 'Filter to keywords where this specific domain ranks #1 in organic search results. Useful for identifying keywords where a particular competitor dominates.' schema: type: string example: example.com - name: mobileSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: mobileSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: desktopSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: desktopSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: notClickedSearchesPercentage.min in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: notClickedSearchesPercentage.max in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: paidClickSearchPercentage.min in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: paidClickSearchPercentage.max in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: organicClicksSearchPercentage.min in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: organicClicksSearchPercentage.max in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: monthlyCost.min in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCost.max in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCostOption in: query description: Monthly Cost keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: rankingHomepages.min in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: rankingHomepages.max in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: adCount.min in: query description: Filter by the number of total advertisers schema: type: number format: float - name: adCount.max in: query description: Filter by the number of total advertisers schema: type: number format: float - name: pageSize in: query description: The maximum number of rows returned. schema: type: integer format: int32 default: 5 maximum: 10000 minimum: 1 example: 5 example: 5 - name: countryCode in: query description: Country to get results for. schema: type: string default: US enum: - 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 example: US - name: sortBy in: query description: Column to sort by. schema: type: string default: null enum: - SearchVolume - LiveSearchVolume - RankingDifficulty - TotalMonthlyClicks - PercentMobileSearches - PercentDesktopSearches - PercentSearchesNotClicked - PercentPaidClicks - PercentOrganicClicks - BroadCostPerClick - PhraseCostPerClick - ExactCostPerClick - BroadMonthlyClicks - PhraseMonthlyClicks - ExactMonthlyClicks - BroadMonthlyCost - PhraseMonthlyCost - ExactMonthlyCost - PaidCompetitors - RankingHomepages x-enumDescriptions: SearchVolume: Monthly search volume LiveSearchVolume: Real-time search volume data RankingDifficulty: SEO competition difficulty score TotalMonthlyClicks: Estimated total monthly clicks PercentMobileSearches: Percentage of searches from mobile devices PercentDesktopSearches: Percentage of searches from desktop devices PercentSearchesNotClicked: Percentage of searches resulting in no clicks PercentPaidClicks: Percentage of clicks going to paid results PercentOrganicClicks: Percentage of clicks going to organic results BroadCostPerClick: Broad match cost per click estimate PhraseCostPerClick: Phrase match cost per click estimate ExactCostPerClick: Exact match cost per click estimate BroadMonthlyClicks: Estimated monthly clicks for broad match PhraseMonthlyClicks: Estimated monthly clicks for phrase match ExactMonthlyClicks: Estimated monthly clicks for exact match BroadMonthlyCost: Estimated monthly cost for broad match PhraseMonthlyCost: Estimated monthly cost for phrase match ExactMonthlyCost: Estimated monthly cost for exact match PaidCompetitors: Number of paid search competitors RankingHomepages: Number of homepages ranking organically example: SearchVolume example: SearchVolume - name: sortOrder in: query description: Order to sort the results. schema: type: string default: Descending enum: - Ascending - Descending example: Descending example: Descending - name: startingRow in: query description: Row number to start the results with. schema: type: integer format: int32 default: 1 maximum: 10000 minimum: 1 example: 1 example: 1 - name: adultFilter in: query description: Exclude adult keywords considered unsafe for work. schema: type: boolean default: true example: true example: true - name: onlyAdultKeywords in: query description: Only include adult keywords considered unsafe for work. schema: type: boolean default: false example: false example: false responses: '200': description: Successfully retrieved transactional keywords. Returns high-intent keyword data with strong commercial signals, ideal for conversion-focused campaigns and capturing users ready to purchase or take action. content: application/json: schema: type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: "The total number of results available that matches the query including\r\nitems that might not be included in the returned results/page." type: integer format: int64 readOnly: true results: type: array items: type: object properties: keyword: description: By looking at strong competitors in this niche and their most trusted keywords over time, we suggest similar keywords here that we found to be profitable for your competition. type: string nullable: true example: red shoes searchVolume: description: This is the estimated number of times this past month that people have searched this keyword. The numbers reflect searches done in the US on Google.com (or in the UK on Google.co.uk if you are looking at UK data). We blend data from multiple sources to give a truer snapshot of activity on this keyword. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: This metric displays a more likely SV based on recent trends or out-of-date estimates. The original volume remains unchanged in any domain's rolled-up metrics. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: We've calculated how difficult it would be to rank on this keyword. The score is based on a scale of 0-100 (with 100 being the most difficult to rank for). Compare this number to other keywords you're targeting to get an idea of how to prioritize your SEO campaign. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: This is the total number of all clicks (organic and paid) made on the SERP over the past month. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: When we have a breakdown of how many of the searches for this keyword come from mobile vs desktop, we will show it here. type: number format: double nullable: true example: 0.52009505 percentDesktopSearches: description: When we have a breakdown of how many of the searches for this keyword come from desktop vs mobile, we will show it here. type: number format: double nullable: true example: 0.47990492 percentSearchesNotClicked: description: Some SERPs return enough information that the user does not have to click any results. There might also be unexpected results that cause the user to abandon the SERP without any clicks. This is the rate that searchers leave the page without clicking any result. type: number format: double nullable: true example: 0.1792681 percentPaidClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to the paid ads. type: number format: double nullable: true example: 0.52188635 percentOrganicClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to organic results. type: number format: double nullable: true example: 0.47811362 broadCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.67 exactCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly clicks for broad match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly clicks for phrase match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 42150.3 exactMonthlyClicks: description: Estimated monthly clicks for exact match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 25542 exactMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 19041.6 paidCompetitors: description: This is the total number of advertisers we've seen over the last 14 months for this keyword. It's helpful to know how competitive the field is and how many advertisers have tested this keyword over time. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: This is the list of distinct advertisers we've seen over the last 14 months for this keyword. type: array items: type: string nullable: true rankingHomepages: description: We roll up the number of home pages that rank within the first 50 results for this keyword. (It doesn't count ads, only organic results.) A homepage might be "https://webmd.com" vs a longer path like "https://www.webmd.com/fitness-exercise". type: integer format: int32 nullable: true example: 8 serpFeaturesCsv: description: Comma-separated list of SERP features present for this keyword (e.g., Images, Videos, Maps, Shopping), indicating competition for organic real estate. type: string nullable: true example: Images,Maps serpFirstResult: description: Domain name of the top-ranking organic result for this keyword, useful for identifying category leaders. type: string nullable: true example: example.com isQuestion: description: Indicates whether this keyword is phrased as a question (who, what, when, where, why, how). type: boolean example: false isNotSafeForWork: description: Indicates whether this keyword is flagged as containing adult or inappropriate content. type: boolean example: false additionalProperties: false readOnly: true nullable: true additionalProperties: false '400': description: Bad Request - Invalid parameters provided (e.g., malformed keyword query or invalid country code) '401': description: Unauthorized - Invalid API credentials or insufficient permissions to access keyword research data '500': description: Internal Server Error - A server-side error occurred while processing the request tags: - Keyword Research API /v2/related/getKeywordInformation: get: operationId: RelatedKeywordsV2Api_GetKeywordsByBulkSearch_GET summary: Get Keyword Information Bulk description: 'Returns comprehensive keyword metrics and intelligence for a list of exact keywords. This endpoint provides search volume, competition data, cost estimates, and performance insights for specific keywords you want to analyze in bulk. [Visualize this API live on SpyFu](https://www.spyfu.com/keyword/overview?query=running+shoes)' parameters: - name: keywords in: query description: Comma-separated list of exact keywords to retrieve information for. required: true schema: type: string example: running shoes,athletic sneakers,sports footwear example: running shoes,athletic sneakers,sports footwear - name: searchVolume.min in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: searchVolume.max in: query description: Filter by the number of searches done this past month on Google. schema: type: number format: float - name: liveSearchVolume.min in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: liveSearchVolume.max in: query description: Filter by the number of searches done this past month on Google. This value is refreshed each month. schema: type: number format: float - name: keywordDifficulty.min in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: keywordDifficulty.max in: query description: Filter by how difficult it is to rank on this keyword. This can also be called Ranking Difficulty. schema: type: number format: float - name: costPerClick.min in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClick.max in: query description: Filter by the average cost per click. This will use the keyword matching option selected in `costPerClickOption` schema: type: number format: float - name: costPerClickOption in: query description: Cost per click keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: wordCount.min in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: wordCount.max in: query description: Filter by the number of words in the keyword. schema: type: number format: float - name: clicks.min in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: clicks.max in: query description: Filter by the number of total monthly clicks on the SERP for this keyword--organic and paid. schema: type: number format: float - name: isQuestion in: query description: Filter on if the keyword is a question. schema: type: boolean default: false example: false example: false - name: isTransactionalIntent in: query description: Filter on if the keyword has transactional intent. schema: type: boolean default: false example: false example: false - name: mobileSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: mobileSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on mobile devices. schema: type: number format: float - name: desktopSearchesPercentage.min in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: desktopSearchesPercentage.max in: query description: Filter by the percentage of searches that are done on desktop devices. schema: type: number format: float - name: notClickedSearchesPercentage.min in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: notClickedSearchesPercentage.max in: query description: 'Filter by the percentage of searches that are not clicked. Some keyword searches supply clear information in a featured snippet or similar displays. They don''t require a click to get the information. Those will have higher percentages in this metric.' schema: type: number format: float - name: paidClickSearchPercentage.min in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: paidClickSearchPercentage.max in: query description: Filter by the percentage of clicks that go to ads. schema: type: number format: float - name: organicClicksSearchPercentage.min in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: organicClicksSearchPercentage.max in: query description: Filter by the percentage of clicks that go to organic results, not ads. schema: type: number format: float - name: monthlyCost.min in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCost.max in: query description: Filter by the monthly cost of the keyword. This will use the keyword matching option selected in `monthlyCostOption` schema: type: number format: float - name: monthlyCostOption in: query description: Monthly Cost keyword matching option to filter results by. schema: type: string enum: - Broad - Exact - Phrase example: Broad example: Broad - name: rankingHomepages.min in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: rankingHomepages.max in: query description: Homepages on the SERP range to filter results by. schema: type: number format: float - name: adCount.min in: query description: Filter by the number of total advertisers schema: type: number format: float - name: adCount.max in: query description: Filter by the number of total advertisers schema: type: number format: float - name: countryCode in: query description: 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.). All Countries schema: type: string default: US enum: - 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 example: US - name: adultFilter in: query description: Exclude adult keywords considered unsafe for work. schema: type: boolean default: true example: true example: true - name: onlyAdultKeywords in: query description: Only include adult keywords considered unsafe for work. schema: type: boolean default: false example: false example: false responses: '200': description: Successfully retrieved keyword information. Returns comprehensive metrics including search volume, competition levels, cost estimates, and performance data for each requested keyword. content: application/json: schema: type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: "The total number of results available that matches the query including\r\nitems that might not be included in the returned results/page." type: integer format: int64 readOnly: true results: type: array items: type: object properties: keyword: description: By looking at strong competitors in this niche and their most trusted keywords over time, we suggest similar keywords here that we found to be profitable for your competition. type: string nullable: true example: red shoes searchVolume: description: This is the estimated number of times this past month that people have searched this keyword. The numbers reflect searches done in the US on Google.com (or in the UK on Google.co.uk if you are looking at UK data). We blend data from multiple sources to give a truer snapshot of activity on this keyword. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: This metric displays a more likely SV based on recent trends or out-of-date estimates. The original volume remains unchanged in any domain's rolled-up metrics. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: We've calculated how difficult it would be to rank on this keyword. The score is based on a scale of 0-100 (with 100 being the most difficult to rank for). Compare this number to other keywords you're targeting to get an idea of how to prioritize your SEO campaign. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: This is the total number of all clicks (organic and paid) made on the SERP over the past month. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: When we have a breakdown of how many of the searches for this keyword come from mobile vs desktop, we will show it here. type: number format: double nullable: true example: 0.52009505 percentDesktopSearches: description: When we have a breakdown of how many of the searches for this keyword come from desktop vs mobile, we will show it here. type: number format: double nullable: true example: 0.47990492 percentSearchesNotClicked: description: Some SERPs return enough information that the user does not have to click any results. There might also be unexpected results that cause the user to abandon the SERP without any clicks. This is the rate that searchers leave the page without clicking any result. type: number format: double nullable: true example: 0.1792681 percentPaidClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to the paid ads. type: number format: double nullable: true example: 0.52188635 percentOrganicClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to organic results. type: number format: double nullable: true example: 0.47811362 broadCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.67 exactCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly clicks for broad match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly clicks for phrase match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 42150.3 exactMonthlyClicks: description: Estimated monthly clicks for exact match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 25542 exactMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 19041.6 paidCompetitors: description: This is the total number of advertisers we've seen over the last 14 months for this keyword. It's helpful to know how competitive the field is and how many advertisers have tested this keyword over time. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: This is the list of distinct advertisers we've seen over the last 14 months for this keyword. type: array items: type: string nullable: true rankingHomepages: description: We roll up the number of home pages that rank within the first 50 results for this keyword. (It doesn't count ads, only organic results.) A homepage might be "https://webmd.com" vs a longer path like "https://www.webmd.com/fitness-exercise". type: integer format: int32 nullable: true example: 8 serpFeaturesCsv: description: Comma-separated list of SERP features present for this keyword (e.g., Images, Videos, Maps, Shopping), indicating competition for organic real estate. type: string nullable: true example: Images,Maps serpFirstResult: description: Domain name of the top-ranking organic result for this keyword, useful for identifying category leaders. type: string nullable: true example: example.com isQuestion: description: Indicates whether this keyword is phrased as a question (who, what, when, where, why, how). type: boolean example: false isNotSafeForWork: description: Indicates whether this keyword is flagged as containing adult or inappropriate content. type: boolean example: false additionalProperties: false readOnly: true nullable: true additionalProperties: false '400': description: Bad Request - Invalid parameters provided (e.g., malformed keyword list or invalid country code) '401': description: Unauthorized - Invalid API credentials or insufficient permissions to access keyword research data '500': description: Internal Server Error - A server-side error occurred while processing the request tags: - Keyword Research API post: operationId: RelatedKeywordsV2Api_GetKeywordsByBulkSearchPost_POST summary: Post Keyword Information Bulk description: 'Returns comprehensive keyword metrics and intelligence for a large list of exact keywords via POST request. This endpoint supports larger keyword lists and provides search volume, competition data, cost estimates, and performance insights for bulk keyword analysis. [Visualize this API live on SpyFu](https://www.spyfu.com/keyword/overview?query=running+shoes)' requestBody: description: Bulk keyword analysis request containing the list of keywords and country settings. required: true content: application/*+json: schema: description: Input for getting bulk keywords for the public API type: object properties: countryCode: description: Country to get results for. type: string default: US enum: - 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 searchVolume: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true liveSearchVolume: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true keywordDifficulty: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true wordCount: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true clicks: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true costPerClickOption: description: Cost per click keyword matching option to filter results by. type: string enum: - Broad - Exact - Phrase nullable: true example: Broad costPerClick: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true mobileSearchesPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true desktopSearchesPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true notClickedSearchesPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true paidClickSearchPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true organicClicksSearchPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true monthlyCostOption: description: Monthly Cost keyword matching option to filter results by. type: string enum: - Broad - Exact - Phrase nullable: true example: Broad monthlyCost: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true adCount: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true rankingHomepages: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true adultFilter: description: Exclude adult keywords considered unsafe for work. type: boolean default: true nullable: true example: true onlyAdultKeywords: description: Only include adult keywords considered unsafe for work. type: boolean default: false nullable: true example: false isQuestion: description: Filter on if the keyword is a question. type: boolean default: false example: false isTransactionalIntent: description: Filter on if the keyword has transactional intent. type: boolean default: false example: false keywords: description: CSV of keywords type: string minLength: 1 additionalProperties: false required: - keywords application/json: schema: description: Input for getting bulk keywords for the public API type: object properties: countryCode: description: Country to get results for. type: string default: US enum: - 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 searchVolume: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true liveSearchVolume: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true keywordDifficulty: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true wordCount: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true clicks: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true costPerClickOption: description: Cost per click keyword matching option to filter results by. type: string enum: - Broad - Exact - Phrase nullable: true example: Broad costPerClick: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true mobileSearchesPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true desktopSearchesPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true notClickedSearchesPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true paidClickSearchPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true organicClicksSearchPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true monthlyCostOption: description: Monthly Cost keyword matching option to filter results by. type: string enum: - Broad - Exact - Phrase nullable: true example: Broad monthlyCost: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true adCount: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true rankingHomepages: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true adultFilter: description: Exclude adult keywords considered unsafe for work. type: boolean default: true nullable: true example: true onlyAdultKeywords: description: Only include adult keywords considered unsafe for work. type: boolean default: false nullable: true example: false isQuestion: description: Filter on if the keyword is a question. type: boolean default: false example: false isTransactionalIntent: description: Filter on if the keyword has transactional intent. type: boolean default: false example: false keywords: description: CSV of keywords type: string minLength: 1 additionalProperties: false required: - keywords text/json: schema: description: Input for getting bulk keywords for the public API type: object properties: countryCode: description: Country to get results for. type: string default: US enum: - 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 searchVolume: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true liveSearchVolume: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true keywordDifficulty: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true wordCount: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true clicks: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true costPerClickOption: description: Cost per click keyword matching option to filter results by. type: string enum: - Broad - Exact - Phrase nullable: true example: Broad costPerClick: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true mobileSearchesPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true desktopSearchesPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true notClickedSearchesPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true paidClickSearchPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true organicClicksSearchPercentage: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true monthlyCostOption: description: Monthly Cost keyword matching option to filter results by. type: string enum: - Broad - Exact - Phrase nullable: true example: Broad monthlyCost: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true adCount: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true rankingHomepages: type: object additionalProperties: false properties: min: type: number format: float nullable: true max: type: number format: float nullable: true adultFilter: description: Exclude adult keywords considered unsafe for work. type: boolean default: true nullable: true example: true onlyAdultKeywords: description: Only include adult keywords considered unsafe for work. type: boolean default: false nullable: true example: false isQuestion: description: Filter on if the keyword is a question. type: boolean default: false example: false isTransactionalIntent: description: Filter on if the keyword has transactional intent. type: boolean default: false example: false keywords: description: CSV of keywords type: string minLength: 1 additionalProperties: false required: - keywords responses: '200': description: Successfully retrieved bulk keyword information. Returns comprehensive metrics including search volume, competition levels, cost estimates, and performance data for each requested keyword in the payload. content: application/json: schema: type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: "The total number of results available that matches the query including\r\nitems that might not be included in the returned results/page." type: integer format: int64 readOnly: true results: type: array items: type: object properties: keyword: description: By looking at strong competitors in this niche and their most trusted keywords over time, we suggest similar keywords here that we found to be profitable for your competition. type: string nullable: true example: red shoes searchVolume: description: This is the estimated number of times this past month that people have searched this keyword. The numbers reflect searches done in the US on Google.com (or in the UK on Google.co.uk if you are looking at UK data). We blend data from multiple sources to give a truer snapshot of activity on this keyword. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: This metric displays a more likely SV based on recent trends or out-of-date estimates. The original volume remains unchanged in any domain's rolled-up metrics. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: We've calculated how difficult it would be to rank on this keyword. The score is based on a scale of 0-100 (with 100 being the most difficult to rank for). Compare this number to other keywords you're targeting to get an idea of how to prioritize your SEO campaign. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: This is the total number of all clicks (organic and paid) made on the SERP over the past month. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: When we have a breakdown of how many of the searches for this keyword come from mobile vs desktop, we will show it here. type: number format: double nullable: true example: 0.52009505 percentDesktopSearches: description: When we have a breakdown of how many of the searches for this keyword come from desktop vs mobile, we will show it here. type: number format: double nullable: true example: 0.47990492 percentSearchesNotClicked: description: Some SERPs return enough information that the user does not have to click any results. There might also be unexpected results that cause the user to abandon the SERP without any clicks. This is the rate that searchers leave the page without clicking any result. type: number format: double nullable: true example: 0.1792681 percentPaidClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to the paid ads. type: number format: double nullable: true example: 0.52188635 percentOrganicClicks: description: Of all clicks made to this keyword's SERP, this percentage measures how many went to organic results. type: number format: double nullable: true example: 0.47811362 broadCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.67 exactCostPerClick: description: "This is the average amount an advertiser pays Google anytime someone clicks their ad on this keyword. These costs fluctuate depending on many factors, so keep that in mind when you are estimating larger budgets.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly clicks for broad match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly clicks for phrase match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 42150.3 exactMonthlyClicks: description: Estimated monthly clicks for exact match advertising on this keyword, calculated from search volume and expected click-through rates. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 25542 exactMonthlyCost: description: "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n

These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.

" type: number format: double nullable: true example: 19041.6 paidCompetitors: description: This is the total number of advertisers we've seen over the last 14 months for this keyword. It's helpful to know how competitive the field is and how many advertisers have tested this keyword over time. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: This is the list of distinct advertisers we've seen over the last 14 months for this keyword. type: array items: type: string nullable: true rankingHomepages: description: We roll up the number of home pages that rank within the first 50 results for this keyword. (It doesn't count ads, only organic results.) A homepage might be "https://webmd.com" vs a longer path like "https://www.webmd.com/fitness-exercise". type: integer format: int32 nullable: true example: 8 serpFeaturesCsv: description: Comma-separated list of SERP features present for this keyword (e.g., Images, Videos, Maps, Shopping), indicating competition for organic real estate. type: string nullable: true example: Images,Maps serpFirstResult: description: Domain name of the top-ranking organic result for this keyword, useful for identifying category leaders. type: string nullable: true example: example.com isQuestion: description: Indicates whether this keyword is phrased as a question (who, what, when, where, why, how). type: boolean example: false isNotSafeForWork: description: Indicates whether this keyword is flagged as containing adult or inappropriate content. type: boolean example: false additionalProperties: false readOnly: true nullable: true additionalProperties: false '400': description: Bad Request - Invalid request body or parameters provided (e.g., malformed keyword list or invalid country code) '401': description: Unauthorized - Invalid API credentials or insufficient permissions to access keyword research data '500': description: Internal Server Error - A server-side error occurred while processing the request tags: - Keyword Research API components: securitySchemes: Basic_Authentication_Token: type: http description: 'Basic Authentication is a standard that involves encoding your SPYFU_API_ID:SECRET_KEY into a Base64 string. Your SpyFu API ID and Secret Key can both be found under the Account Settings -> API Usage page. Additionally, you can find the Base64 string has been pre-generated on the same page under Base 64 Key. Finally, this encoded string is sent in the "Authorization" header prefixed with the keyword "Basic":
For example, to authorize as 00000000-0000-0000-0000-000000000000:AB12WXYZ the client would send
Authorization: Basic MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwOkFCMTJXWFla
' scheme: basic Query_Parameter_Token: type: apiKey description: An API key can be added as a query parameter. Your API key is listed as "Secret Key" found under the Account Settings -> API Usage page
For example, to authorize with the API key AB12WXY
/apis/example_api/GetExample?domain=spyfu.com&api_key=AB12WXYZ
name: api_key in: query HMAC_Authentication_Header: type: apiKey description: For even more security, each request can be individually authenticated with a timestamped HMAC (Hash Message Authentication Code) signature. Composed of your secret key, a valid timestamp, the API request path, and all request parameters.

Creating the signature:


Combine the pieces that will be converted into the signature.
StringToSign =
HTTP-Verb + "\n" +
Timestamp + "\n" +
UrlPath + "\n"
QueryParameters;

Create UTF-8 encodings of the above string and of your secret key.
byte[] SecretKeyBytes = UTF-8-Encoding-Of( Upper-Case-Of( SECRET_KEY ) );
byte[] StringToSignBytes = UTF-8-Encoding-Of( StringToSign );

Use an implementation of HMAC256 using your UTF-8 secret key to encode the combined string of your request. This should then be converted to Base64 to finish creating your signature.
Signature = Base64( HMAC-SHA256( SecretKeyBytes, StringToSignBytes ) );

Using the signature:


This signature is then sent in through an Authentication header with your username.
Authentication: UserName:Signature
name: Authentication in: header