Skip to main content

Query Suggestions

The Query Suggestions API provides autocomplete functionality for your search interface, including suggestions, categories, facets, filtered tabs, and dropdown recommendations.

Basic Usage​

By default getSuggestions() returns an array of suggestion hits. Use returnFullResponse: true to get the full response with extensions (dropdown recommendations, filtered_tabs).

const suggestions = await client.getSuggestions('lap', {
hitsPerPage: 5,
});

console.log(suggestions);
// ['laptop', 'laptop bag', 'laptop stand', 'laptop sleeve', 'laptop charger']

Options Reference​

OptionTypeDefaultDescription
hitsPerPagenumber5Number of suggestions to return
pagenumber0Page number (zero-indexed)
analytics_tagsstring | string[]-Tags for analytics
tags_match_mode'any' | 'all''any'How to match tags
include_categoriesbooleanfalseInclude category suggestions
include_facetsbooleanfalseInclude facet suggestions
max_categoriesnumber3Max categories to return
max_facetsnumber5Max facets to return
min_popularitynumber1Minimum popularity threshold
time_range'7d' | '30d' | '90d''30d'Time range for suggestions
disable_typo_tolerancebooleanfalseDisable typo tolerance
include_dropdown_recommendationsbooleanfalseInclude rich recommendations
include_dropdown_product_listbooleantrueInclude product hits in dropdown
include_filtered_tabsbooleantrueInclude filtered tab results
include_empty_query_recommendationsbooleanfalseTrending suggestions for empty query
filtered_tabsFilteredTab[]-Tab definitions sent in request
returnFullResponsebooleanfalseReturn full response with extensions

Simple Suggestions​

Get a list of query suggestions as strings:

const suggestions = await client.getSuggestions('laptop', {
hitsPerPage: 10,
});
// Returns: string[]

Suggestions with Categories and Facets​

Include category and facet suggestions for richer autocomplete:

const suggestions = await client.getSuggestions('laptop', {
hitsPerPage: 10,
include_categories: true,
include_facets: true,
max_categories: 5,
max_facets: 5,
});

Get rich dropdown recommendations including trending searches, top searches, related searches, and popular brands:

import { QuerySuggestionsFullResponse } from '@seekora-ai/search-sdk';

const response = await client.getSuggestions('lap', {
include_dropdown_recommendations: true,
returnFullResponse: true,
}) as QuerySuggestionsFullResponse;

console.log('Suggestions:', response.suggestions);
console.log('Trending:', response.extensions?.trending_searches);
console.log('Top Searches:', response.extensions?.top_searches);
console.log('Related:', response.extensions?.related_searches);
console.log('Popular Brands:', response.extensions?.popular_brands);

Full Response Structure​

interface QuerySuggestionsFullResponse {
suggestions: any[]; // Suggestion hits
results?: any[]; // Full results array (first = suggestions, second = extensions)
extensions?: {
trending_searches?: any[]; // Trending search queries
top_searches?: any[]; // Top search queries
related_searches?: any[]; // Related search queries
popular_brands?: any[]; // Popular brands
filtered_tabs?: any[]; // Filtered tabs with products
};
raw?: any; // Raw API response
}

Filtered Tabs​

Filtered tabs let you show categorized result groups (e.g., "All", "Clothing", "Accessories") alongside suggestions. You can send tab definitions directly in the request — no pre-configuration needed.

const response = await client.getSuggestions('laptop', {
include_filtered_tabs: true,
filtered_tabs: [
{ id: 'all', label: 'All', enabled: true, limit: 4 },
{ id: 'electronics', label: 'Electronics', enabled: true, limit: 4, filters: { category: 'Electronics' } },
{ id: 'accessories', label: 'Accessories', enabled: true, limit: 4, filters: { category: 'Accessories' } },
{ id: 'sale', label: 'On Sale', enabled: true, limit: 4, filters: { on_sale: 'true' } },
],
returnFullResponse: true,
}) as QuerySuggestionsFullResponse;

// Each tab has its products and count
response.extensions?.filtered_tabs?.forEach(tab => {
console.log(`${tab.label}: ${tab.nb_hits} results, ${tab.products.length} shown`);
});

FilteredTab Interface​

// Request tab definition
interface FilteredTab {
id?: string; // Unique tab identifier
label: string; // Display label
enabled?: boolean; // Whether tab is active (default true)
limit?: number; // Max products per tab
filters?: Record<string, string>; // Key-value filter criteria
}

// Response tab data
interface FilteredTabResponse {
id: string;
label: string;
products: Array<{
id: string;
title: string;
url: string;
metadata: Record<string, any>;
}>;
nb_hits: number;
processing_time_ms: number;
}

Suggestions Defaults​

Set default options for all getSuggestions() calls when initializing the client. Per-call options override these defaults.

const client = new SeekoraClient({
storeId: 'your-store-id',
readSecret: 'your-read-secret',
suggestionsDefaults: {
hitsPerPage: 8,
include_dropdown_recommendations: true,
include_dropdown_product_list: true,
include_filtered_tabs: true,
time_range: '7d',
},
});

// These calls automatically use the defaults above
const simple = await client.getSuggestions('lap');
const full = await client.getSuggestions('lap', { returnFullResponse: true });

Empty Query Suggestions​

Show trending or popular suggestions when the search box is empty or first focused:

const trending = await client.getSuggestions('', {
include_empty_query_recommendations: true,
include_filtered_tabs: true,
filtered_tabs: [
{ id: 'trending', label: 'Trending', enabled: true, limit: 8 },
],
returnFullResponse: true,
}) as QuerySuggestionsFullResponse;

Time-based Suggestions​

Get suggestions based on recent popularity:

// Last 7 days — freshest suggestions for fast-moving inventory
const recentSuggestions = await client.getSuggestions('laptop', {
time_range: '7d',
hitsPerPage: 10,
});

// Last 30 days (default)
const monthlySuggestions = await client.getSuggestions('laptop', {
time_range: '30d',
hitsPerPage: 10,
});

// Last 90 days — broadest coverage
const quarterlySuggestions = await client.getSuggestions('laptop', {
time_range: '90d',
hitsPerPage: 10,
});

Popularity Threshold​

Filter suggestions by minimum popularity:

const popularSuggestions = await client.getSuggestions('laptop', {
min_popularity: 10, // Only show suggestions with 10+ searches
hitsPerPage: 10,
});

Complete Example​

Here's a complete example of implementing a rich autocomplete dropdown:

import { SeekoraClient, QuerySuggestionsFullResponse } from '@seekora-ai/search-sdk';

const client = new SeekoraClient({
storeId: 'your-store-id',
readSecret: 'your-read-secret',
suggestionsDefaults: {
include_dropdown_recommendations: true,
include_filtered_tabs: true,
},
});

async function getAutocompleteData(query: string) {
// Don't fetch for very short queries
if (query.length < 2) {
return null;
}

const response = await client.getSuggestions(query, {
hitsPerPage: 8,
include_categories: true,
filtered_tabs: [
{ id: 'all', label: 'All', enabled: true, limit: 4 },
{ id: 'products', label: 'Products', enabled: true, limit: 4, filters: { type: 'product' } },
{ id: 'categories', label: 'Categories', enabled: true, limit: 4, filters: { type: 'category' } },
],
returnFullResponse: true,
}) as QuerySuggestionsFullResponse;

return {
suggestions: response.suggestions,
trending: response.extensions?.trending_searches || [],
related: response.extensions?.related_searches || [],
tabs: response.extensions?.filtered_tabs || [],
};
}

// React example usage
function SearchInput() {
const [query, setQuery] = useState('');
const [autocomplete, setAutocomplete] = useState(null);

useEffect(() => {
const timer = setTimeout(async () => {
const data = await getAutocompleteData(query);
setAutocomplete(data);
}, 300); // Debounce

return () => clearTimeout(timer);
}, [query]);

return (
<div>
<input
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Search..."
/>
{autocomplete && (
<div className="dropdown">
{/* Render suggestions, trending, tabs, etc. */}
</div>
)}
</div>
);
}

Configuration​

You can configure query suggestions at the store level:

// Get current configuration
const config = await client.getSuggestionsConfig();
console.log('Max suggestions:', config.max_suggestions);
console.log('Minimum letters:', config.minimum_letters);

// Update configuration (requires write secret)
await client.updateQuerySuggestionsConfig({
enabled: true,
max_suggestions: 20,
minimum_letters: 2,
enable_personalization: false,
});

Next Steps​

  • Analytics - Track suggestion interactions
  • UI SDK - Pre-built suggestion components