[{"data":1,"prerenderedAt":1435},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Fanalytics\u002Fsearch-analytics":331,"docs-\u002Fdocs\u002Fanalytics\u002Fsearch-analytics-surround":1432},[4],{"title":5,"path":6,"stem":7,"children":8,"page":46},"Docs","\u002Fdocs","docs",[9,47,72,90,132,198,241,252,276,301],{"title":10,"description":11,"icon":12,"path":13,"stem":14,"children":15,"page":46},"Getting started","What Zaproo Search is, a quickstart, and wiring search into a storefront.","i-lucide-rocket","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started",[16,22,28,34,40],{"title":17,"path":18,"stem":19,"description":20,"icon":21},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F1.getting-started\u002F1.introduction","What Zaproo Search is, the five things you work with, and how a product catalog becomes a search box on your shop.","i-lucide-book-open-text",{"title":23,"path":24,"stem":25,"description":26,"icon":27},"Quickstart","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F1.getting-started\u002F2.quickstart","Set up search for your shop in the cabinet, from a new account to a first search, with the API and MCP as other ways to do the same.","i-lucide-zap",{"title":29,"path":30,"stem":31,"description":32,"icon":33},"Integrate a storefront","\u002Fdocs\u002Fgetting-started\u002Fstorefront","docs\u002F1.getting-started\u002F3.storefront","Build a search results page with facets and an autocomplete box on top of the search and suggest routes.","i-lucide-store",{"title":35,"path":36,"stem":37,"description":38,"icon":39},"JavaScript SDK","\u002Fdocs\u002Fgetting-started\u002Fjavascript-sdk","docs\u002F1.getting-started\u002F4.javascript-sdk","Search, autocomplete and event tracking from a storefront with one small client that runs in the browser, on your server and in edge functions.","i-lucide-braces",{"title":41,"path":42,"stem":43,"description":44,"icon":45},"AI shopping assistant","\u002Fdocs\u002Fgetting-started\u002Fai-assistant","docs\u002F1.getting-started\u002F5.ai-assistant","A chat widget for your storefront that finds products and answers questions from your indexes.","i-lucide-sparkles",false,{"title":48,"description":49,"icon":50,"path":51,"stem":52,"children":53,"page":46},"Account and team","Sign-in, sessions, organizations, members, roles and projects.","i-lucide-users","\u002Fdocs\u002Faccount","docs\u002F2.account",[54,60,66],{"title":55,"path":56,"stem":57,"description":58,"icon":59},"Account and sign-in","\u002Fdocs\u002Faccount\u002Fsign-in","docs\u002F2.account\u002F1.sign-in","Create an account, verify your email, stay signed in, manage signed-in devices and change or reset your password.","i-lucide-log-in",{"title":61,"path":62,"stem":63,"description":64,"icon":65},"Organizations, members and roles","\u002Fdocs\u002Faccount\u002Forganizations","docs\u002F2.account\u002F2.organizations","What an organization holds, how to add members, and what owners, admins and members may do.","i-lucide-building-2",{"title":67,"path":68,"stem":69,"description":70,"icon":71},"Projects","\u002Fdocs\u002Faccount\u002Fprojects","docs\u002F2.account\u002F3.projects","Group the indices and API keys of one shop or one environment, and keep staging apart from production.","i-lucide-folder-kanban",{"title":73,"description":74,"icon":75,"path":76,"stem":77,"children":78,"page":46},"API keys and security","Secret and public keys, scopes, allowed origins, rate limits and errors.","i-lucide-key-round","\u002Fdocs\u002Fkeys","docs\u002F3.keys",[79,84],{"title":80,"path":81,"stem":82,"description":83,"icon":75},"API keys","\u002Fdocs\u002Fkeys\u002Fapi-keys","docs\u002F3.keys\u002F1.api-keys","Secret and public keys, full and read access, index scope, allowed origins, expiry, and how to revoke a key.",{"title":85,"path":86,"stem":87,"description":88,"icon":89},"Rate limits and errors","\u002Fdocs\u002Fkeys\u002Frate-limits","docs\u002F3.keys\u002F2.rate-limits","How many requests each route accepts per minute, what a 429 looks like, the error format and every error code with its HTTP status.","i-lucide-gauge",{"title":91,"description":92,"icon":93,"path":94,"stem":95,"children":96,"page":46},"Indexing","Indices, languages, mappings, documents, tasks, full catalog sync and reindexing.","i-lucide-database","\u002Fdocs\u002Findexing","docs\u002F4.indexing",[97,102,108,114,120,126],{"title":98,"path":99,"stem":100,"description":101,"icon":93},"Indices and languages","\u002Fdocs\u002Findexing\u002Findices","docs\u002F4.indexing\u002F1.indices","Create an index, pick its language, read its status, and change the language later with a reindex.",{"title":103,"path":104,"stem":105,"description":106,"icon":107},"Mapping and fields","\u002Fdocs\u002Findexing\u002Fmapping","docs\u002F4.indexing\u002F2.mapping","Field types, the five flags that decide what a field is used for, text analysis options, unmapped fields, and which changes need a reindex.","i-lucide-table-properties",{"title":109,"path":110,"stem":111,"description":112,"icon":113},"Documents and tasks","\u002Fdocs\u002Findexing\u002Fdocuments","docs\u002F4.indexing\u002F3.documents","Upload, browse and delete documents in the cabinet or through the API, follow each write as a task, and retry safely with Idempotency-Key.","i-lucide-file-json",{"title":115,"path":116,"stem":117,"description":118,"icon":119},"Full catalog sync","\u002Fdocs\u002Findexing\u002Ffull-sync","docs\u002F4.indexing\u002F4.full-sync","Replace the whole catalog with a replace session, so products missing from your export disappear from search, without downtime.","i-lucide-refresh-cw",{"title":121,"path":122,"stem":123,"description":124,"icon":125},"Reindex and versions","\u002Fdocs\u002Findexing\u002Fversions","docs\u002F4.indexing\u002F5.versions","Rebuild an index with its saved mapping and swap it in without downtime, follow or cancel the rebuild, and read activeVersion and buildingVersion.","i-lucide-git-compare-arrows",{"title":127,"path":128,"stem":129,"description":130,"icon":131},"Data source","\u002Fdocs\u002Findexing\u002Fdata-source","docs\u002F4.indexing\u002F6.data-source","Let Zaproo download your product feed on a schedule, map it to documents, write only what changed and delete what left the feed.","i-lucide-rss",{"title":133,"description":134,"icon":135,"path":136,"stem":137,"children":138,"page":46},"Integrations","Connect your shop. Magento 2, product feeds and the API work today; more platforms are coming.","i-lucide-plug-zap","\u002Fdocs\u002Fintegrations","docs\u002F4.integrations",[139,145,151,156,162,168,173,178,183,188,193],{"title":140,"path":141,"stem":142,"description":143,"icon":144},"Integrations overview","\u002Fdocs\u002Fintegrations\u002Foverview","docs\u002F4.integrations\u002F01.overview","The ways to get your catalog into Zaproo Search, which one to pick, and how a connected shop shows up in the cabinet.","i-lucide-layout-grid",{"title":146,"path":147,"stem":148,"description":149,"icon":150},"Magento 2","\u002Fdocs\u002Fintegrations\u002Fmagento","docs\u002F4.integrations\u002F02.magento","Install the Zaproo Search module for Magento 2, connect each store view to its own index, and keep the catalog in sync.","i-lucide-shopping-cart",{"title":152,"path":153,"stem":154,"description":155,"icon":131},"Product feed","\u002Fdocs\u002Fintegrations\u002Fproduct-feed","docs\u002F4.integrations\u002F03.product-feed","Connect any shop that can publish its catalog as a feed. You set it up in the cabinet, and Zaproo downloads the feed on a schedule and writes only what changed.",{"title":157,"path":158,"stem":159,"description":160,"icon":161},"REST API and MCP","\u002Fdocs\u002Fintegrations\u002Frest-api-and-mcp","docs\u002F4.integrations\u002F04.rest-api-and-mcp","Send documents from your own code with the REST API, or let an AI agent manage the index over MCP.","i-lucide-code",{"title":163,"path":164,"stem":165,"description":166,"icon":167},"Shopify","\u002Fdocs\u002Fintegrations\u002Fshopify","docs\u002F4.integrations\u002F05.shopify","A Zaproo Search integration for Shopify is coming soon. Until then, connect the shop through a product feed or the REST API.","i-lucide-shopping-bag",{"title":169,"path":170,"stem":171,"description":172,"icon":167},"WooCommerce","\u002Fdocs\u002Fintegrations\u002Fwoocommerce","docs\u002F4.integrations\u002F06.woocommerce","A Zaproo Search integration for WooCommerce is coming soon. Until then, connect the shop through a product feed or the REST API.",{"title":174,"path":175,"stem":176,"description":177,"icon":167},"Shopware","\u002Fdocs\u002Fintegrations\u002Fshopware","docs\u002F4.integrations\u002F07.shopware","A Zaproo Search integration for Shopware is coming soon. Until then, connect the shop through a product feed or the REST API.",{"title":179,"path":180,"stem":181,"description":182,"icon":167},"BigCommerce","\u002Fdocs\u002Fintegrations\u002Fbigcommerce","docs\u002F4.integrations\u002F08.bigcommerce","A Zaproo Search integration for BigCommerce is coming soon. Until then, connect the shop through a product feed or the REST API.",{"title":184,"path":185,"stem":186,"description":187,"icon":167},"PrestaShop","\u002Fdocs\u002Fintegrations\u002Fprestashop","docs\u002F4.integrations\u002F09.prestashop","A Zaproo Search integration for PrestaShop is coming soon. Until then, connect the shop through a product feed or the REST API.",{"title":189,"path":190,"stem":191,"description":192,"icon":167},"commercetools","\u002Fdocs\u002Fintegrations\u002Fcommercetools","docs\u002F4.integrations\u002F10.commercetools","A Zaproo Search integration for commercetools is coming soon. Until then, connect the shop through a product feed or the REST API.",{"title":194,"path":195,"stem":196,"description":197,"icon":167},"Salesforce Commerce Cloud","\u002Fdocs\u002Fintegrations\u002Fsalesforce-commerce-cloud","docs\u002F4.integrations\u002F11.salesforce-commerce-cloud","A Zaproo Search integration for Salesforce Commerce Cloud is coming soon. Until then, connect the shop through a product feed or the REST API.",{"title":199,"description":200,"icon":201,"path":202,"stem":203,"children":204,"page":46},"Search and relevance","The search API, search profiles, facets, synonyms and ranking rules.","i-lucide-search","\u002Fdocs\u002Fsearch","docs\u002F5.search",[205,211,217,223,229,235],{"title":206,"path":207,"stem":208,"description":209,"icon":210},"Search API","\u002Fdocs\u002Fsearch\u002Fsearch-api","docs\u002F5.search\u002F1.search-api","Try a search in the playground, then the search request and response for developers, with every filter form, sorting, paging, highlighting and the inline profile.","i-lucide-search-code",{"title":212,"path":213,"stem":214,"description":215,"icon":216},"Search profiles","\u002Fdocs\u002Fsearch\u002Fprofiles","docs\u002F5.search\u002F2.profiles","Every setting of a search profile, what it does to results, and the mistakes to avoid.","i-lucide-sliders-horizontal",{"title":218,"path":219,"stem":220,"description":221,"icon":222},"Facets","\u002Fdocs\u002Fsearch\u002Ffacets","docs\u002F5.search\u002F3.facets","The filter panels next to the results, the four facet types, index facets and profile facets, and how a shopper's clicks change the counts.","i-lucide-list-filter",{"title":224,"path":225,"stem":226,"description":227,"icon":228},"Synonyms","\u002Fdocs\u002Fsearch\u002Fsynonyms","docs\u002F5.search\u002F4.synonyms","Let different words find the same products, with equivalent and one-way rules, bulk import and export in the Solr format, and no reindex.","i-lucide-arrow-left-right",{"title":230,"path":231,"stem":232,"description":233,"icon":234},"Ranking rules","\u002Fdocs\u002Fsearch\u002Frules","docs\u002F5.search\u002F5.rules","Change the results for chosen searches. Put products first, hide them, lift or lower a brand, narrow the results or weigh fields differently, on a schedule and per profile.","i-lucide-list-ordered",{"title":236,"path":237,"stem":238,"description":239,"icon":240},"Language groups","\u002Fdocs\u002Fsearch\u002Flanguage-groups","docs\u002F5.search\u002F6.language-groups","Let each store of a multilingual shop find its products by the other stores' text, so an English search on the Estonian store still finds the Estonian product.","i-lucide-languages",{"title":242,"description":243,"icon":244,"path":245,"stem":246,"children":247,"page":46},"Autocomplete","Query suggestions as the shopper types.","i-lucide-text-cursor-input","\u002Fdocs\u002Fautocomplete","docs\u002F6.autocomplete",[248],{"title":242,"path":249,"stem":250,"description":251,"icon":244},"\u002Fdocs\u002Fautocomplete\u002Fsuggestions","docs\u002F6.autocomplete\u002F1.suggestions","Set up query suggestions in the cabinet. They are built every hour from your shoppers' searches, field values and custom entries.",{"title":253,"description":254,"icon":255,"path":256,"stem":257,"children":258,"page":46},"Analytics","Searches, zero-result queries and latency.","i-lucide-chart-line","\u002Fdocs\u002Fanalytics","docs\u002F7.analytics",[259,264,270],{"title":260,"path":261,"stem":262,"description":263,"icon":255},"Search analytics","\u002Fdocs\u002Fanalytics\u002Fsearch-analytics","docs\u002F7.analytics\u002F1.search-analytics","What the analytics page counts, which traffic it leaves out, how the headline numbers are defined, how comparisons and retention work, and how to get the weekly digest.",{"title":265,"path":266,"stem":267,"description":268,"icon":269},"Reports","\u002Fdocs\u002Fanalytics\u002Freports","docs\u002F7.analytics\u002F2.reports","Every analytics report with the definition of each column, the opportunities list and its fix buttons, the per-query view with before and after, and the CSV download.","i-lucide-table",{"title":271,"path":272,"stem":273,"description":274,"icon":275},"Event tracking","\u002Fdocs\u002Fanalytics\u002Fevent-tracking","docs\u002F7.analytics\u002F3.event-tracking","Send clicks, add-to-cart, purchases and suggestion clicks from your storefront, tie them to the search with searchId, and a copy-paste script that does it.","i-lucide-mouse-pointer-click",{"title":277,"description":278,"icon":279,"path":280,"stem":281,"children":282,"page":46},"AI agents (MCP)","Connect Claude Code or any MCP client and manage search from an agent.","i-lucide-bot","\u002Fdocs\u002Fmcp","docs\u002F8.mcp",[283,289,295],{"title":284,"path":285,"stem":286,"description":287,"icon":288},"MCP setup","\u002Fdocs\u002Fmcp\u002Fsetup","docs\u002F8.mcp\u002F1.setup","Connect Claude Code or another MCP client to your project from the cabinet's MCP connection page, and let an agent manage indices, documents, profiles, synonyms and rules.","i-lucide-plug",{"title":290,"path":291,"stem":292,"description":293,"icon":294},"MCP tools","\u002Fdocs\u002Fmcp\u002Ftools","docs\u002F8.mcp\u002F2.tools","Every tool the Zaproo Search MCP server offers, what an agent can do with each group, and prompts to start from.","i-lucide-wrench",{"title":296,"path":297,"stem":298,"description":299,"icon":300},"Resources and prompts","\u002Fdocs\u002Fmcp\u002Fresources","docs\u002F8.mcp\u002F3.resources","The index resources an MCP client can read, the tune_relevance prompt, and the errors the MCP server answers.","i-lucide-library",{"title":302,"description":303,"icon":304,"path":305,"stem":306,"children":307,"page":46},"Reference","Every REST route, every limit, plans and billing, and status.","i-lucide-book-open","\u002Fdocs\u002Freference","docs\u002F9.reference",[308,314,319,325],{"title":309,"path":310,"stem":311,"description":312,"icon":313},"REST API","\u002Fdocs\u002Freference\u002Frest-api","docs\u002F9.reference\u002F1.rest-api","The routes of the Zaproo Search REST API, grouped by area, with who may call it.","i-lucide-list-tree",{"title":315,"path":316,"stem":317,"description":318,"icon":89},"Limits","\u002Fdocs\u002Freference\u002Flimits","docs\u002F9.reference\u002F2.limits","Every size limit, cap and default of the Zaproo Search API in one place, with what happens when you reach it.",{"title":320,"path":321,"stem":322,"description":323,"icon":324},"Plans and billing","\u002Fdocs\u002Freference\u002Fbilling","docs\u002F9.reference\u002F3.billing","Check your plan and usage on the Billing & usage page, change the plan, download invoices, and see how quotas and proration work.","i-lucide-credit-card",{"title":326,"path":327,"stem":328,"description":329,"icon":330},"Status","\u002Fdocs\u002Freference\u002Fstatus","docs\u002F9.reference\u002F4.status","The status page and the status route, what each service covers and how to use them in your own monitoring.","i-lucide-activity",{"id":332,"title":260,"body":333,"description":263,"extension":1427,"meta":1428,"navigation":1429,"path":261,"seo":1430,"stem":262,"__hash__":1431},"docs\u002Fdocs\u002F7.analytics\u002F1.search-analytics.md",{"type":334,"value":335,"toc":1402},"minimark",[336,341,358,362,373,381,384,464,471,481,487,490,507,531,545,550,554,568,663,669,672,693,698,708,735,742,745,751,821,824,834,868,872,912,919,923,937,940,949,952,962,966,976,980,994,997,1003,1007,1016,1019,1024,1045,1049,1052,1057,1120,1222,1255,1258,1261,1265,1282,1285,1296,1299,1303,1335,1339,1363,1367,1398],[337,338,340],"h2",{"id":339},"what-analytics-shows","What analytics shows",[342,343,344,345,349,350,353,354,357],"p",{},"Every search your storefront makes with a saved ",[346,347,348],"a",{"href":213},"search profile"," is logged: the query, how many products it found, how long it took, which filters it used and which ",[346,351,352],{"href":231},"ranking rules"," fired. When your store also sends ",[346,355,356],{"href":272},"events",", each click, add-to-cart and purchase is tied to the search that led to it. Analytics adds all of that up per index.",[337,359,361],{"id":360},"open-the-analytics-page","Open the analytics page",[342,363,364,365,368,369,372],{},"Open an index and click ",[366,367,253],"strong",{}," in the menu, under ",[366,370,371],{},"Test & measure",". Any member of the project can read it.",[342,374,375],{},[376,377],"img",{"alt":378,"src":379,"title":380},"The Analytics page of the products index: the date range buttons, the Compare with, Device and Country filters, and the Opportunities table with Add synonym and Pin or boost with a rule buttons on each query","\u002Fdocs\u002Fscreenshots\u002Fanalytics.png","Analytics for the last 30 days, opportunities first",[342,382,383],{},"The page has, from top to bottom:",[385,386,387,396,410,418,429],"ol",{},[388,389,390,391,395],"li",{},"The window and the filters. See ",[346,392,394],{"href":393},"#window-comparison-and-filters","Window, comparison and filters",".",[388,397,398,402,403,406,407,395],{},[346,399,401],{"href":400},"\u002Fdocs\u002Fanalytics\u002Freports#opportunities","Opportunities",": the queries that cost you the most, each with ",[366,404,405],{},"Add synonym"," and ",[366,408,409],{},"Pin or boost with a rule",[388,411,412,413,417],{},"The ",[346,414,416],{"href":415},"#headline-numbers","headline numbers",", each with its change against the comparison window.",[388,419,420,423,424,428],{},[366,421,422],{},"Searches over time",", the ",[346,425,427],{"href":426},"#timeline","timeline",", with the searches that found nothing in red.",[388,430,431,432,435,436,439,440,439,443,439,446,439,449,439,452,439,454,406,457,460,461,395],{},"A tab per ",[346,433,434],{"href":266},"report",": ",[366,437,438],{},"Queries",", ",[366,441,442],{},"No clicks",[366,444,445],{},"Products",[366,447,448],{},"Click positions",[366,450,451],{},"Filters",[366,453,242],{},[366,455,456],{},"Rules",[366,458,459],{},"Refinements",". Each table has ",[366,462,463],{},"Download CSV",[342,465,466,467,395],{},"Click any query in a table to open it on its own: searches per day, the synonyms and rules that touched it, and the numbers before and after the latest fix. See ",[346,468,470],{"href":469},"\u002Fdocs\u002Fanalytics\u002Freports#one-query","One query",[342,472,473,474,477,478,395],{},"If your store sends no events yet, the page shows ",[366,475,476],{},"No clicks, carts or purchases yet",". Searches are still counted, but click-through, conversion, revenue and the opportunities list stay empty until you ",[346,479,480],{"href":272},"send events",[342,482,483,484,395],{},"New searches show up within a few seconds. To check the page right after setup, run a few searches from your storefront, not from the cabinet: cabinet searches are left out unless you turn on ",[366,485,486],{},"Include internal traffic",[337,488,394],{"id":489},"window-comparison-and-filters",[342,491,492,493,439,496,439,499,502,503,506],{},"Pick ",[366,494,495],{},"Last 7 days",[366,497,498],{},"Last 30 days",[366,500,501],{},"Last 90 days"," or ",[366,504,505],{},"Last year"," at the top. The window always ends now.",[342,508,509,512,513,516,517,502,520,523,524,526,527,530],{},[366,510,511],{},"Compare with"," sets the comparison window: ",[366,514,515],{},"Previous period"," (the default), ",[366,518,519],{},"Same period last year",[366,521,522],{},"No comparison",". Every headline number then shows its change, and the ",[366,525,438],{}," report gets a ",[366,528,529],{},"Before"," column.",[342,532,533,406,536,539,540,544],{},[366,534,535],{},"Device",[366,537,538],{},"Country"," narrow every number on the page to one device class (desktop, mobile or tablet, read from the user agent) or one country. The country comes from the ",[541,542,543],"code",{},"cf-ipcountry"," header your CDN sets, so it is empty when there is no CDN in front of the API.",[342,546,547,549],{},[366,548,486],{}," adds the searches and events that are normally left out. See the next section.",[337,551,553],{"id":552},"what-counts-as-real-traffic","What counts as real traffic",[342,555,556,557,560,561,563,564,567],{},"Every logged search and event carries a source. Reports count only ",[541,558,559],{},"live"," unless you turn on ",[366,562,486],{}," (",[541,565,566],{},"includeInternal=true"," on the API).",[569,570,571,584],"table",{},[572,573,574],"thead",{},[575,576,577,581],"tr",{},[578,579,580],"th",{},"Source",[578,582,583],{},"What it is",[585,586,587,597,607,621,639,653],"tbody",{},[575,588,589,594],{},[590,591,592],"td",{},[541,593,559],{},[590,595,596],{},"A shopper on your store. The only source the reports count by default.",[575,598,599,604],{},[590,600,601],{},[541,602,603],{},"cabinet",[590,605,606],{},"A signed-in user: the playground, the profile and rule editors.",[575,608,609,614],{},[590,610,611],{},[541,612,613],{},"mcp",[590,615,616,617,620],{},"An AI agent calling the ",[541,618,619],{},"search"," tool.",[575,622,623,628],{},[590,624,625],{},[541,626,627],{},"opted_out",[590,629,630,631,634,635,395],{},"A search sent with ",[541,632,633],{},"analytics: false",". See ",[346,636,638],{"href":637},"#opting-a-search-out","Opting a search out",[575,640,641,646],{},[590,642,643],{},[541,644,645],{},"excluded_ip",[590,647,648,649,395],{},"A request from one of the project's ",[346,650,652],{"href":651},"#excluded-ip-addresses","excluded IP addresses",[575,654,655,660],{},[590,656,657],{},[541,658,659],{},"bot",[590,661,662],{},"A request whose user agent is a known crawler.",[342,664,665,666,668],{},"The source is decided once, when the search or event is logged, in that order: an opted-out search stays ",[541,667,627],{}," even when it comes from an excluded address.",[342,670,671],{},"Two more rules keep the counts honest:",[673,674,675,682],"ul",{},[388,676,677,678,681],{},"Search-as-you-type is collapsed. When one session sends \"bub\", \"bubb\" and \"bubble wrap\" within a few seconds, only the last one counts. The earlier keystrokes are marked ",[541,679,680],{},"superseded"," and left out of every report.",[388,683,684,685,688,689,692],{},"Retypes are remembered. When a search finds nothing and the same session searches for something else within 60 seconds, the second search records the first as ",[541,686,687],{},"refinedFrom",". That feeds the ",[346,690,459],{"href":691},"\u002Fdocs\u002Fanalytics\u002Freports#refinements"," report.",[694,695,697],"h3",{"id":696},"excluded-ip-addresses","Excluded IP addresses",[342,699,700,701,703,704,707],{},"Searches and events from these addresses are logged as ",[541,702,645],{}," and left out of the reports and of ",[346,705,706],{"href":249},"autocomplete",". Use the list for your office, your test scripts and your staging server.",[385,709,710,717,729],{},[388,711,712,713,716],{},"Open the project and click ",[366,714,715],{},"Settings"," in the project menu.",[388,718,719,720,722,723,502,726,395],{},"Under ",[366,721,697],{},", enter one IPv4 or IPv6 address or CIDR range per line, up to 50. For example ",[541,724,725],{},"203.0.113.7",[541,727,728],{},"198.51.100.0\u002F24",[388,730,731,732,395],{},"Click ",[366,733,734],{},"Save",[342,736,737,738,741],{},"The list applies to every index of the project from the next search. Only organization owners and admins can change it. A line that is not an address or a range is listed under ",[366,739,740],{},"Check the list",", and nothing is saved until you fix it.",[342,743,744],{},"With the API, send the whole list on the project update route:",[746,747],"api-route",{"auth":748,"method":749,"path":750},"Admin or owner of the organization","PUT","\u002Fv1\u002Fprojects\u002F:projectId",[752,753,758],"pre",{"className":754,"code":755,"language":756,"meta":757,"style":757},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","curl -X PUT https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F$PROJECT_ID \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"analyticsExcludedIps\": [\"203.0.113.7\", \"198.51.100.0\u002F24\"]}'\n","bash","",[541,759,760,788,812],{"__ignoreMap":757},[761,762,765,769,773,777,780,784],"span",{"class":763,"line":764},"line",1,[761,766,768],{"class":767},"szw1H","curl",[761,770,772],{"class":771},"ssYy9"," -X",[761,774,776],{"class":775},"semJd"," PUT",[761,778,779],{"class":775}," https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F",[761,781,783],{"class":782},"s7iLA","$PROJECT_ID ",[761,785,787],{"class":786},"sklAV","\\\n",[761,789,791,794,797,800,803,806,809],{"class":763,"line":790},2,[761,792,793],{"class":771},"  -H",[761,795,796],{"class":775}," \"Authorization: Bearer ",[761,798,799],{"class":782},"$ACCESS_TOKEN",[761,801,802],{"class":775},"\"",[761,804,805],{"class":771}," -H",[761,807,808],{"class":775}," \"Content-Type: application\u002Fjson\"",[761,810,811],{"class":786}," \\\n",[761,813,815,818],{"class":763,"line":814},3,[761,816,817],{"class":771},"  -d",[761,819,820],{"class":775}," '{\"analyticsExcludedIps\": [\"203.0.113.7\", \"198.51.100.0\u002F24\"]}'\n",[694,822,638],{"id":823},"opting-a-search-out",[342,825,826,827,830,831,833],{},"Send ",[541,828,829],{},"\"analytics\": false"," in the search request body and the search is served as usual but logged as ",[541,832,627],{},". Use it for synthetic traffic you control: uptime checks, load tests, a demo page. The home page demo on this site sends it. Events have no such flag; an event is tied to its search, and takes the source of the request that sends it.",[752,835,839],{"className":836,"code":837,"language":838,"meta":757,"style":757},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","{ \"q\": \"bubble wrap\", \"analytics\": false }\n","json",[541,840,841],{"__ignoreMap":757},[761,842,843,846,850,852,855,857,860,862,865],{"class":763,"line":764},[761,844,845],{"class":782},"{ ",[761,847,849],{"class":848},"sb7M8","\"q\"",[761,851,435],{"class":782},[761,853,854],{"class":775},"\"bubble wrap\"",[761,856,439],{"class":782},[761,858,859],{"class":848},"\"analytics\"",[761,861,435],{"class":782},[761,863,864],{"class":771},"false",[761,866,867],{"class":782}," }\n",[337,869,871],{"id":870},"headline-numbers","Headline numbers",[342,873,874,875,439,878,439,881,439,884,439,887,439,890,439,893,439,896,439,899,439,902,406,905,908,909,911],{},"The cabinet shows them as tiles: ",[366,876,877],{},"Searches",[366,879,880],{},"Sessions with search",[366,882,883],{},"Zero-result rate",[366,885,886],{},"Click-through rate",[366,888,889],{},"Add-to-cart rate",[366,891,892],{},"Conversion rate",[366,894,895],{},"Search revenue",[366,897,898],{},"Share of revenue",[366,900,901],{},"Average click position",[366,903,904],{},"Latency p50",[366,906,907],{},"Latency p95",". The info button on each tile opens its definition from this page. The names in ",[541,910,541],{}," are the API fields.",[342,913,914,915,918],{},"Rates are shares of distinct searches, from 0 to 1; the cabinet shows them as percentages. Every number comes with its value over the comparison window, ",[541,916,917],{},"null"," when there is no comparison or nothing to divide by.",[694,920,922],{"id":921},"searches-and-sessions","Searches and sessions",[342,924,925,928,929,932,933,936],{},[541,926,927],{},"searches",": logged searches in the window, the empty query included (a shopper browsing a category without typing). Keystroke searches that a later one superseded are not counted. ",[541,930,931],{},"sessions",": distinct sessions that made at least one search, from the ",[541,934,935],{},"sessionId"," your storefront sends. Without session ids it stays at zero.",[694,938,883],{"id":939},"zero-result-rate",[342,941,942,945,946,948],{},[541,943,944],{},"zeroResultRate",": the share of searches that found nothing. It is the first number to watch after a change to a profile, synonyms or rules. A popular zero-result query matters more than twenty that were searched once, so work through the ",[346,947,401],{"href":400}," list rather than the rate.",[694,950,886],{"id":951},"click-through-rate",[342,953,954,957,958,961],{},[541,955,956],{},"ctr",": searches with at least one click, divided by searches. It needs ",[346,959,960],{"href":272},"click events",". A low rate with a low zero-result rate means the results are there but not convincing: check the ranking, the titles and the images.",[694,963,965],{"id":964},"add-to-cart-and-conversion-rate","Add-to-cart and conversion rate",[342,967,968,971,972,975],{},[541,969,970],{},"addToCartRate",": searches followed by an add-to-cart event, divided by searches. ",[541,973,974],{},"conversionRate",": searches followed by a purchase, divided by searches. Both need the matching events.",[694,977,979],{"id":978},"search-revenue-and-its-share","Search revenue and its share",[342,981,982,985,986,989,990,993],{},[541,983,984],{},"revenue",": the sum of ",[541,987,988],{},"quantity × price"," over every purchase line tied to a search in the window, in the currency your events send. ",[541,991,992],{},"revenueShare",": that revenue divided by the revenue of every purchase event you sent, tied to a search or not. Send every order, not only the ones that came from search, or the share is meaningless.",[694,995,901],{"id":996},"average-click-position",[342,998,999,1002],{},[541,1000,1001],{},"avgClickPosition",": the mean position of clicked results, from 1. Rising means shoppers scroll further before they find what they want.",[694,1004,1006],{"id":1005},"latency","Latency",[342,1008,1009,406,1012,1015],{},[541,1010,1011],{},"latencyP50",[541,1013,1014],{},"latencyP95",": the time the search took inside Zaproo, in milliseconds, for the median search and for the slowest 5 percent. Network time to your server is not included.",[337,1017,1018],{"id":427},"Timeline",[342,1020,1021,1023],{},[366,1022,422],{}," draws one bar per bucket. The red part of each bar is the searches that found nothing. Point at a bar to see its date and counts.",[342,1025,1026,1027,1029,1030,1033,1034,439,1036,439,1039,406,1042,1044],{},"In the API answer, ",[541,1028,427],{}," holds one bucket per hour when the window is two days or shorter, and one per day when it is longer. Every bucket has ",[541,1031,1032],{},"ts"," (its start), ",[541,1035,927],{},[541,1037,1038],{},"zeroResults",[541,1040,1041],{},"clicks",[541,1043,984],{},". Buckets without traffic are included with zeros, so the series has no gaps.",[337,1046,1048],{"id":1047},"with-the-api","With the API",[342,1050,1051],{},"Everything the page shows comes from one route. Use it to pull the numbers into your own reports.",[746,1053],{"auth":1054,"method":1055,"path":1056},"Project member or any secret key","GET","\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Fanalytics",[1058,1059,1060,1102],"tabs",{},[1061,1062,1064],"tabs-item",{"icon":1063,"label":768},"i-lucide-terminal",[752,1065,1067],{"className":754,"code":1066,"language":756,"meta":757,"style":757},"curl \"https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F$PROJECT_ID\u002Findices\u002F$INDEX_ID\u002Fanalytics?from=2026-10-01T00:00:00Z&to=2026-10-15T00:00:00Z&compare=previous&device=mobile\" \\\n  -H \"Authorization: Bearer $ZS_KEY\"\n",[541,1068,1069,1090],{"__ignoreMap":757},[761,1070,1071,1073,1076,1079,1082,1085,1088],{"class":763,"line":764},[761,1072,768],{"class":767},[761,1074,1075],{"class":775}," \"https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F",[761,1077,1078],{"class":782},"$PROJECT_ID",[761,1080,1081],{"class":775},"\u002Findices\u002F",[761,1083,1084],{"class":782},"$INDEX_ID",[761,1086,1087],{"class":775},"\u002Fanalytics?from=2026-10-01T00:00:00Z&to=2026-10-15T00:00:00Z&compare=previous&device=mobile\"",[761,1089,811],{"class":786},[761,1091,1092,1094,1096,1099],{"class":763,"line":790},[761,1093,793],{"class":771},[761,1095,796],{"class":775},[761,1097,1098],{"class":782},"$ZS_KEY",[761,1100,1101],{"class":775},"\"\n",[1061,1103,1105,1113],{"icon":279,"label":1104},"MCP",[752,1106,1111],{"className":1107,"code":1109,"language":1110,"meta":757},[1108],"language-text","How did search do last week compared with the week before? Mobile only.\n","text",[541,1112,1109],{"__ignoreMap":757},[342,1114,1115,1116,1119],{},"The agent calls ",[541,1117,1118],{},"get_search_analytics",", which takes the same parameters.",[569,1121,1122,1132],{},[572,1123,1124],{},[575,1125,1126,1129],{},[578,1127,1128],{},"Parameter",[578,1130,1131],{},"Meaning",[585,1133,1134,1157,1176,1194,1207],{},[575,1135,1136,1144],{},[590,1137,1138,439,1141],{},[541,1139,1140],{},"from",[541,1142,1143],{},"to",[590,1145,1146,1147,1149,1150,1152,1153,395],{},"ISO timestamps. Leave both out for the last 30 days up to now. ",[541,1148,1140],{}," must be before ",[541,1151,1143],{},", and the window may span at most the ",[346,1154,1156],{"href":1155},"#retention","retention",[575,1158,1159,1164],{},[590,1160,1161],{},[541,1162,1163],{},"compare",[590,1165,1166,1169,1170,502,1173,395],{},[541,1167,1168],{},"previous"," (default), ",[541,1171,1172],{},"year",[541,1174,1175],{},"none",[575,1177,1178,1183],{},[590,1179,1180],{},[541,1181,1182],{},"device",[590,1184,1185,439,1188,502,1191,395],{},[541,1186,1187],{},"desktop",[541,1189,1190],{},"mobile",[541,1192,1193],{},"tablet",[575,1195,1196,1201],{},[590,1197,1198],{},[541,1199,1200],{},"country",[590,1202,1203,1204,395],{},"An ISO 3166-1 alpha-2 code, ",[541,1205,1206],{},"DE",[575,1208,1209,1214],{},[590,1210,1211],{},[541,1212,1213],{},"includeInternal",[590,1215,1216,1219,1220,395],{},[541,1217,1218],{},"true"," to count every source, not only ",[541,1221,559],{},[342,1223,1224,1225,1228,1229,1232,1233,1235,1236,439,1238,406,1241,1244,1245,406,1248,1251,1252,395],{},"The answer holds ",[541,1226,1227],{},"kpis"," (every headline number as ",[541,1230,1231],{},"{ value, previous }","), ",[541,1234,1168],{}," (the comparison window), ",[541,1237,427],{},[541,1239,1240],{},"devices",[541,1242,1243],{},"countries"," (searches per device and per country, for the filters), and ",[541,1246,1247],{},"topQueries",[541,1249,1250],{},"zeroResultQueries"," (the 50 most searched queries, and the 50 most searched that found nothing). A window longer than the retention answers ",[541,1253,1254],{},"400 VALIDATION_FAILED",[337,1256,1257],{"id":1156},"Retention",[342,1259,1260],{},"Zaproo keeps the search log and the events for 760 days by default, so a 12-month window can be compared with the year before. Zaproo staff can set the value between 30 and 1825 days for the whole platform. The longest window the API accepts equals the retention. Data rolls over monthly, so a record is deleted within about a month after it passes the retention, not on the day.",[337,1262,1264],{"id":1263},"weekly-digest-and-alerts","Weekly digest and alerts",[342,1266,1267,1268,1270,1271,1274,1275,1277,1278,1281],{},"Every Monday at 07:00 UTC, the owners and admins of the organization get one email per project that had searches last week: the headline numbers against the week before, the top five opportunities and the top five products, with links into the cabinet. To turn it off for a project, open the project's ",[366,1269,715],{},", switch off ",[366,1272,1273],{},"Email a weekly digest to owners and admins"," and click ",[366,1276,734],{},". With the API, send ",[541,1279,1280],{},"\"analyticsDigest\": false"," on the project update route.",[342,1283,1284],{},"Alerts are checked every morning at 06:00 UTC against the day before. Each project gets at most one per type and day, and the digest switch turns them off too:",[673,1286,1287,1290,1293],{},[388,1288,1289],{},"the zero-result rate rose by half and by at least 5 points against the previous 4 weeks;",[388,1291,1292],{},"searches fell by 60 percent against the same weekday of the previous 4 weeks;",[388,1294,1295],{},"the click-through rate fell by 40 percent.",[342,1297,1298],{},"Each one needs at least 200 searches in the baseline, so a quiet index does not alert on noise.",[337,1300,1302],{"id":1301},"what-gets-logged","What gets logged",[673,1304,1305,1312,1326,1332],{},[388,1306,1307,1308,1311],{},"Searches with a saved profile, on the public route ",[541,1309,1310],{},"POST \u002Fv1\u002Fsearch\u002F:profileKey"," and on the secret route by index id.",[388,1313,1314,1315,406,1318,1321,1322,1325],{},"Not logged: searches with an inline profile (the profile editor's preview, ",[541,1316,1317],{},"preview_profile",[541,1319,1320],{},"test_rule"," over MCP), and autocomplete requests. Autocomplete analytics come from ",[541,1323,1324],{},"suggestion_click"," events.",[388,1327,1328,1329,1331],{},"With each search: the query, the result count, the latency, the device class and country, the filter fields and, for keyword and boolean filters, their values. A ",[541,1330,935],{}," is stored as a salted hash.",[388,1333,1334],{},"Records reach analytics within a few seconds.",[337,1336,1338],{"id":1337},"common-mistakes","Common mistakes",[673,1340,1341,1344,1350,1353],{},[388,1342,1343],{},"Reading the rates right after launch. A few hundred searches make a noisy rate. Judge a change over a week of traffic.",[388,1345,1346,1347,1349],{},"Counting your own traffic. Add your office and your test servers to the excluded IPs, and send ",[541,1348,633],{}," from scripts.",[388,1351,1352],{},"Sending only some orders. The share of revenue compares search orders with all orders. Send every purchase.",[388,1354,1355,1356,1358,1359,1362],{},"Searching without a session id. Without ",[541,1357,935],{},", sessions stay at zero, keystrokes are not collapsed, and an event without a ",[541,1360,1361],{},"searchId"," cannot fall back to the session's last search.",[337,1364,1366],{"id":1365},"related","Related",[673,1368,1369,1373,1377,1381,1385,1389,1393],{},[388,1370,1371],{},[346,1372,265],{"href":266},[388,1374,1375],{},[346,1376,271],{"href":272},[388,1378,1379],{},[346,1380,224],{"href":225},[388,1382,1383],{},[346,1384,230],{"href":231},[388,1386,1387],{},[346,1388,242],{"href":249},[388,1390,1391],{},[346,1392,67],{"href":68},[388,1394,1395],{},[346,1396,290],{"href":1397},"\u002Fdocs\u002Fmcp\u002Ftools#analytics",[1399,1400,1401],"style",{},"html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sklAV, html code.shiki .sklAV{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF9492}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}",{"title":757,"searchDepth":790,"depth":790,"links":1403},[1404,1405,1406,1407,1411,1420,1421,1422,1423,1424,1425,1426],{"id":339,"depth":790,"text":340},{"id":360,"depth":790,"text":361},{"id":489,"depth":790,"text":394},{"id":552,"depth":790,"text":553,"children":1408},[1409,1410],{"id":696,"depth":814,"text":697},{"id":823,"depth":814,"text":638},{"id":870,"depth":790,"text":871,"children":1412},[1413,1414,1415,1416,1417,1418,1419],{"id":921,"depth":814,"text":922},{"id":939,"depth":814,"text":883},{"id":951,"depth":814,"text":886},{"id":964,"depth":814,"text":965},{"id":978,"depth":814,"text":979},{"id":996,"depth":814,"text":901},{"id":1005,"depth":814,"text":1006},{"id":427,"depth":790,"text":1018},{"id":1047,"depth":790,"text":1048},{"id":1156,"depth":790,"text":1257},{"id":1263,"depth":790,"text":1264},{"id":1301,"depth":790,"text":1302},{"id":1337,"depth":790,"text":1338},{"id":1365,"depth":790,"text":1366},"md",{},{"icon":255},{"title":260,"description":263},"anl3wUP5AvWCZX2fCqEzEXzfQudZS1uX10UXR7gC82A",[1433,1434],{"title":242,"path":249,"stem":250,"description":251,"icon":244,"children":-1},{"title":265,"path":266,"stem":267,"description":268,"icon":269,"children":-1},1793717706323]