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
| Parameter | Type | Description |
|---|---|---|
| locale | string | Language code (default: 'en') |
| country | string | Country code (default: 'us') |
| alphabetExpansion | boolean | Expand with A-Z suffixes |
| questionKeywords | boolean | Add 'how to', 'what is', etc. prefixes |
| prepositionKeywords | boolean | Add 'for', 'vs', 'with', etc. suffixes |
| timeout | number | Request 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.