---
updatedAt: 2025-08-09T21:26:23.000Z
agentTools:
  projectIndex: https://developer.spyfu.com/llms.txt
---

# Get Transactional Keywords

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)

# OpenAPI definition

```json
{
  "openapi": "3.1.0",
  "info": {
    "title": "Keyword API",
    "version": "v2",
    "description": "Expand your keyword portfolio through semantic keyword discovery, related term analysis, and comprehensive keyword intelligence to uncover hidden opportunities and optimize content strategy. Powered by SpyFu's extensive keyword database spanning 18 years of search intelligence across global markets.\n\nSpyFu's Related Keywords API analyzes **8 billion keywords** with comprehensive semantic relationships and performance metrics, built on a foundation of **1.6 trillion search results** and **1.6 billion keywords** tracked live in SERPs globally. Our database provides **20x more paid keywords per domain** and **2x more organic keywords per domain** than SEMRush or Ahrefs. **Every keyword relationship updates every 15 seconds**, ensuring you have real-time semantic intelligence across all 28 supported countries.\n\nWhile competitors provide basic related keyword suggestions, SpyFu delivers comprehensive semantic keyword analysis with 18 years of historical data and live updates every 15 seconds. Our advanced algorithms identify question keywords, transactional intent terms, and competitive keyword relationships to reveal complete keyword ecosystems.\n\nWith this API, you can discover semantically related keywords with performance insights, identify question-based keywords for content optimization, uncover transactional intent keywords for conversion optimization, find keywords that competitors rank for and advertise on, access comprehensive keyword information including search volume and competition metrics, and expand keyword portfolios through intelligent semantic analysis. Build comprehensive keyword strategies based on real search behavior and competitive intelligence.\n\nThe Related Keywords API integrates seamlessly with SpyFu's SEO Research, Ad History, and Competitors APIs to provide complete keyword intelligence, enabling you to combine semantic discovery with competitive analysis and performance tracking.\n\nGet started with comprehensive API documentation and interactive examples at [SpyFu Developer Portal](https://developer.spyfu.com)."
  },
  "servers": [
    {
      "url": "https://api.spyfu.com/apis/keyword_api"
    }
  ],
  "paths": {
    "/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.\n\n[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",
              "examples": [
                "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",
              "examples": [
                "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",
              "examples": [
                false
              ],
              "default": false
            }
          },
          {
            "name": "excludeTerms",
            "in": "query",
            "description": "Comma-separated list of terms to exclude from results (e.g., branded or irrelevant terms).",
            "schema": {
              "type": "string",
              "examples": [
                "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",
              "examples": [
                "Broad"
              ],
              "enum": [
                "Broad",
                "Exact",
                "Phrase"
              ]
            },
            "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",
              "examples": [
                false
              ],
              "default": false
            },
            "example": false
          },
          {
            "name": "isTransactionalIntent",
            "in": "query",
            "description": "Filter on if the keyword has transactional intent.",
            "schema": {
              "type": "boolean",
              "examples": [
                false
              ],
              "default": 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",
              "examples": [
                "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.\nSome 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.\nSome 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",
              "examples": [
                "Broad"
              ],
              "enum": [
                "Broad",
                "Exact",
                "Phrase"
              ]
            },
            "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",
              "examples": [
                5
              ],
              "default": 5,
              "maximum": 10000,
              "minimum": 1
            },
            "example": 5
          },
          {
            "name": "countryCode",
            "in": "query",
            "description": "Country to get results for.",
            "schema": {
              "type": "string",
              "examples": [
                "US"
              ],
              "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"
          },
          {
            "name": "sortBy",
            "in": "query",
            "description": "Column to sort by.",
            "schema": {
              "type": "string",
              "examples": [
                "SearchVolume"
              ],
              "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"
          },
          {
            "name": "sortOrder",
            "in": "query",
            "description": "Order to sort the results.",
            "schema": {
              "type": "string",
              "examples": [
                "Descending"
              ],
              "default": "Descending",
              "enum": [
                "Ascending",
                "Descending"
              ]
            },
            "example": "Descending"
          },
          {
            "name": "startingRow",
            "in": "query",
            "description": "Row number to start the results with.",
            "schema": {
              "type": "integer",
              "format": "int32",
              "examples": [
                1
              ],
              "default": 1,
              "maximum": 10000,
              "minimum": 1
            },
            "example": 1
          },
          {
            "name": "adultFilter",
            "in": "query",
            "description": "Exclude adult keywords considered unsafe for work.",
            "schema": {
              "type": "boolean",
              "examples": [
                true
              ],
              "default": true
            },
            "example": true
          },
          {
            "name": "onlyAdultKeywords",
            "in": "query",
            "description": "Only include adult keywords considered unsafe for work.",
            "schema": {
              "type": "boolean",
              "examples": [
                false
              ],
              "default": 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",
                      "examples": [
                        100
                      ],
                      "readOnly": true
                    },
                    "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",
                        "null"
                      ],
                      "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",
                              "null"
                            ],
                            "examples": [
                              "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",
                              "null"
                            ],
                            "format": "int64",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "int64",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "int32",
                            "examples": [
                              98
                            ]
                          },
                          "totalMonthlyClicks": {
                            "description": "This is the total number of all clicks (organic and paid) made on the SERP over the past month.",
                            "type": [
                              "integer",
                              "null"
                            ],
                            "format": "int64",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              0.52188635
                            ]
                          },
                          "percentOrganicClicks": {
                            "description": "Of all clicks made to this keyword's SERP, this percentage measures how many went to organic results.",
                            "type": [
                              "number",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              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<p>These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.</p>",
                            "type": [
                              "number",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              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<p>These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.</p>",
                            "type": [
                              "number",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              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<p>These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.</p>",
                            "type": [
                              "number",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "float",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "float",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "float",
                            "examples": [
                              29094.6
                            ]
                          },
                          "broadMonthlyCost": {
                            "description": "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n<p>These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.</p>",
                            "type": [
                              "number",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              41604.9
                            ]
                          },
                          "phraseMonthlyCost": {
                            "description": "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n<p>These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.</p>",
                            "type": [
                              "number",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              25542
                            ]
                          },
                          "exactMonthlyCost": {
                            "description": "Our estimate of what an advertiser would spend, on average, to advertise on this keyword each month.\r\n<p>These costs can vary depending on how specific (exact match vs. phrase match vs. broad match) the search is.</p>",
                            "type": [
                              "number",
                              "null"
                            ],
                            "format": "double",
                            "examples": [
                              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",
                              "null"
                            ],
                            "format": "int32",
                            "examples": [
                              15
                            ]
                          },
                          "distinctCompetitors": {
                            "description": "This is the list of distinct advertisers we've seen over the last 14 months for this keyword.",
                            "type": [
                              "array",
                              "null"
                            ],
                            "items": {
                              "type": "string"
                            }
                          },
                          "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",
                              "null"
                            ],
                            "format": "int32",
                            "examples": [
                              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",
                              "null"
                            ],
                            "examples": [
                              "Images,Maps"
                            ]
                          },
                          "serpFirstResult": {
                            "description": "Domain name of the top-ranking organic result for this keyword, useful for identifying category leaders.",
                            "type": [
                              "string",
                              "null"
                            ],
                            "examples": [
                              "example.com"
                            ]
                          },
                          "isQuestion": {
                            "description": "Indicates whether this keyword is phrased as a question (who, what, when, where, why, how).",
                            "type": "boolean",
                            "examples": [
                              false
                            ]
                          },
                          "isNotSafeForWork": {
                            "description": "Indicates whether this keyword is flagged as containing adult or inappropriate content.",
                            "type": "boolean",
                            "examples": [
                              false
                            ]
                          }
                        },
                        "additionalProperties": false
                      },
                      "readOnly": 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"
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "Basic_Authentication_Token": {
        "type": "http",
        "description": "<a href=\"https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side\" target=\"_blank\">Basic Authentication</a> is a standard that involves encoding your <code>SPYFU_API_ID:SECRET_KEY</code> into a Base64 string. Your <b>SpyFu API ID</b> and <b>Secret Key</b> can both be found under the <b><a href=\"https://www.spyfu.com/account/api\" target=\"_blank\">Account Settings -> API Usage</a></b> page. Additionally, you can find the Base64 string has been pre-generated on the same page under <b>Base 64 Key</b>. Finally, this encoded string is sent in the \"Authorization\" header prefixed with the keyword \"Basic\":<br>For example, to authorize as <code>00000000-0000-0000-0000-000000000000:AB12WXYZ</code> the client would send<br><pre><code>Authorization: <span class=\"token keyword\">Basic</span> <span class=\"token constructor-invocation class-name\">MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwOkFCMTJXWFla<span></code></pre>",
        "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 <b><a href=\"https://www.spyfu.com/account/api\" target=\"_blank\">Account Settings -> API Usage</a></b> page<br>For example, to authorize with the API key <code>AB12WXY</code><br><pre><code>/apis/example_api/GetExample?domain=spyfu.com<span class=\"token keyword\">&api_key=AB12WXYZ</span></code></pre>",
        "name": "api_key",
        "in": "query"
      },
      "HMAC_Authentication_Header": {
        "type": "apiKey",
        "description": "For even more security, each request can be individually authenticated with a timestamped <a href=\"https://en.wikipedia.org/wiki/HMAC\" target=\"_blank\"><b>HMAC</b></a> <em>(Hash Message Authentication Code)</em> signature. Composed of your secret key, a valid timestamp, the API request path, and all request parameters. <h3>Creating the signature:</h3><br>Combine the pieces that will be converted into the signature.<br><pre><code><span class=\"token keyword\">StringToSign</span> <span class=\"token operator\">=</span><br>&#x09;HTTP-Verb <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span> <span class=\"token operator\">+</span><br>&#x09;Timestamp <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span> <span class=\"token operator\">+</span><br>&#x09;UrlPath <span class=\"token operator\">+</span> <span class=\"token string\">\"\\n\"</span><br>&#x09;QueryParameters<span class=\"token operator\">;</span><br></code></pre><br>Create UTF-8 encodings of the above string and of your secret key.<br><pre><code><span class=\"token keyword\">byte</span><span class=\"token operator\">[]</span> SecretKeyBytes <span class=\"token operator\">=</span> <span class=\"token function\">UTF-8-Encoding-Of</span><span class=\"token operator\">(</span> Upper-Case-Of<span class=\"token operator\">(</span> SECRET_KEY <span class=\"token operator\">)</span> <span class=\"token operator\">)</span><span class=\"token operator\">;</span><br><span class=\"token keyword\">byte</span><span class=\"token operator\">[]</span> StringToSignBytes <span class=\"token operator\">=</span> <span class=\"token function\">UTF-8-Encoding-Of</span><span class=\"token operator\">(</span> StringToSign <span class=\"token operator\">)</span><span class=\"token operator\">;</span><br></code></pre><br>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.<br><pre><code><span class=\"token keyword\">Signature</span> <span class=\"token operator\">=</span> <span class=\"token function\">Base64</span><span class=\"token operator\">(</span> <span class=\"token function\">HMAC-SHA256</span><span class=\"token operator\">(</span> SecretKeyBytes, StringToSignBytes <span class=\"token operator\">)</span> <span class=\"token operator\">)</span><span class=\"token operator\">;</span><br></code></pre><br><h3>Using the signature:</h3><br>This signature is then sent in through an Authentication header with your username.<br><pre><code>Authentication<span class=\"token operator\">:</span> <span class=\"token keyword\">UserName</span><span class=\"token operator\">:</span><span class=\"token invocation class-name\">Signature</span></code></pre>",
        "name": "Authentication",
        "in": "header"
      }
    }
  },
  "security": [
    {
      "Basic_Authentication_Token": []
    },
    {
      "Query_Parameter_Token": []
    },
    {
      "HMAC_Authentication_Header": []
    }
  ]
}
```