Skip to main content

Prepare/Execute Flow

const search = sdk.search()

// Prepare caches expensive operations
await search.prepare({ query: 'ring' })

// Execute retrieves results using cached data
await search.execute({ query: 'ring' })
You can perform any operations between prepare and execute:
// Immediate execution
await search.prepare({ query: 'ring' })
await search.execute({ query: 'ring' })

// User interaction in between
await search.prepare({ query: 'ring' })
// User adjusts filters, changes sort order, etc.
await search.execute({ query: 'ring', filters: { color: 'Gold' } })

// Navigation in between
await search.prepare({ query: 'ring' })
// User navigates to different page, browser action, etc.
await search.execute({ query: 'ring', page: 2 })

// Multiple executions from one prepare
await search.prepare({ query: 'ring' })
await search.execute({ query: 'ring', page: 1 })
await search.execute({ query: 'ring', page: 2 })

Passing Search IDs Between Pages

The search_id returned from prepare is valid for 15 minutes and can be reused across page navigations.
// On search page - prepare search
const search = sdk.search()
const prepareResult = await search.prepare({ 
  query: 'ring',
  dynamicLinking: { products: ['gold-ring', 'silver-ring'] }
})

// Store search_id for navigation
const searchId = prepareResult.data?.searchId
sessionStorage.setItem('current_search_id', searchId)

// Navigate to results page
window.location.href = `/search?q=ring&sid=${searchId}`

// On results page - retrieve and use search_id
const urlParams = new URLSearchParams(window.location.search)
const searchId = urlParams.get('sid')

// Create new search controller and execute with search_id
const search = sdk.search()
await search.execute({ 
  query: 'ring',
  params: {
    search_id: searchId
  }
})
Passing search IDs ensures consistent ranking, preserved merchandising rules, accurate analytics, and reduced server load.

Concurrent API Calls

Call prepare and autocomplete concurrently for search-as-you-type:
const search = sdk.search()
const autocomplete = sdk.autocomplete()

const [prepareResult, autocompleteResult] = await Promise.all([
  search.prepare({ query: 'ring' }),
  autocomplete.execute('ring')
])

if (autocompleteResult.data) {
  renderSuggestions(autocompleteResult.data.matchedQueries)
}

const searchResult = await search.execute({ query: 'ring' })

Next Steps