[{"data":1,"prerenderedAt":1815},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Fanalytics\u002Fevent-tracking":331,"docs-\u002Fdocs\u002Fanalytics\u002Fevent-tracking-surround":1812},[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":271,"body":333,"description":274,"extension":1807,"meta":1808,"navigation":1809,"path":272,"seo":1810,"stem":273,"__hash__":1811},"docs\u002Fdocs\u002F7.analytics\u002F3.event-tracking.md",{"type":334,"value":335,"toc":1796},"minimark",[336,341,368,372,393,397,403,421,496,500,514,600,886,890,899,908,918,922,936,958,1597,1610,1614,1632,1636,1730,1734,1761,1765,1792],[337,338,340],"h2",{"id":339},"how-it-fits-together","How it fits together",[342,343,344,353,359,365],"ol",{},[345,346,347,348,352],"li",{},"Your storefront searches with a public key. The answer carries a ",[349,350,351],"code",{},"searchId",".",[345,354,355,356,358],{},"The storefront keeps that ",[349,357,351],{}," with the results it renders.",[345,360,361,362,364],{},"When the shopper clicks a result, adds it to the cart or buys it, the storefront posts an event with the ",[349,363,351],{}," of the search that showed the product.",[345,366,367],{},"Zaproo ties the event to the search and the reports fill in: click-through, add-to-cart and conversion rates, revenue per query, top products and click positions.",[369,370,371],"p",{},"Events are accepted at once and tied to their search a few seconds later, off the request path. Nothing in this flow slows the search box down.",[369,373,374,375,378,379,383,384,388,389,392],{},"The cabinet has no settings for events: your storefront sends them with the API, and the ",[376,377,253],"a",{"href":261}," page shows the result. Until the first event arrives, that page shows ",[380,381,382],"strong",{},"No clicks, carts or purchases yet",". You need a public ",[376,385,387],{"href":386},"\u002Fdocs\u002Fkeys\u002Fapi-keys#key-type","API key"," whose allowed origins list your shop's domain, and the key of the ",[376,390,391],{"href":213},"search profile"," your storefront searches with.",[337,394,396],{"id":395},"the-endpoint","The endpoint",[398,399],"api-route",{"auth":400,"method":401,"path":402},"Public key from an allowed origin, or a secret key","POST","\u002Fv1\u002Fevents\u002F:profileKey",[369,404,405,408,409,412,413,416,417,420],{},[349,406,407],{},"profileKey"," is the key of the search profile the storefront searched with. The route takes the same keys, the same origin check and the same rate limit as ",[349,410,411],{},"POST \u002Fv1\u002Fsearch\u002F:profileKey",". The body is a bare JSON array of 1 to 100 events. The answer is ",[349,414,415],{},"202 { \"accepted\": n }",", where ",[349,418,419],{},"n"," counts the events in the request (a purchase with three lines is one).",[422,423,428],"pre",{"className":424,"code":425,"language":426,"meta":427,"style":427},"language-bash shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","curl -X POST https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fevents\u002F$PROFILE_KEY \\\n  -H \"Authorization: Bearer $ZS_PUBLIC_KEY\" -H \"Origin: https:\u002F\u002Fshop.example.com\" -H \"Content-Type: application\u002Fjson\" \\\n  -d '[{\"type\": \"click\", \"searchId\": \"8f2Kq9xWv1pLmN3cT6yZ0a\", \"itemId\": \"tape-48\", \"position\": 2}]'\n","bash","",[349,429,430,458,487],{"__ignoreMap":427},[431,432,435,439,443,447,450,454],"span",{"class":433,"line":434},"line",1,[431,436,438],{"class":437},"szw1H","curl",[431,440,442],{"class":441},"ssYy9"," -X",[431,444,446],{"class":445},"semJd"," POST",[431,448,449],{"class":445}," https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fevents\u002F",[431,451,453],{"class":452},"s7iLA","$PROFILE_KEY ",[431,455,457],{"class":456},"sklAV","\\\n",[431,459,461,464,467,470,473,476,479,481,484],{"class":433,"line":460},2,[431,462,463],{"class":441},"  -H",[431,465,466],{"class":445}," \"Authorization: Bearer ",[431,468,469],{"class":452},"$ZS_PUBLIC_KEY",[431,471,472],{"class":445},"\"",[431,474,475],{"class":441}," -H",[431,477,478],{"class":445}," \"Origin: https:\u002F\u002Fshop.example.com\"",[431,480,475],{"class":441},[431,482,483],{"class":445}," \"Content-Type: application\u002Fjson\"",[431,485,486],{"class":456}," \\\n",[431,488,490,493],{"class":433,"line":489},3,[431,491,492],{"class":441},"  -d",[431,494,495],{"class":445}," '[{\"type\": \"click\", \"searchId\": \"8f2Kq9xWv1pLmN3cT6yZ0a\", \"itemId\": \"tape-48\", \"position\": 2}]'\n",[337,497,499],{"id":498},"event-types","Event types",[369,501,502,503,506,507,510,511,352],{},"Every event may carry ",[349,504,505],{},"sessionId",", the same value the search request sends: 1 to 100 letters, digits, ",[349,508,509],{},"-"," or ",[349,512,513],{},"_",[515,516,517,536,561,587],"field-group",{},[518,519,522],"field",{"name":520,"type":521},"click","event",[369,523,524,525,528,529,531,532,535],{},"A shopper opened a result. ",[349,526,527],{},"itemId"," (required), ",[349,530,351],{},", ",[349,533,534],{},"position"," (1 and up, the place of the result on the page).",[518,537,539],{"name":538,"type":521},"add_to_cart",[369,540,541,542,528,544,531,546,531,549,552,553,556,557,560],{},"A shopper put a product from the results in the cart. ",[349,543,527],{},[349,545,351],{},[349,547,548],{},"quantity",[349,550,551],{},"price"," (one unit) and ",[349,554,555],{},"currency"," (ISO 4217, ",[349,558,559],{},"EUR",").",[518,562,564],{"name":563,"type":521},"purchase",[369,565,566,567,528,570,572,573,576,577,531,579,531,581,583,584,586],{},"An order was placed. ",[349,568,569],{},"orderId",[349,571,555],{}," (required) and ",[349,574,575],{},"items",": 1 to 100 lines of ",[349,578,527],{},[349,580,548],{},[349,582,551],{}," and an optional ",[349,585,351],{}," per line. Send every order, not only the ones that came from search: the share of revenue compares the two.",[518,588,590],{"name":589,"type":521},"suggestion_click",[369,591,592,593,596,597,599],{},"A shopper picked an autocomplete suggestion. ",[349,594,595],{},"suggestion"," (the text, required) and ",[349,598,527],{}," when the suggestion was a product.",[422,601,605],{"className":602,"code":603,"language":604,"meta":427,"style":427},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","[\n  { \"type\": \"click\", \"searchId\": \"8f2Kq9xWv1pLmN3cT6yZ0a\", \"sessionId\": \"s_41f\", \"itemId\": \"tape-48\", \"position\": 2 },\n  { \"type\": \"add_to_cart\", \"searchId\": \"8f2Kq9xWv1pLmN3cT6yZ0a\", \"sessionId\": \"s_41f\", \"itemId\": \"tape-48\", \"quantity\": 1, \"price\": 1.86, \"currency\": \"EUR\" },\n  { \"type\": \"purchase\", \"sessionId\": \"s_41f\", \"orderId\": \"100042\", \"currency\": \"EUR\",\n    \"items\": [{ \"itemId\": \"tape-48\", \"quantity\": 1, \"price\": 1.86, \"searchId\": \"8f2Kq9xWv1pLmN3cT6yZ0a\" }, { \"itemId\": \"box-300\", \"quantity\": 2, \"price\": 0.32 }] },\n  { \"type\": \"suggestion_click\", \"sessionId\": \"s_41f\", \"suggestion\": \"duct tape\" }\n]\n","json",[349,606,607,612,670,737,778,847,880],{"__ignoreMap":427},[431,608,609],{"class":433,"line":434},[431,610,611],{"class":452},"[\n",[431,613,614,617,621,624,627,629,632,634,637,639,642,644,647,649,652,654,657,659,662,664,667],{"class":433,"line":460},[431,615,616],{"class":452},"  { ",[431,618,620],{"class":619},"sb7M8","\"type\"",[431,622,623],{"class":452},": ",[431,625,626],{"class":445},"\"click\"",[431,628,531],{"class":452},[431,630,631],{"class":619},"\"searchId\"",[431,633,623],{"class":452},[431,635,636],{"class":445},"\"8f2Kq9xWv1pLmN3cT6yZ0a\"",[431,638,531],{"class":452},[431,640,641],{"class":619},"\"sessionId\"",[431,643,623],{"class":452},[431,645,646],{"class":445},"\"s_41f\"",[431,648,531],{"class":452},[431,650,651],{"class":619},"\"itemId\"",[431,653,623],{"class":452},[431,655,656],{"class":445},"\"tape-48\"",[431,658,531],{"class":452},[431,660,661],{"class":619},"\"position\"",[431,663,623],{"class":452},[431,665,666],{"class":441},"2",[431,668,669],{"class":452}," },\n",[431,671,672,674,676,678,681,683,685,687,689,691,693,695,697,699,701,703,705,707,710,712,715,717,720,722,725,727,730,732,735],{"class":433,"line":489},[431,673,616],{"class":452},[431,675,620],{"class":619},[431,677,623],{"class":452},[431,679,680],{"class":445},"\"add_to_cart\"",[431,682,531],{"class":452},[431,684,631],{"class":619},[431,686,623],{"class":452},[431,688,636],{"class":445},[431,690,531],{"class":452},[431,692,641],{"class":619},[431,694,623],{"class":452},[431,696,646],{"class":445},[431,698,531],{"class":452},[431,700,651],{"class":619},[431,702,623],{"class":452},[431,704,656],{"class":445},[431,706,531],{"class":452},[431,708,709],{"class":619},"\"quantity\"",[431,711,623],{"class":452},[431,713,714],{"class":441},"1",[431,716,531],{"class":452},[431,718,719],{"class":619},"\"price\"",[431,721,623],{"class":452},[431,723,724],{"class":441},"1.86",[431,726,531],{"class":452},[431,728,729],{"class":619},"\"currency\"",[431,731,623],{"class":452},[431,733,734],{"class":445},"\"EUR\"",[431,736,669],{"class":452},[431,738,740,742,744,746,749,751,753,755,757,759,762,764,767,769,771,773,775],{"class":433,"line":739},4,[431,741,616],{"class":452},[431,743,620],{"class":619},[431,745,623],{"class":452},[431,747,748],{"class":445},"\"purchase\"",[431,750,531],{"class":452},[431,752,641],{"class":619},[431,754,623],{"class":452},[431,756,646],{"class":445},[431,758,531],{"class":452},[431,760,761],{"class":619},"\"orderId\"",[431,763,623],{"class":452},[431,765,766],{"class":445},"\"100042\"",[431,768,531],{"class":452},[431,770,729],{"class":619},[431,772,623],{"class":452},[431,774,734],{"class":445},[431,776,777],{"class":452},",\n",[431,779,781,784,787,789,791,793,795,797,799,801,803,805,807,809,811,813,815,817,820,822,824,827,829,831,833,835,837,839,841,844],{"class":433,"line":780},5,[431,782,783],{"class":619},"    \"items\"",[431,785,786],{"class":452},": [{ ",[431,788,651],{"class":619},[431,790,623],{"class":452},[431,792,656],{"class":445},[431,794,531],{"class":452},[431,796,709],{"class":619},[431,798,623],{"class":452},[431,800,714],{"class":441},[431,802,531],{"class":452},[431,804,719],{"class":619},[431,806,623],{"class":452},[431,808,724],{"class":441},[431,810,531],{"class":452},[431,812,631],{"class":619},[431,814,623],{"class":452},[431,816,636],{"class":445},[431,818,819],{"class":452}," }, { ",[431,821,651],{"class":619},[431,823,623],{"class":452},[431,825,826],{"class":445},"\"box-300\"",[431,828,531],{"class":452},[431,830,709],{"class":619},[431,832,623],{"class":452},[431,834,666],{"class":441},[431,836,531],{"class":452},[431,838,719],{"class":619},[431,840,623],{"class":452},[431,842,843],{"class":441},"0.32",[431,845,846],{"class":452}," }] },\n",[431,848,850,852,854,856,859,861,863,865,867,869,872,874,877],{"class":433,"line":849},6,[431,851,616],{"class":452},[431,853,620],{"class":619},[431,855,623],{"class":452},[431,857,858],{"class":445},"\"suggestion_click\"",[431,860,531],{"class":452},[431,862,641],{"class":619},[431,864,623],{"class":452},[431,866,646],{"class":445},[431,868,531],{"class":452},[431,870,871],{"class":619},"\"suggestion\"",[431,873,623],{"class":452},[431,875,876],{"class":445},"\"duct tape\"",[431,878,879],{"class":452}," }\n",[431,881,883],{"class":433,"line":882},7,[431,884,885],{"class":452},"]\n",[337,887,889],{"id":888},"searchid-and-the-session-fallback","searchId and the session fallback",[369,891,892,894,895,898],{},[349,893,351],{}," is the 22-character id in every search response. It is ",[349,896,897],{},"null"," when the search is not logged (an inline profile, the editor's preview), and such a search cannot be tied to events.",[369,900,901,902,904,905,907],{},"An event without a ",[349,903,351],{}," but with a ",[349,906,505],{}," is tied to the latest live search of that session within the last 24 hours. That covers the cart and the checkout, where the search id is long gone but the session is not. An event with neither is stored unattributed: it counts in the share of revenue, but in no per-query number.",[369,909,910,911,913,914,917],{},"Revenue of a purchase line goes to the search its ",[349,912,351],{}," names, or to the session's last search. Lines from a search get ",[349,915,916],{},"quantity × price"," added to that query's revenue.",[337,919,921],{"id":920},"a-script-for-your-storefront","A script for your storefront",[923,924,925],"tip",{},[369,926,927,928,931,932,935],{},"With the ",[376,929,35],{"href":930},"\u002Fdocs\u002Fgetting-started\u002Fjavascript-sdk#track-what-shoppers-do",", one call sends any of these events: ",[349,933,934],{},"zaprooSearch.track({ type: 'click', searchId, itemId, position })",". Use the script below if you'd rather not add a package.",[369,937,938,939,941,942,945,946,949,950,953,954,957],{},"The snippet below keeps the last ",[349,940,351],{}," per product and sends events with ",[349,943,944],{},"fetch"," and ",[349,947,948],{},"keepalive: true",", which lets the request finish while the page unloads. ",[349,951,952],{},"navigator.sendBeacon"," cannot send the ",[349,955,956],{},"Authorization"," header this route needs, so do not use it here.",[422,959,963],{"className":960,"code":961,"language":962,"meta":427,"style":427},"language-js shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","\u002F\u002F zaproo-events.js: searches with a public key and reports what shoppers do next.\nconst API = 'https:\u002F\u002Fapi.search.zaproo.cloud';\nconst KEY = 'zs_pk_YOUR_PUBLIC_KEY';\nconst PROFILE = 'YOUR_PROFILE_KEY';\nconst sessionId = sessionStorage.zsSession ??= Math.random().toString(36).slice(2, 12);\nconst searchOf = new Map(); \u002F\u002F itemId -> searchId of the search that showed it\n\nconst headers = { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application\u002Fjson' };\n\nexport async function search(body) {\n  const res = await fetch(`${API}\u002Fv1\u002Fsearch\u002F${PROFILE}`, { method: 'POST', headers, body: JSON.stringify({ ...body, sessionId }) });\n  const data = await res.json();\n  if (data.searchId) for (const hit of data.items) searchOf.set(hit.id, data.searchId);\n  return data;\n}\n\nexport function track(events) {\n  const body = JSON.stringify(events.map((e) => ({ sessionId, ...e })));\n  return fetch(`${API}\u002Fv1\u002Fevents\u002F${PROFILE}`, { method: 'POST', headers, body, keepalive: true }).catch(() => {});\n}\n\n\u002F\u002F Call these from your result list, product page and checkout.\nexport const click = (itemId, position) => track([{ type: 'click', itemId, position, searchId: searchOf.get(itemId) }]);\nexport const addToCart = (itemId, quantity, price, currency) => track([{ type: 'add_to_cart', itemId, quantity, price, currency, searchId: searchOf.get(itemId) }]);\nexport const purchase = (orderId, currency, items) =>\n  track([{ type: 'purchase', orderId, currency, items: items.map((i) => ({ ...i, searchId: searchOf.get(i.itemId) })) }]);\nexport const suggestionClick = (suggestion, itemId) => track([{ type: 'suggestion_click', suggestion, itemId }]);\n","js",[349,964,965,971,988,1002,1016,1067,1088,1094,1129,1134,1157,1216,1236,1268,1277,1283,1288,1305,1348,1392,1397,1402,1408,1450,1496,1525,1563],{"__ignoreMap":427},[431,966,967],{"class":433,"line":434},[431,968,970],{"class":969},"sq92B","\u002F\u002F zaproo-events.js: searches with a public key and reports what shoppers do next.\n",[431,972,973,976,979,982,985],{"class":433,"line":460},[431,974,975],{"class":456},"const",[431,977,978],{"class":441}," API",[431,980,981],{"class":456}," =",[431,983,984],{"class":445}," 'https:\u002F\u002Fapi.search.zaproo.cloud'",[431,986,987],{"class":452},";\n",[431,989,990,992,995,997,1000],{"class":433,"line":489},[431,991,975],{"class":456},[431,993,994],{"class":441}," KEY",[431,996,981],{"class":456},[431,998,999],{"class":445}," 'zs_pk_YOUR_PUBLIC_KEY'",[431,1001,987],{"class":452},[431,1003,1004,1006,1009,1011,1014],{"class":433,"line":739},[431,1005,975],{"class":456},[431,1007,1008],{"class":441}," PROFILE",[431,1010,981],{"class":456},[431,1012,1013],{"class":445}," 'YOUR_PROFILE_KEY'",[431,1015,987],{"class":452},[431,1017,1018,1020,1023,1025,1028,1031,1034,1038,1041,1044,1047,1050,1052,1055,1057,1059,1061,1064],{"class":433,"line":780},[431,1019,975],{"class":456},[431,1021,1022],{"class":441}," sessionId",[431,1024,981],{"class":456},[431,1026,1027],{"class":452}," sessionStorage.zsSession ",[431,1029,1030],{"class":456},"??=",[431,1032,1033],{"class":452}," Math.",[431,1035,1037],{"class":1036},"s6m-Y","random",[431,1039,1040],{"class":452},"().",[431,1042,1043],{"class":1036},"toString",[431,1045,1046],{"class":452},"(",[431,1048,1049],{"class":441},"36",[431,1051,560],{"class":452},[431,1053,1054],{"class":1036},"slice",[431,1056,1046],{"class":452},[431,1058,666],{"class":441},[431,1060,531],{"class":452},[431,1062,1063],{"class":441},"12",[431,1065,1066],{"class":452},");\n",[431,1068,1069,1071,1074,1076,1079,1082,1085],{"class":433,"line":849},[431,1070,975],{"class":456},[431,1072,1073],{"class":441}," searchOf",[431,1075,981],{"class":456},[431,1077,1078],{"class":456}," new",[431,1080,1081],{"class":1036}," Map",[431,1083,1084],{"class":452},"(); ",[431,1086,1087],{"class":969},"\u002F\u002F itemId -> searchId of the search that showed it\n",[431,1089,1090],{"class":433,"line":882},[431,1091,1093],{"emptyLinePlaceholder":1092},true,"\n",[431,1095,1097,1099,1102,1104,1107,1110,1113,1116,1118,1121,1123,1126],{"class":433,"line":1096},8,[431,1098,975],{"class":456},[431,1100,1101],{"class":441}," headers",[431,1103,981],{"class":456},[431,1105,1106],{"class":452}," { Authorization: ",[431,1108,1109],{"class":445},"`Bearer ${",[431,1111,1112],{"class":441},"KEY",[431,1114,1115],{"class":445},"}`",[431,1117,531],{"class":452},[431,1119,1120],{"class":445},"'Content-Type'",[431,1122,623],{"class":452},[431,1124,1125],{"class":445},"'application\u002Fjson'",[431,1127,1128],{"class":452}," };\n",[431,1130,1132],{"class":433,"line":1131},9,[431,1133,1093],{"emptyLinePlaceholder":1092},[431,1135,1137,1140,1143,1146,1149,1151,1154],{"class":433,"line":1136},10,[431,1138,1139],{"class":456},"export",[431,1141,1142],{"class":456}," async",[431,1144,1145],{"class":456}," function",[431,1147,1148],{"class":1036}," search",[431,1150,1046],{"class":452},[431,1152,1153],{"class":437},"body",[431,1155,1156],{"class":452},") {\n",[431,1158,1160,1163,1166,1168,1171,1174,1176,1179,1182,1185,1188,1190,1193,1196,1199,1202,1204,1207,1210,1213],{"class":433,"line":1159},11,[431,1161,1162],{"class":456},"  const",[431,1164,1165],{"class":441}," res",[431,1167,981],{"class":456},[431,1169,1170],{"class":456}," await",[431,1172,1173],{"class":1036}," fetch",[431,1175,1046],{"class":452},[431,1177,1178],{"class":445},"`${",[431,1180,1181],{"class":441},"API",[431,1183,1184],{"class":445},"}\u002Fv1\u002Fsearch\u002F${",[431,1186,1187],{"class":441},"PROFILE",[431,1189,1115],{"class":445},[431,1191,1192],{"class":452},", { method: ",[431,1194,1195],{"class":445},"'POST'",[431,1197,1198],{"class":452},", headers, body: ",[431,1200,1201],{"class":441},"JSON",[431,1203,352],{"class":452},[431,1205,1206],{"class":1036},"stringify",[431,1208,1209],{"class":452},"({ ",[431,1211,1212],{"class":456},"...",[431,1214,1215],{"class":452},"body, sessionId }) });\n",[431,1217,1219,1221,1224,1226,1228,1231,1233],{"class":433,"line":1218},12,[431,1220,1162],{"class":456},[431,1222,1223],{"class":441}," data",[431,1225,981],{"class":456},[431,1227,1170],{"class":456},[431,1229,1230],{"class":452}," res.",[431,1232,604],{"class":1036},[431,1234,1235],{"class":452},"();\n",[431,1237,1239,1242,1245,1248,1251,1253,1256,1259,1262,1265],{"class":433,"line":1238},13,[431,1240,1241],{"class":456},"  if",[431,1243,1244],{"class":452}," (data.searchId) ",[431,1246,1247],{"class":456},"for",[431,1249,1250],{"class":452}," (",[431,1252,975],{"class":456},[431,1254,1255],{"class":441}," hit",[431,1257,1258],{"class":456}," of",[431,1260,1261],{"class":452}," data.items) searchOf.",[431,1263,1264],{"class":1036},"set",[431,1266,1267],{"class":452},"(hit.id, data.searchId);\n",[431,1269,1271,1274],{"class":433,"line":1270},14,[431,1272,1273],{"class":456},"  return",[431,1275,1276],{"class":452}," data;\n",[431,1278,1280],{"class":433,"line":1279},15,[431,1281,1282],{"class":452},"}\n",[431,1284,1286],{"class":433,"line":1285},16,[431,1287,1093],{"emptyLinePlaceholder":1092},[431,1289,1291,1293,1295,1298,1300,1303],{"class":433,"line":1290},17,[431,1292,1139],{"class":456},[431,1294,1145],{"class":456},[431,1296,1297],{"class":1036}," track",[431,1299,1046],{"class":452},[431,1301,1302],{"class":437},"events",[431,1304,1156],{"class":452},[431,1306,1308,1310,1313,1315,1318,1320,1322,1325,1328,1331,1334,1337,1340,1343,1345],{"class":433,"line":1307},18,[431,1309,1162],{"class":456},[431,1311,1312],{"class":441}," body",[431,1314,981],{"class":456},[431,1316,1317],{"class":441}," JSON",[431,1319,352],{"class":452},[431,1321,1206],{"class":1036},[431,1323,1324],{"class":452},"(events.",[431,1326,1327],{"class":1036},"map",[431,1329,1330],{"class":452},"((",[431,1332,1333],{"class":437},"e",[431,1335,1336],{"class":452},") ",[431,1338,1339],{"class":456},"=>",[431,1341,1342],{"class":452}," ({ sessionId, ",[431,1344,1212],{"class":456},[431,1346,1347],{"class":452},"e })));\n",[431,1349,1351,1353,1355,1357,1359,1361,1364,1366,1368,1370,1372,1375,1378,1381,1384,1387,1389],{"class":433,"line":1350},19,[431,1352,1273],{"class":456},[431,1354,1173],{"class":1036},[431,1356,1046],{"class":452},[431,1358,1178],{"class":445},[431,1360,1181],{"class":441},[431,1362,1363],{"class":445},"}\u002Fv1\u002Fevents\u002F${",[431,1365,1187],{"class":441},[431,1367,1115],{"class":445},[431,1369,1192],{"class":452},[431,1371,1195],{"class":445},[431,1373,1374],{"class":452},", headers, body, keepalive: ",[431,1376,1377],{"class":441},"true",[431,1379,1380],{"class":452}," }).",[431,1382,1383],{"class":1036},"catch",[431,1385,1386],{"class":452},"(() ",[431,1388,1339],{"class":456},[431,1390,1391],{"class":452}," {});\n",[431,1393,1395],{"class":433,"line":1394},20,[431,1396,1282],{"class":452},[431,1398,1400],{"class":433,"line":1399},21,[431,1401,1093],{"emptyLinePlaceholder":1092},[431,1403,1405],{"class":433,"line":1404},22,[431,1406,1407],{"class":969},"\u002F\u002F Call these from your result list, product page and checkout.\n",[431,1409,1411,1413,1416,1419,1421,1423,1425,1427,1429,1431,1433,1435,1438,1441,1444,1447],{"class":433,"line":1410},23,[431,1412,1139],{"class":456},[431,1414,1415],{"class":456}," const",[431,1417,1418],{"class":1036}," click",[431,1420,981],{"class":456},[431,1422,1250],{"class":452},[431,1424,527],{"class":437},[431,1426,531],{"class":452},[431,1428,534],{"class":437},[431,1430,1336],{"class":452},[431,1432,1339],{"class":456},[431,1434,1297],{"class":1036},[431,1436,1437],{"class":452},"([{ type: ",[431,1439,1440],{"class":445},"'click'",[431,1442,1443],{"class":452},", itemId, position, searchId: searchOf.",[431,1445,1446],{"class":1036},"get",[431,1448,1449],{"class":452},"(itemId) }]);\n",[431,1451,1453,1455,1457,1460,1462,1464,1466,1468,1470,1472,1474,1476,1478,1480,1482,1484,1486,1489,1492,1494],{"class":433,"line":1452},24,[431,1454,1139],{"class":456},[431,1456,1415],{"class":456},[431,1458,1459],{"class":1036}," addToCart",[431,1461,981],{"class":456},[431,1463,1250],{"class":452},[431,1465,527],{"class":437},[431,1467,531],{"class":452},[431,1469,548],{"class":437},[431,1471,531],{"class":452},[431,1473,551],{"class":437},[431,1475,531],{"class":452},[431,1477,555],{"class":437},[431,1479,1336],{"class":452},[431,1481,1339],{"class":456},[431,1483,1297],{"class":1036},[431,1485,1437],{"class":452},[431,1487,1488],{"class":445},"'add_to_cart'",[431,1490,1491],{"class":452},", itemId, quantity, price, currency, searchId: searchOf.",[431,1493,1446],{"class":1036},[431,1495,1449],{"class":452},[431,1497,1499,1501,1503,1506,1508,1510,1512,1514,1516,1518,1520,1522],{"class":433,"line":1498},25,[431,1500,1139],{"class":456},[431,1502,1415],{"class":456},[431,1504,1505],{"class":1036}," purchase",[431,1507,981],{"class":456},[431,1509,1250],{"class":452},[431,1511,569],{"class":437},[431,1513,531],{"class":452},[431,1515,555],{"class":437},[431,1517,531],{"class":452},[431,1519,575],{"class":437},[431,1521,1336],{"class":452},[431,1523,1524],{"class":456},"=>\n",[431,1526,1528,1531,1533,1536,1539,1541,1543,1546,1548,1550,1553,1555,1558,1560],{"class":433,"line":1527},26,[431,1529,1530],{"class":1036},"  track",[431,1532,1437],{"class":452},[431,1534,1535],{"class":445},"'purchase'",[431,1537,1538],{"class":452},", orderId, currency, items: items.",[431,1540,1327],{"class":1036},[431,1542,1330],{"class":452},[431,1544,1545],{"class":437},"i",[431,1547,1336],{"class":452},[431,1549,1339],{"class":456},[431,1551,1552],{"class":452}," ({ ",[431,1554,1212],{"class":456},[431,1556,1557],{"class":452},"i, searchId: searchOf.",[431,1559,1446],{"class":1036},[431,1561,1562],{"class":452},"(i.itemId) })) }]);\n",[431,1564,1566,1568,1570,1573,1575,1577,1579,1581,1583,1585,1587,1589,1591,1594],{"class":433,"line":1565},27,[431,1567,1139],{"class":456},[431,1569,1415],{"class":456},[431,1571,1572],{"class":1036}," suggestionClick",[431,1574,981],{"class":456},[431,1576,1250],{"class":452},[431,1578,595],{"class":437},[431,1580,531],{"class":452},[431,1582,527],{"class":437},[431,1584,1336],{"class":452},[431,1586,1339],{"class":456},[431,1588,1297],{"class":1036},[431,1590,1437],{"class":452},[431,1592,1593],{"class":445},"'suggestion_click'",[431,1595,1596],{"class":452},", suggestion, itemId }]);\n",[369,1598,1599,1602,1603,1606,1607,1609],{},[349,1600,1601],{},"searchOf"," lives in memory, so it is empty on the product page after a full navigation. Keep it in ",[349,1604,1605],{},"sessionStorage"," if your store is not a single-page app, or rely on the session fallback: the ",[349,1608,505],{}," is enough for the cart and the order to find the last search.",[337,1611,1613],{"id":1612},"what-is-stored","What is stored",[369,1615,1616,1617,1621,1622,1626,1627,1631],{},"Each event is stored with its type, the search it was tied to, the normalized query of that search, the item, position, quantity, price, revenue and currency as sent, the order id, the salted session hash, the device class and country, and the ",[376,1618,1620],{"href":1619},"\u002Fdocs\u002Fanalytics\u002Fsearch-analytics#what-counts-as-real-traffic","traffic source"," of the request. Events from an ",[376,1623,1625],{"href":1624},"\u002Fdocs\u002Fanalytics\u002Fsearch-analytics#excluded-ip-addresses","excluded IP address"," or a crawler are kept but left out of the reports. Events follow the same ",[376,1628,1630],{"href":1629},"\u002Fdocs\u002Fanalytics\u002Fsearch-analytics#retention","retention"," as searches.",[337,1633,1635],{"id":1634},"errors","Errors",[1637,1638,1639,1654],"table",{},[1640,1641,1642],"thead",{},[1643,1644,1645,1648,1651],"tr",{},[1646,1647,326],"th",{},[1646,1649,1650],{},"Code",[1646,1652,1653],{},"Meaning",[1655,1656,1657,1675,1688,1701,1714],"tbody",{},[1643,1658,1659,1663,1668],{},[1660,1661,1662],"td",{},"400",[1660,1664,1665],{},[349,1666,1667],{},"VALIDATION_FAILED",[1660,1669,1670,1671,1674],{},"A field is missing or wrong; ",[349,1672,1673],{},"details"," names it. The body must be an array of 1 to 100 events.",[1643,1676,1677,1680,1685],{},[1660,1678,1679],{},"401",[1660,1681,1682],{},[349,1683,1684],{},"UNAUTHENTICATED",[1660,1686,1687],{},"No key, or an unknown, revoked or expired one.",[1643,1689,1690,1693,1698],{},[1660,1691,1692],{},"403",[1660,1694,1695],{},[349,1696,1697],{},"ORIGIN_NOT_ALLOWED",[1660,1699,1700],{},"A public key from an origin that is not on its list.",[1643,1702,1703,1706,1711],{},[1660,1704,1705],{},"404",[1660,1707,1708],{},[349,1709,1710],{},"PROFILE_NOT_FOUND",[1660,1712,1713],{},"No saved profile with that key in the key's project.",[1643,1715,1716,1719,1724],{},[1660,1717,1718],{},"429",[1660,1720,1721],{},[349,1722,1723],{},"RATE_LIMITED",[1660,1725,1726,1727,352],{},"The search rate limit; see ",[376,1728,1729],{"href":86},"Rate limits",[337,1731,1733],{"id":1732},"common-mistakes","Common mistakes",[1735,1736,1737,1740,1746,1754],"ul",{},[345,1738,1739],{},"Sending the search id of the wrong search. A product can show up for several searches. Keep the id of the search that showed the result the shopper clicked.",[345,1741,1742,1743,1745],{},"Leaving out the session id. Without it, a purchase without ",[349,1744,351],{}," per line cannot be tied to anything.",[345,1747,1748,1749,1751,1752,352],{},"Prices per line, not per order. ",[349,1750,551],{}," is one unit; revenue is ",[349,1753,916],{},[345,1755,1756,1757,1760],{},"Tracking from a server with a public key. A server sends no ",[349,1758,1759],{},"Origin"," header, so the public key is refused. Use a secret key from a server.",[337,1762,1764],{"id":1763},"related","Related",[1735,1766,1767,1771,1775,1779,1784,1788],{},[345,1768,1769],{},[376,1770,260],{"href":261},[345,1772,1773],{},[376,1774,265],{"href":266},[345,1776,1777],{},[376,1778,206],{"href":207},[345,1780,1781],{},[376,1782,1783],{"href":30},"Storefront integration",[345,1785,1786],{},[376,1787,242],{"href":249},[345,1789,1790],{},[376,1791,35],{"href":36},[1793,1794,1795],"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}html pre.shiki code .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}html pre.shiki code .s6m-Y, html code.shiki .s6m-Y{--shiki-light:#622CBC;--shiki-default:#622CBC;--shiki-dark:#DBB7FF}",{"title":427,"searchDepth":460,"depth":460,"links":1797},[1798,1799,1800,1801,1802,1803,1804,1805,1806],{"id":339,"depth":460,"text":340},{"id":395,"depth":460,"text":396},{"id":498,"depth":460,"text":499},{"id":888,"depth":460,"text":889},{"id":920,"depth":460,"text":921},{"id":1612,"depth":460,"text":1613},{"id":1634,"depth":460,"text":1635},{"id":1732,"depth":460,"text":1733},{"id":1763,"depth":460,"text":1764},"md",{},{"icon":275},{"title":271,"description":274},"cXpU6mBd5DbBIKSWyRJMK_Se8m4L1VLTe6fWgHnvmTk",[1813,1814],{"title":265,"path":266,"stem":267,"description":268,"icon":269,"children":-1},{"title":284,"path":285,"stem":286,"description":287,"icon":288,"children":-1},1793717706325]