[{"data":1,"prerenderedAt":1153},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Fgetting-started\u002Fai-assistant":331,"docs-\u002Fdocs\u002Fgetting-started\u002Fai-assistant-surround":1150},[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":41,"body":333,"description":44,"extension":1145,"meta":1146,"navigation":1147,"path":42,"seo":1148,"stem":43,"__hash__":1149},"docs\u002Fdocs\u002F1.getting-started\u002F5.ai-assistant.md",{"type":334,"value":335,"toc":1128},"minimark",[336,341,345,353,357,363,404,407,411,433,483,501,507,516,520,523,541,544,563,570,584,596,625,629,632,636,651,662,764,815,888,892,895,899,905,908,919,923,926,930,937,942,945,980,983,986,992,996,1024,1028,1031,1093,1103,1107,1124],[337,338,340],"h2",{"id":339},"what-it-does","What it does",[342,343,344],"p",{},"The AI shopping assistant is a chat widget you embed on your storefront. Shoppers ask for products in their own words, and it searches the indexes you choose and answers from what it finds.",[342,346,347,348,352],{},"Set it up under ",[349,350,351],"strong",{},"AI assistant"," in your project.",[337,354,356],{"id":355},"create-an-assistant","Create an assistant",[342,358,359,360,362],{},"A project can have several assistants, for example one per storefront or language. Open ",[349,361,351],{}," in the cabinet and create one; each has its own sources, instructions, look and widget key. The number of assistants per project is limited by the platform.",[364,365,366,374,383,390,397],"ol",{},[367,368,369,370,373],"li",{},"Add the ",[349,371,372],{},"sources",": each one is an index and one of its search profiles. Write a short description for every source, for example \"Boots catalog with prices\" or \"Store policies, returns and shipping\". The assistant reads these descriptions to decide where to look, so a product index and an FAQ index each need one.",[367,375,376,377,382],{},"For each source, map the fields: which one is the title, image, price and link. Then choose ",[378,379,381],"a",{"href":380},"#what-the-assistant-can-read","what the assistant can read",".",[367,384,385,386,389],{},"Optionally add ",[349,387,388],{},"additional instructions",", free text of up to 4 000 characters: store facts, tone and what to recommend or avoid, such as \"Free returns within 30 days.\" They are added to the platform's prompt and can't replace its rules; any part that conflicts is ignored.",[367,391,392,393,396],{},"Try it in the ",[349,394,395],{},"test panel"," next to the form. It runs your unsaved draft, so you can check answers before saving. Test turns count toward the monthly token limit.",[367,398,399,400,403],{},"Switch the assistant ",[349,401,402],{},"Live"," when it is ready. An assistant that is not live does not answer on your site.",[342,405,406],{},"The assistant only searches the sources you list, and only what the profile allows.",[337,408,410],{"id":409},"what-the-assistant-can-read","What the assistant can read",[342,412,413,414,418,419,422,423,422,426,429,430,432],{},"Each source sorts fields into three lists. Type an exact field name or a pattern with one ",[415,416,417],"code",{},"*",", such as ",[415,420,421],{},"attributes.*",", ",[415,424,425],{},"internal_*",[415,427,428],{},"*_cost"," or ",[415,431,417],{}," for everything. Naming an object covers everything under it.",[434,435,436,449],"table",{},[437,438,439],"thead",{},[440,441,442,446],"tr",{},[443,444,445],"th",{},"List",[443,447,448],{},"What happens",[450,451,452,463,473],"tbody",{},[440,453,454,460],{},[455,456,457],"td",{},[349,458,459],{},"In every search result",[455,461,462],{},"Sent with each search hit, cut to 500 characters (1000 for a field whose name contains \"desc\"). Use it for short facts such as colour or brand.",[440,464,465,470],{},[455,466,467],{},[349,468,469],{},"On request",[455,471,472],{},"Read when a shopper asks about one specific product and the search results do not answer it. The assistant can read up to 12 000 characters at a time. Use it for long text.",[440,474,475,480],{},[455,476,477],{},[349,478,479],{},"Never",[455,481,482],{},"Never reaches the model, and wins over the other two. The assistant also cannot filter or sort on it, and its facet values are not sent. A title, image, price or link field cannot be in this list, because product cards show it.",[342,484,485,486,429,488,490,491,493,494,496,497,500],{},"Only mapped fields are ever read. These lists decide alone: a pattern also selects fields hidden from public search, so ",[415,487,417],{},[415,489,421],{}," can show the assistant a field marked not returnable. Put anything it must not see in ",[349,492,479],{},". ",[349,495,479],{}," always applies, including to text a language group borrows from another index. The ",[349,498,499],{},"Preview"," under the lists shows what each mapped field gets.",[342,502,503,504,506],{},"These lists choose what the assistant reads, whatever fields the search profile returns. The profile still decides which products a search can find, and the query can still match text in a field listed under ",[349,505,479],{},", so keep fields you never want matched out of the profile's search fields.",[342,508,509,510,512,513,515],{},"New sources in the cabinet start with ",[415,511,417],{}," under ",[349,514,469],{},". Sources created through the API or MCP, and existing ones, start with all lists empty.",[337,517,519],{"id":518},"product-cards-and-badges","Product cards and badges",[342,521,522],{},"The reply is a short verdict: the product the assistant would pick for each thing asked for, and the fact that decides it. It answers more fully when the shopper asks for an explanation or a comparison.",[342,524,525,526,529,530,533,534,429,537,540],{},"The reasons go on the cards. When the assistant recommends products, it picks the cards to show, best first, and writes a one-sentence note on each saying why it suits the request. When the shopper asked for several different things, the cards are grouped under short headings such as ",[415,527,528],{},"Boxes"," and ",[415,531,532],{},"Tape",". It can also add short badges such as ",[415,535,536],{},"In stock",[415,538,539],{},"Width: 200 mm"," for facts the title does not state. The cards appear under its reply, once the reply is written. If it picks none, the widget shows the best hits of each search instead, so each thing asked for is represented.",[342,542,543],{},"A note never contains a link and is cut at 140 characters.",[342,545,546,547,429,549,551,552,554,555,558,559,562],{},"A badge's value is always read from the product, and only from a field under ",[349,548,459],{},[349,550,469],{},", or the title, price or link field. A field under ",[349,553,479],{}," cannot become a badge. The assistant chooses only the label and the unit. A ",[415,556,557],{},"true"," value shows the label alone, a ",[415,560,561],{},"false"," or empty value shows no badge, and a list shows its first three values. A number of 1 000 000 or more with no unit shows no badge, as such a raw value says nothing to a shopper.",[342,564,565,566,569],{},"Open ",[349,567,568],{},"Chat widgets"," in the assistant's settings to turn the curated list, its badges or their colours off. Notes and headings stay when badges are off. With the list off, the assistant keeps showing the cards its searches find.",[342,571,572,573,576,577,579,580,583],{},"A yes\u002Fno field shows your own wording, so the assistant can't describe it wrongly. Without wording, a yes shows the field's name (",[415,574,575],{},"in_stock"," becomes ",[415,578,536],{},") and a no shows nothing. Set a label for both answers to show ",[415,581,582],{},"Out of stock"," too, or to translate them.",[342,585,586,587,422,590,529,593,382],{},"Colours mean something rather than decorate: green for a clear match, amber for a limitation and blue for a highlighted fact. The assistant adds one only when it helps the shopper. Override them with ",[415,588,589],{},".zp-badge.positive",[415,591,592],{},".zp-badge.warning",[415,594,595],{},".zp-badge.info",[342,597,598,599,422,602,422,605,422,608,422,611,422,614,529,617,620,621,624],{},"To style the cards with custom CSS, use ",[415,600,601],{},".zp-info",[415,603,604],{},".zp-title",[415,606,607],{},".zp-note",[415,609,610],{},".zp-foot",[415,612,613],{},".zp-price",[415,615,616],{},".zp-badges",[415,618,619],{},".zp-badge",", and ",[415,622,623],{},".zp-group"," for a heading. Every card has the same layout, with the price under the title.",[337,626,628],{"id":627},"appearance","Appearance",[342,630,631],{},"The assistant page also has the look and feel with a live preview: mode, colours, corner radius, position, name, greeting, input placeholder, up to four starter questions, the text shown when the assistant is unavailable, and an optional custom CSS block.",[337,633,635],{"id":634},"add-it-to-your-pages","Add it to your pages",[342,637,638,639,642,643,646,647,650],{},"Each assistant has its own ",[349,640,641],{},"widget key"," (",[415,644,645],{},"zs_ak_...","), shown on its page. List your shop's domains under ",[349,648,649],{},"Allowed origins"," there; the widget refuses to talk from any other site. If a key leaks, regenerate it: the old one stops working at once and you paste the new one into your pages.",[342,652,653,654,657,658,661],{},"The two script tags can go anywhere on the page. The end of ",[415,655,656],{},"\u003Cbody>"," is recommended, so the widget never delays your content; from ",[415,659,660],{},"\u003Chead>"," it waits until the page has loaded before it appears.",[663,664,669],"pre",{"className":665,"code":666,"language":667,"meta":668,"style":668},"language-html shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","\u003Cscript src=\"https:\u002F\u002Fsearch.zaproo.cloud\u002Fwidget\u002Fassistant.js\">\u003C\u002Fscript>\n\u003Cscript>\n  window.zaproo.assistant({\n    key: 'zs_ak_...',\n    apiUrl: 'https:\u002F\u002Fapi.search.zaproo.cloud',\n  });\n\u003C\u002Fscript>\n","html","",[415,670,671,703,712,725,737,748,754],{"__ignoreMap":668},[672,673,676,680,684,688,691,695,698,700],"span",{"class":674,"line":675},"line",1,[672,677,679],{"class":678},"s7iLA","\u003C",[672,681,683],{"class":682},"sb7M8","script",[672,685,687],{"class":686},"ssYy9"," src",[672,689,690],{"class":678},"=",[672,692,694],{"class":693},"semJd","\"https:\u002F\u002Fsearch.zaproo.cloud\u002Fwidget\u002Fassistant.js\"",[672,696,697],{"class":678},">\u003C\u002F",[672,699,683],{"class":682},[672,701,702],{"class":678},">\n",[672,704,706,708,710],{"class":674,"line":705},2,[672,707,679],{"class":678},[672,709,683],{"class":682},[672,711,702],{"class":678},[672,713,715,718,722],{"class":674,"line":714},3,[672,716,717],{"class":678},"  window.zaproo.",[672,719,721],{"class":720},"s6m-Y","assistant",[672,723,724],{"class":678},"({\n",[672,726,728,731,734],{"class":674,"line":727},4,[672,729,730],{"class":678},"    key: ",[672,732,733],{"class":693},"'zs_ak_...'",[672,735,736],{"class":678},",\n",[672,738,740,743,746],{"class":674,"line":739},5,[672,741,742],{"class":678},"    apiUrl: ",[672,744,745],{"class":693},"'https:\u002F\u002Fapi.search.zaproo.cloud'",[672,747,736],{"class":678},[672,749,751],{"class":674,"line":750},6,[672,752,753],{"class":678},"  });\n",[672,755,757,760,762],{"class":674,"line":756},7,[672,758,759],{"class":678},"\u003C\u002F",[672,761,683],{"class":682},[672,763,702],{"class":678},[765,766,767,778,787,806],"field-group",{},[768,769,772],"field",{"name":770,"type":771,":required":557},"key","string",[342,773,774,775,777],{},"The assistant's widget key (",[415,776,645],{},").",[768,779,781],{"name":780,"type":771,":required":557},"apiUrl",[342,782,783,784,382],{},"The API address, ",[415,785,786],{},"https:\u002F\u002Fapi.search.zaproo.cloud",[768,788,791],{"name":789,"type":790},"mode","'bubble' | 'drawer' | 'inline'",[342,792,793,794,797,798,801,802,805],{},"Overrides the mode chosen for the assistant in the cabinet. ",[415,795,796],{},"bubble"," is a launcher with a floating panel, ",[415,799,800],{},"drawer"," slides in from the side, ",[415,803,804],{},"inline"," fills an element on the page.",[768,807,810],{"name":808,"type":809},"mount","string | HTMLElement",[342,811,812,813,382],{},"A CSS selector or element to render into. Use it with ",[415,814,804],{},[663,816,818],{"className":665,"code":817,"language":667,"meta":668,"style":668},"\u003Cdiv id=\"help\">\u003C\u002Fdiv>\n\u003Cscript>\n  window.zaproo.assistant({ key: 'zs_ak_...', apiUrl: 'https:\u002F\u002Fapi.search.zaproo.cloud', mode: 'inline', mount: '#help' });\n\u003C\u002Fscript>\n",[415,819,820,841,849,880],{"__ignoreMap":668},[672,821,822,824,827,830,832,835,837,839],{"class":674,"line":675},[672,823,679],{"class":678},[672,825,826],{"class":682},"div",[672,828,829],{"class":686}," id",[672,831,690],{"class":678},[672,833,834],{"class":693},"\"help\"",[672,836,697],{"class":678},[672,838,826],{"class":682},[672,840,702],{"class":678},[672,842,843,845,847],{"class":674,"line":705},[672,844,679],{"class":678},[672,846,683],{"class":682},[672,848,702],{"class":678},[672,850,851,853,855,858,860,863,865,868,871,874,877],{"class":674,"line":714},[672,852,717],{"class":678},[672,854,721],{"class":720},[672,856,857],{"class":678},"({ key: ",[672,859,733],{"class":693},[672,861,862],{"class":678},", apiUrl: ",[672,864,745],{"class":693},[672,866,867],{"class":678},", mode: ",[672,869,870],{"class":693},"'inline'",[672,872,873],{"class":678},", mount: ",[672,875,876],{"class":693},"'#help'",[672,878,879],{"class":678}," });\n",[672,881,882,884,886],{"class":674,"line":727},[672,883,759],{"class":678},[672,885,683],{"class":682},[672,887,702],{"class":678},[337,889,891],{"id":890},"token-limits","Token limits",[342,893,894],{},"Every answer uses model tokens, and your plan includes a monthly amount. The free plan has none, so the assistant is unavailable there. When the limit is reached the widget shows your unavailable text until the next month. Staff can set a different monthly limit for a single organization.",[337,896,898],{"id":897},"conversations-and-retention","Conversations and retention",[342,900,901,904],{},[349,902,903],{},"Conversations"," in the cabinet lists what shoppers asked, what the assistant answered, which products it showed and the tokens used. You can delete a single conversation.",[342,906,907],{},"Conversations are deleted automatically after the retention period. The default is 90 days and you can set anything from 7 to 365 days.",[342,909,910,911,914,915,918],{},"Each page load starts a new chat in the widget, and ",[349,912,913],{},"New chat"," in its header starts one at any time. Shoppers find their earlier chats under ",[349,916,917],{},"Chats",", in the same browser, and can pick one up where they left it. Those chats are deleted after the assistant's retention period like any other conversation.",[337,920,922],{"id":921},"privacy","Privacy",[342,924,925],{},"Shoppers' messages and the assistant's answers are stored, and they are visible to your team and to Zaproo platform staff. Tell your shoppers, and add it to your privacy policy. The widget sends a random visitor id kept in the shopper's browser, not a name or an email. Shoppers should not be asked to type personal data into the chat.",[337,927,929],{"id":928},"how-the-ai-assistant-handles-data-with-model-providers","How the AI assistant handles data with model providers",[342,931,932,933,382],{},"The assistant does not run its own language model. Each answer is written by a model at an outside provider that Zaproo staff configure for the platform. You do not pick the provider, and the same assistant can be served by more than one: if the first provider in the chain fails, the turn goes to the next one. A separate scope check, which decides whether a message is about your shop, can use a different provider from the one that writes the answer. Treat every provider configured on the platform as a sub-processor. The list is on the ",[378,934,936],{"href":935},"\u002Flegal\u002Fsubprocessors","sub-processors page",[938,939,941],"h3",{"id":940},"what-is-sent-to-the-provider","What is sent to the provider",[342,943,944],{},"Every turn sends:",[946,947,948,954,960,969],"ul",{},[367,949,950,953],{},[349,951,952],{},"The system prompt",": the assistant's name, your instructions, the descriptions of your sources, and the platform's own rules.",[367,955,956,959],{},[349,957,958],{},"The recent conversation",": up to the last 20 messages, meaning the shopper's messages, the assistant's earlier answers and its earlier searches.",[367,961,962,965,966,968],{},[349,963,964],{},"Search results",": for the first hits of each search, the title, price and link, the fields under ",[349,967,459],{},", the hit count and the top facet values. Images are not sent unless you list the image field.",[367,970,971,974,975,529,977,979],{},[349,972,973],{},"Product details",": when the assistant reads a product on request, the fields under ",[349,976,459],{},[349,978,469],{}," for that product.",[342,981,982],{},"The scope check sends the shopper's latest message, up to four messages before it (each cut to 500 characters), the assistant's name and your source descriptions.",[342,984,985],{},"The provider does not get the visitor id, the shopper's IP address or the page address. It gets whatever the shopper typed, so personal data written into the chat reaches the provider. Do not map fields that hold personal data, and keep personal data out of your instructions.",[342,987,988,989,991],{},"Test turns from the ",[349,990,395],{}," go to the provider in the same way.",[938,993,995],{"id":994},"what-zaproo-stores","What Zaproo stores",[946,997,998,1003,1012,1018],{},[367,999,1000,1002],{},[349,1001,903],{},": each message's text, the searches made and products shown, the tokens used, the model and provider that answered, the response time, and the scope check's verdict. They are stored with the random visitor id and the site the chat ran on. They are deleted after the assistant's retention period (90 days by default, 7 to 365 days), or sooner when you delete one.",[367,1004,1005,1008,1009,1011],{},[349,1006,1007],{},"Test chats",": turns from the test panel are stored as test conversations. Zaproo staff can see them; your ",[349,1010,903],{}," list does not show them. The same retention period applies.",[367,1013,1014,1017],{},[349,1015,1016],{},"Token counts",": daily and monthly totals per organization and assistant, with no message text. They are kept for billing after the conversations are gone.",[367,1019,1020,1023],{},[349,1021,1022],{},"Backups",": database backups are kept for 30 days, so deleted conversations can remain in a backup for up to 30 days.",[938,1025,1027],{"id":1026},"what-providers-keep","What providers keep",[342,1029,1030],{},"Each provider has its own default retention, set by its API terms and by the account behind the API key Zaproo configures. The summary below reflects the providers' published API data policies as we understand them. It is not a contractual statement, so check the provider's current terms.",[434,1032,1033,1049],{},[437,1034,1035],{},[440,1036,1037,1040,1043,1046],{},[443,1038,1039],{},"Provider",[443,1041,1042],{},"Training on API data",[443,1044,1045],{},"Default retention",[443,1047,1048],{},"Zero data retention",[450,1050,1051,1065,1079],{},[440,1052,1053,1056,1059,1062],{},[455,1054,1055],{},"Anthropic",[455,1057,1058],{},"Not used by default under the commercial terms",[455,1060,1061],{},"Kept for a limited period, longer if flagged by trust and safety; confirm the current period with Anthropic",[455,1063,1064],{},"An account-level agreement with Anthropic",[440,1066,1067,1070,1073,1076],{},[455,1068,1069],{},"OpenAI",[455,1071,1072],{},"Not used unless the account opts in",[455,1074,1075],{},"Up to 30 days for abuse monitoring, longer when the law requires it",[455,1077,1078],{},"An account-level arrangement OpenAI approves for eligible accounts and endpoints",[440,1080,1081,1084,1087,1090],{},[455,1082,1083],{},"OpenAI-compatible (Ollama Cloud, a gateway, a self-hosted server)",[455,1085,1086],{},"Depends on who runs the endpoint",[455,1088,1089],{},"Depends on who runs the endpoint; confirm with that vendor",[455,1091,1092],{},"Depends on the vendor. A model on your own servers involves no third party.",[342,1094,1095,1098,1099,1102],{},[349,1096,1097],{},"Zero data retention is not on by default."," It is an agreement between the account holder and each provider, not a switch in a request. The platform sends no retention header, so the provider's default retention applies to every request until such an agreement covers the API key in use. Requests to OpenAI ask it not to store completions (",[415,1100,1101],{},"store: false","), which keeps them out of OpenAI's stored completions but does not shorten its abuse-monitoring retention. Ask us which providers serve the platform and whether zero data retention is in place for them.",[938,1104,1106],{"id":1105},"for-the-platform-operator","For the platform operator",[364,1108,1109,1112,1115,1118,1121],{},[367,1110,1111],{},"Use only providers whose API terms exclude training on your data, and record each one on the sub-processor list with its region.",[367,1113,1114],{},"Ask Anthropic and OpenAI for zero data retention on the organizations whose keys are configured, and keep the written confirmation.",[367,1116,1117],{},"For an OpenAI-compatible endpoint, get the vendor's retention, logging and hosting region in writing. A gateway may forward to further providers.",[367,1119,1120],{},"Configure the guard and fallback chains only with providers that meet the same bar, since each of them receives shopper messages.",[367,1122,1123],{},"Update this page and the sub-processor list when a provider or its terms change.",[1125,1126,1127],"style",{},"html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}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 .s6m-Y, html code.shiki .s6m-Y{--shiki-light:#622CBC;--shiki-default:#622CBC;--shiki-dark:#DBB7FF}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);}",{"title":668,"searchDepth":705,"depth":705,"links":1129},[1130,1131,1132,1133,1134,1135,1136,1137,1138,1139],{"id":339,"depth":705,"text":340},{"id":355,"depth":705,"text":356},{"id":409,"depth":705,"text":410},{"id":518,"depth":705,"text":519},{"id":627,"depth":705,"text":628},{"id":634,"depth":705,"text":635},{"id":890,"depth":705,"text":891},{"id":897,"depth":705,"text":898},{"id":921,"depth":705,"text":922},{"id":928,"depth":705,"text":929,"children":1140},[1141,1142,1143,1144],{"id":940,"depth":714,"text":941},{"id":994,"depth":714,"text":995},{"id":1026,"depth":714,"text":1027},{"id":1105,"depth":714,"text":1106},"md",{},{"icon":45},{"title":41,"description":44},"ykFmG3FKYJtYwgc0qP581ROgxMPnt_zG588mEUWkDOA",[1151,1152],{"title":35,"path":36,"stem":37,"description":38,"icon":39,"children":-1},{"title":55,"path":56,"stem":57,"description":58,"icon":59,"children":-1},1793717706299]