openapi: 3.0.3 info: title: Account Account API Kombat 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: Kombat API paths: /v2/kombat/getCompetingPpcKeywords: get: operationId: KombatApi_GetCompetingPpcKeywords_GET summary: Get Competing PPC Keywords description: 'Returns paid search keywords shared across multiple competitor domains. The process selects keywords from the includedDomains, then removes any keywords that belong to domains in the excludedDomains list. [Visualize this API live on SpyFu](https://www.spyfu.com/kombat?query=example.com,example.org)' parameters: - name: includeDomainsCsv in: query description: Comma-separated list of domains to include in keyword analysis. required: true schema: type: string example: domain.com,anotherdomain.com example: domain.com,anotherdomain.com - name: excludeDomainsCsv in: query description: CSV list of domains to exclude in results schema: type: string example: excludedomain.com example: excludedomain.com - name: isIntersection in: query description: Keywords (True:ALL/False:ANY) the domains contain. required: true schema: type: boolean default: true example: true example: true - 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: 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: 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: 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: 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: 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: onlyAdultKeywords in: query description: Only include adult keywords considered unsafe for work. schema: type: boolean default: false example: false example: false - 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: SearchVolume 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 responses: '200': description: Successfully retrieved competing PPC keywords. Returns keyword data with search metrics, cost estimates, and competitive intelligence for multiple domain analysis. content: application/json: schema: description: Response wrapper containing competitive keyword analysis data showing keywords where multiple domains compete in the same search channel with pagination metadata. type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: Total number of competitive keywords available that match the query criteria, including results not included in the current page. type: integer format: int64 readOnly: true example: 50000 results: description: Array of competitive keywords with detailed metrics showing overlap between multiple domains in either SEO or PPC search channels. type: array items: type: object properties: keyword: description: The keyword that shows competitive overlap between multiple domains in the same search channel. type: string nullable: true example: running shoes searchVolume: description: Estimated monthly search volume for this keyword based on Google search data across the selected country/region, blended from multiple sources for accuracy. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: Adjusted search volume based on recent trends and real-time data, providing a more current estimate than historical averages. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: SEO difficulty score (0-100) indicating how challenging it would be to rank organically for this keyword, with 100 being most difficult. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: Total estimated monthly clicks (both organic and paid) generated from search results for this keyword. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: Percentage of searches for this keyword that originate from mobile devices (0.0-1.0). type: number format: double nullable: true example: 0.52 percentDesktopSearches: description: Percentage of searches for this keyword that originate from desktop devices (0.0-1.0). type: number format: double nullable: true example: 0.48 percentSearchesNotClicked: description: Percentage of searches where users leave the SERP without clicking any result, often due to sufficient information in featured snippets or direct answers (0.0-1.0). type: number format: double nullable: true example: 0.18 percentPaidClicks: description: Percentage of total SERP clicks that go to paid ad results (0.0-1.0). type: number format: double nullable: true example: 0.52 percentOrganicClicks: description: Percentage of total SERP clicks that go to organic search results (0.0-1.0). type: number format: double nullable: true example: 0.48 broadCostPerClick: description: Average cost-per-click for broad match keyword targeting, representing what advertisers typically pay when their ads are triggered by related keywords. type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: Average cost-per-click for phrase match keyword targeting, where ads show for searches that include the keyword phrase in the same order. type: number format: double nullable: true example: 0.67 exactCostPerClick: description: Average cost-per-click for exact match keyword targeting, the most precise and typically highest-performing match type. type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly paid clicks for broad match targeting of this keyword. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly paid clicks for phrase match targeting of this keyword. type: number format: float nullable: true example: 38000 exactMonthlyClicks: description: Estimated monthly paid clicks for exact match targeting of this keyword. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: Estimated monthly advertising spend for broad match targeting of this keyword. type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: Estimated monthly advertising spend for phrase match targeting of this keyword. type: number format: double nullable: true example: 25542 exactMonthlyCost: description: Estimated monthly advertising spend for exact match targeting of this keyword. type: number format: double nullable: true example: 19041.6 paidCompetitors: description: Total number of unique advertisers observed purchasing ads for this keyword over the last 14 months, indicating competitive intensity. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: List of domain names that have purchased ads for this keyword over the last 14 months. type: array items: type: string nullable: true example: - example.com - competitor1.com - competitor2.com rankingHomepages: description: Number of domain homepages (root URLs) ranking within the first 100 organic search results for this keyword. 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 description: Represents a competitive keyword with comprehensive metrics including search volume, competition analysis, cost data, and SERP characteristics for competitive intelligence analysis. readOnly: true nullable: true additionalProperties: false '400': description: Bad Request - Invalid parameters provided (e.g., malformed domain list, invalid boolean values, or invalid country code) '401': description: Unauthorized - Invalid API credentials or insufficient permissions to access Kombat keyword data '500': description: Internal Server Error - A server-side error occurred while processing the request tags: - Kombat API /v2/kombat/getCompetingSeoKeywords: get: operationId: KombatApi_GetCompetingSeoKeywords_GET summary: Get Competing SEO Keywords description: 'Returns organic search keywords shared across multiple competitor domains. The process selects keywords from the includedDomains, then removes any keywords that belong to domains in the excludedDomains list. [Visualize this API live on SpyFu](https://www.spyfu.com/kombat?query=example.com,example.org)' parameters: - name: includeDomainsCsv in: query description: CSV list of domains to include in results required: true schema: type: string example: domain.com,anotherdomain.com example: domain.com,anotherdomain.com - name: excludeDomainsCsv in: query description: CSV list of domains to exclude in results schema: type: string example: excludedomain.com example: excludedomain.com - name: isIntersection in: query description: Keywords (True:ALL/False:ANY) the domains contain. required: true schema: type: boolean default: true example: true example: true - 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: 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: 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: 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: 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: 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: onlyAdultKeywords in: query description: Only include adult keywords considered unsafe for work. schema: type: boolean default: false example: false example: false - name: pageSize in: query description: Number of rows of data to return. 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: SearchVolume 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 responses: '200': description: Successfully retrieved competing SEO keywords. Returns keyword data with search metrics, ranking difficulty, and competitive intelligence for multiple domain analysis. content: application/json: schema: description: Response wrapper containing competitive keyword analysis data showing keywords where multiple domains compete in the same search channel with pagination metadata. type: object properties: resultCount: description: Number of results returned type: integer format: int32 readOnly: true example: 100 totalMatchingResults: description: Total number of competitive keywords available that match the query criteria, including results not included in the current page. type: integer format: int64 readOnly: true example: 50000 results: description: Array of competitive keywords with detailed metrics showing overlap between multiple domains in either SEO or PPC search channels. type: array items: type: object properties: keyword: description: The keyword that shows competitive overlap between multiple domains in the same search channel. type: string nullable: true example: running shoes searchVolume: description: Estimated monthly search volume for this keyword based on Google search data across the selected country/region, blended from multiple sources for accuracy. type: integer format: int64 nullable: true example: 266000 liveSearchVolume: description: Adjusted search volume based on recent trends and real-time data, providing a more current estimate than historical averages. type: integer format: int64 nullable: true example: 82000 rankingDifficulty: description: SEO difficulty score (0-100) indicating how challenging it would be to rank organically for this keyword, with 100 being most difficult. type: integer format: int32 nullable: true example: 98 totalMonthlyClicks: description: Total estimated monthly clicks (both organic and paid) generated from search results for this keyword. type: integer format: int64 nullable: true example: 219000 percentMobileSearches: description: Percentage of searches for this keyword that originate from mobile devices (0.0-1.0). type: number format: double nullable: true example: 0.52 percentDesktopSearches: description: Percentage of searches for this keyword that originate from desktop devices (0.0-1.0). type: number format: double nullable: true example: 0.48 percentSearchesNotClicked: description: Percentage of searches where users leave the SERP without clicking any result, often due to sufficient information in featured snippets or direct answers (0.0-1.0). type: number format: double nullable: true example: 0.18 percentPaidClicks: description: Percentage of total SERP clicks that go to paid ad results (0.0-1.0). type: number format: double nullable: true example: 0.52 percentOrganicClicks: description: Percentage of total SERP clicks that go to organic search results (0.0-1.0). type: number format: double nullable: true example: 0.48 broadCostPerClick: description: Average cost-per-click for broad match keyword targeting, representing what advertisers typically pay when their ads are triggered by related keywords. type: number format: double nullable: true example: 0.73 phraseCostPerClick: description: Average cost-per-click for phrase match keyword targeting, where ads show for searches that include the keyword phrase in the same order. type: number format: double nullable: true example: 0.67 exactCostPerClick: description: Average cost-per-click for exact match keyword targeting, the most precise and typically highest-performing match type. type: number format: double nullable: true example: 0.65 broadMonthlyClicks: description: Estimated monthly paid clicks for broad match targeting of this keyword. type: number format: float nullable: true example: 57019.8 phraseMonthlyClicks: description: Estimated monthly paid clicks for phrase match targeting of this keyword. type: number format: float nullable: true example: 38000 exactMonthlyClicks: description: Estimated monthly paid clicks for exact match targeting of this keyword. type: number format: float nullable: true example: 29094.6 broadMonthlyCost: description: Estimated monthly advertising spend for broad match targeting of this keyword. type: number format: double nullable: true example: 41604.9 phraseMonthlyCost: description: Estimated monthly advertising spend for phrase match targeting of this keyword. type: number format: double nullable: true example: 25542 exactMonthlyCost: description: Estimated monthly advertising spend for exact match targeting of this keyword. type: number format: double nullable: true example: 19041.6 paidCompetitors: description: Total number of unique advertisers observed purchasing ads for this keyword over the last 14 months, indicating competitive intensity. type: integer format: int32 nullable: true example: 15 distinctCompetitors: description: List of domain names that have purchased ads for this keyword over the last 14 months. type: array items: type: string nullable: true example: - example.com - competitor1.com - competitor2.com rankingHomepages: description: Number of domain homepages (root URLs) ranking within the first 100 organic search results for this keyword. 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 description: Represents a competitive keyword with comprehensive metrics including search volume, competition analysis, cost data, and SERP characteristics for competitive intelligence analysis. readOnly: true nullable: true additionalProperties: false '400': description: Bad Request - Invalid parameters provided (e.g., malformed domain list, invalid boolean values, or invalid country code) '401': description: Unauthorized - Invalid API credentials or insufficient permissions to access Kombat keyword data '500': description: Internal Server Error - A server-side error occurred while processing the request tags: - Kombat 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