Get search settings
The store's public instant-search settings for one locale: autocomplete limits and timing,
appearance, overlay, voice and analytics switches, and the localised placeholder and
no-results text. meta.version changes on every settings save (clear any suggestion cache
then). Cache it for 60 s; revalidate with If-None-Match for a bodyless 304.
tenantKeyX-Tenant-Key<token>The public store key (pk_live_…). Required on every call.
locale?|A store language code as listed in data.locales[].code (e.g. en, fr). Missing or unknown: the store default.
length <= 35X-Client-IP?stringOptional. IP address of the shopper (one IPv4/IPv6, no port, no list). Honoured only together with a valid X-Tenant-Secret; ignored otherwise. Used for rate limits and recorded with form submissions.
X-Tenant-Secret?stringOptional here. Server secret of the store: server-to-server only, never from a browser. Enables X-Client-IP.
If-None-Match?stringOptional. The ETag of an answer you already hold. While it is still current the answer is 304 Not Modified with no body (the ETag and Cache-Control headers are repeated); otherwise a normal 200 with the new ETag.
Success.
application/json- response
data*meta*curl -X GET 'https://api.elaraone.app/api/v1/search/config?locale=en' \ -H 'X-Tenant-Key: pk_live_…' \ -H 'X-Tenant-Secret: your-server-secret'{ "data": { "enabled": true, "autocomplete": { "enabled": true, "min_chars": 0, "debounce_ms": 0, "types": [ { "type": "products", "limit": 0 } ], "view_all": true, "popular_searches": [ "string" ] }, "results": { "per_page": 0, "update_as_you_type": true }, "appearance": { "layout": "list", "image": { "enabled": true, "size": "small" }, "price": true, "price_from_prefix": true, "short_description": true, "sku": true, "brand": true, "stock_badge": true, "details_panel": true, "highlight": true, "colors": { "inherit": true, "accent": "string", "background": "string", "text": "string", "muted": "string", "highlight": "string", "border": "string" }, "mobile_fullscreen": { "enabled": true, "breakpoint": 0 } }, "overlay": { "enabled": true, "opacity": 0, "color": "string" }, "voice": { "enabled": true, "lang": "string" }, "analytics": { "beacon": true, "ga4": { "enabled": true, "impressions": true } }, "locale": "string", "locales": [ { "code": "string", "name": "string", "default": true } ], "placeholder": "string", "no_results_text": "string" }, "meta": { "version": 0, "locale": "string" }}Get search suggestions GET
Grouped suggestions for the typed query: products, collections, brands, tags, CMS pages and posts (only the groups asked for in `types` that the store has enabled, each with its merchant limit). `*_html` fields are escaped text plus `<mark>`/`</mark>` only. Below the store's `min_chars` the answer is 200 with empty groups; with search switched off it is 200 with no groups and `meta.search_engine: "disabled"`. When Meilisearch is unavailable the answer is still 200: products from the database, the other groups empty, `meta.search_engine: "database"`, `Cache-Control: no-store, private` (never cached). A searched answer carries `X-Search-Total` (products total) and a fresh `X-Search-Id` (ULID) for the search beacons, even when served from the response cache (kept 300 s, dropped on every index write).
Record search events POST
Reports, in batches of 1–20, what the shopper did with search answers: `settled` (a suggest answer they stopped at: it becomes a counted search), `click` and `add_to_cart`. Each event names the answer by its `X-Search-Id`; the engine takes the query and the totals from its own 15-minute record of that answer, so the client never sends query text, counts or anything personal. Events for an unknown or expired search id, a repeated `settled`, a `settled` for a results page, or a click on something the answer cannot have shown are dropped silently: every well-formed batch is `202`. Never retry a failed beacon.