SDK

Keywords

Discover keyword opportunities and find content gaps. No API key required.

researchKeywords(seed, options?)

Discover keywords via Google Autocomplete. Expands your seed keyword into suggestions, questions, and long-tail variations.

Basic usagetypescript
import { researchKeywords } from 'indxel'

const result = await researchKeywords('nextjs seo', {
  locale: 'en',
  country: 'us',
  alphabetExpansion: true,   // 'nextjs seo a', 'nextjs seo b', ...
  questionKeywords: true,    // 'how to nextjs seo', 'what is nextjs seo', ...
  prepositionKeywords: true, // 'nextjs seo for', 'nextjs seo vs', ...
  timeout: 5000,
})

console.log(result.totalKeywords) // e.g. 87
console.log(result.suggestions)   // [{ keyword: 'nextjs seo best practices', source: 'autocomplete' }]
console.log(result.questions)     // [{ keyword: 'how to improve nextjs seo', source: 'question' }]
console.log(result.longTail)      // [{ keyword: 'nextjs seo vs gatsby seo', source: 'preposition' }]

Options

ParameterTypeDescription
localestringLanguage code (default: 'en')
countrystringCountry code (default: 'us')
alphabetExpansionbooleanExpand with A-Z suffixes
questionKeywordsbooleanAdd 'how to', 'what is', etc. prefixes
prepositionKeywordsbooleanAdd 'for', 'vs', 'with', etc. suffixes
timeoutnumberRequest timeout in milliseconds

Result

KeywordResearchResulttypescript
type KeywordResearchResult = {
  seed: string
  suggestions: KeywordSuggestion[]   // Direct autocomplete matches
  questions: KeywordSuggestion[]     // Question-format keywords
  longTail: KeywordSuggestion[]      // Alphabet + preposition expansions
  totalKeywords: number
}

type KeywordSuggestion = {
  keyword: string
  source: 'autocomplete' | 'question' | 'alphabet' | 'preposition'
}

No API key needed

This uses Google Autocomplete, which is free and unlimited. No API key or billing required.

analyzeContentGaps(keywords, existingPages)

Compare discovered keywords against your existing pages. Find opportunities your content doesn't cover yet.

Usagetypescript
import { analyzeContentGaps, researchKeywords, crawlSite } from 'indxel'

// 1. Get keywords
const keywords = await researchKeywords('nextjs seo')

// 2. Crawl your site
const crawl = await crawlSite('https://mysite.com')

// 3. Find gaps
const gaps = analyzeContentGaps(
  keywords.suggestions,
  crawl.pages.map(p => ({ url: p.url, title: p.metadata.title }))
)

console.log(gaps.coveragePercent)  // 45
console.log(gaps.totalGaps)        // 48
console.log(gaps.gaps[0])
// {
//   keyword: 'nextjs seo best practices',
//   source: 'autocomplete',
//   relevance: 'high',
//   suggestedType: 'blog',
//   suggestedPath: '/blog/nextjs-seo-best-practices'
// }

Result

ContentGapResulttypescript
type ContentGapResult = {
  covered: CoveredKeyword[]   // Keywords your content already covers
  gaps: ContentGap[]          // Keywords you're missing
  totalKeywords: number
  totalCovered: number
  totalGaps: number
  coveragePercent: number     // 0-100
}

type ContentGap = {
  keyword: string
  source: string
  relevance: 'high' | 'medium' | 'low'
  suggestedType: 'landing' | 'blog' | 'faq' | 'comparison' | 'guide'
  suggestedPath: string       // Auto-generated URL suggestion
}

Suggested types

The suggestedType is inferred from the keyword pattern. Questions become FAQ or guide pages. "vs" keywords become comparison pages.