Use it in your app
catalog is now an ordinary searchable list. You query it like any other — the feed
keeping it fresh is invisible from here.
With the client library
@searchstack/public-api is a typed client for the whole search API:
npm install @searchstack/public-api
import { SearchStackClient, fieldText, fieldNumber } from '@searchstack/public-api'
const client = new SearchStackClient({
apiKey: 'YOUR_SEARCH_KEY',
baseUrl: 'https://api.searchstack.dev',
})
const result = await client.Search.searchList('Demo', 'catalog', 1, {
query: 'warm jacket for winter',
filter: "brand eq 'Kestrel' and in_stock eq true",
size: 10,
})
// every method returns a Response envelope instead of throwing
if (result.isSuccess) {
for (const hit of result.toSuccess().results) {
// a facet always comes back as an array — these readers hand you the values,
// whether the field holds one or several
render(hit.name, fieldText(hit, 'description'), fieldNumber(hit, 'price'))
}
}
Because the manifest marked description as vectorised, that query matches by meaning —
“warm jacket for winter” finds the down jacket even though those words aren't in its text
— and the brand/in_stock filter narrows it in the same call.
Or plain HTTPS
The client is a convenience over ordinary requests, so any language works:
POST https://api.searchstack.dev/search/Demo/catalog/1
X-API-Key: {your key}
Content-Type: application/json
{ "query": "warm jacket for winter", "filter": "brand eq 'Kestrel' and in_stock eq true", "size": 10 }
The same list is reachable over MCP, so an agent can search your synced data from the one key-scoped setup.
Go deeper: The search API — queries, filters and paging in the reference.