[{"data":1,"prerenderedAt":1732},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Fgetting-started\u002Fstorefront":331,"docs-\u002Fdocs\u002Fgetting-started\u002Fstorefront-surround":1729},[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":29,"body":333,"description":32,"extension":1724,"meta":1725,"navigation":1726,"path":30,"seo":1727,"stem":31,"__hash__":1728},"docs\u002Fdocs\u002F1.getting-started\u002F3.storefront.md",{"type":334,"value":335,"toc":1708},"minimark",[336,341,345,367,378,382,385,467,470,474,483,512,775,779,792,850,858,862,868,871,1041,1044,1248,1289,1292,1305,1400,1421,1425,1428,1431,1475,1600,1633,1637,1674,1678,1704],[337,338,340],"h2",{"id":339},"what-you-build","What you build",[342,343,344],"p",{},"A shop search has three parts, and each one is a single API call:",[346,347,348,357,360],"ul",{},[349,350,351,352,356],"li",{},"The search results page calls ",[353,354,355],"code",{},"POST \u002Fv1\u002Fsearch\u002F\u003CprofileKey>"," with the query, the selected filters, the sort and the page.",[349,358,359],{},"The facets next to the results come back in the same answer. A click on a facet value adds a filter and searches again.",[349,361,362,363,366],{},"The autocomplete box calls ",[353,364,365],{},"POST \u002Fv1\u002Fsuggest\u002F\u003CsuggestKey>"," on every keystroke and shows the suggestions.",[342,368,369,370,374,375,377],{},"Before you start, you need an index with documents and a ",[371,372,373],"a",{"href":213},"search profile",". ",[371,376,23],{"href":24}," sets up both in the cabinet.",[337,379,381],{"id":380},"find-the-keys-in-the-cabinet","Find the keys in the cabinet",[342,383,384],{},"The code below needs three values. All of them are in the cabinet.",[386,387,389,394,430,434,440,448,452],"steps",{"level":388},"3",[390,391,393],"h3",{"id":392},"the-api-key","The API key",[342,395,396,397,400,401,404,405,408,409,412,413,416,417,420,421,424,425,429],{},"Open the project's ",[398,399,80],"strong",{}," page and click ",[398,402,403],{},"New key",". For the browser, pick ",[398,406,407],{},"Public key (pk), browser side"," as the ",[398,410,411],{},"Type"," and enter your shop's domains under ",[398,414,415],{},"Allowed origins",", one per line. Click ",[398,418,419],{},"Create key",", then ",[398,422,423],{},"Copy key",". The full key is shown only once. See ",[371,426,428],{"href":427},"\u002Fdocs\u002Fkeys\u002Fapi-keys#create-a-key","Create a key",".",[390,431,433],{"id":432},"the-profile-key","The profile key",[342,435,436,437,439],{},"Open the index's ",[398,438,212],{}," page. Each profile's key is the code under its name. The search results page sends it in the search URL.",[342,441,442],{},[443,444],"img",{"alt":445,"src":446,"title":447},"The Search profiles list with one profile, Storefront, its profile key under the name and the chips 8 fields, Index facets and Sort: Relevance","\u002Fdocs\u002Fscreenshots\u002Fprofiles-list.png","The profile key sits under the profile name",[390,449,451],{"id":450},"the-suggest-key","The suggest key",[342,453,436,454,456,457,460,461,464,465,429],{},[398,455,242],{}," page. The ",[398,458,459],{},"Suggest key"," box has a ",[398,462,463],{},"Copy"," button. The autocomplete box sends this key in the suggest URL. See ",[371,466,242],{"href":249},[342,468,469],{},"The profile key and the suggest key are not secrets. Every request still needs the API key.",[337,471,473],{"id":472},"call-the-api-from-the-browser","Call the API from the browser",[475,476,477],"tip",{},[342,478,479,480,482],{},"The ",[371,481,35],{"href":36}," makes these calls for you, in the browser and on your server, and sends the analytics events too. This page shows the raw routes it uses.",[342,484,485,486,489,490,492,493,496,497,500,501,504,505,508,509,429],{},"Use a public key (",[353,487,488],{},"zs_pk_…",") whose ",[398,491,415],{}," list your shop's domains, for example ",[353,494,495],{},"shop.example.com"," and ",[353,498,499],{},"*.shop.example.com",". A public key can only search and suggest, so it is safe in frontend code. The browser sends the page's ",[353,502,503],{},"Origin"," header with every call, and the API answers only the origins on the key's list; any other site gets ",[353,506,507],{},"403 ORIGIN_NOT_ALLOWED",". See ",[371,510,80],{"href":511},"\u002Fdocs\u002Fkeys\u002Fapi-keys#allowed-origins",[513,514,519],"pre",{"className":515,"code":516,"language":517,"meta":518,"style":518},"language-js shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","const API = 'https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1';\nconst KEY = 'zs_pk_...'; \u002F\u002F public key, allowed on https:\u002F\u002Fshop.example.com\nconst PROFILE_KEY = '...'; \u002F\u002F the search profile's profileKey\n\nexport async function search(body) {\n  const res = await fetch(`${API}\u002Fsearch\u002F${PROFILE_KEY}`, {\n    method: 'POST',\n    headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application\u002Fjson' },\n    body: JSON.stringify(body),\n  });\n  if (!res.ok) throw new Error((await res.json()).error.code);\n  return res.json();\n}\n","js","",[353,520,521,545,565,583,590,616,653,665,694,711,717,756,769],{"__ignoreMap":518},[522,523,526,530,534,537,541],"span",{"class":524,"line":525},"line",1,[522,527,529],{"class":528},"sklAV","const",[522,531,533],{"class":532},"ssYy9"," API",[522,535,536],{"class":528}," =",[522,538,540],{"class":539},"semJd"," 'https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1'",[522,542,544],{"class":543},"s7iLA",";\n",[522,546,548,550,553,555,558,561],{"class":524,"line":547},2,[522,549,529],{"class":528},[522,551,552],{"class":532}," KEY",[522,554,536],{"class":528},[522,556,557],{"class":539}," 'zs_pk_...'",[522,559,560],{"class":543},"; ",[522,562,564],{"class":563},"sq92B","\u002F\u002F public key, allowed on https:\u002F\u002Fshop.example.com\n",[522,566,568,570,573,575,578,580],{"class":524,"line":567},3,[522,569,529],{"class":528},[522,571,572],{"class":532}," PROFILE_KEY",[522,574,536],{"class":528},[522,576,577],{"class":539}," '...'",[522,579,560],{"class":543},[522,581,582],{"class":563},"\u002F\u002F the search profile's profileKey\n",[522,584,586],{"class":524,"line":585},4,[522,587,589],{"emptyLinePlaceholder":588},true,"\n",[522,591,593,596,599,602,606,609,613],{"class":524,"line":592},5,[522,594,595],{"class":528},"export",[522,597,598],{"class":528}," async",[522,600,601],{"class":528}," function",[522,603,605],{"class":604},"s6m-Y"," search",[522,607,608],{"class":543},"(",[522,610,612],{"class":611},"szw1H","body",[522,614,615],{"class":543},") {\n",[522,617,619,622,625,627,630,633,635,638,641,644,647,650],{"class":524,"line":618},6,[522,620,621],{"class":528},"  const",[522,623,624],{"class":532}," res",[522,626,536],{"class":528},[522,628,629],{"class":528}," await",[522,631,632],{"class":604}," fetch",[522,634,608],{"class":543},[522,636,637],{"class":539},"`${",[522,639,640],{"class":532},"API",[522,642,643],{"class":539},"}\u002Fsearch\u002F${",[522,645,646],{"class":532},"PROFILE_KEY",[522,648,649],{"class":539},"}`",[522,651,652],{"class":543},", {\n",[522,654,656,659,662],{"class":524,"line":655},7,[522,657,658],{"class":543},"    method: ",[522,660,661],{"class":539},"'POST'",[522,663,664],{"class":543},",\n",[522,666,668,671,674,677,679,682,685,688,691],{"class":524,"line":667},8,[522,669,670],{"class":543},"    headers: { Authorization: ",[522,672,673],{"class":539},"`Bearer ${",[522,675,676],{"class":532},"KEY",[522,678,649],{"class":539},[522,680,681],{"class":543},", ",[522,683,684],{"class":539},"'Content-Type'",[522,686,687],{"class":543},": ",[522,689,690],{"class":539},"'application\u002Fjson'",[522,692,693],{"class":543}," },\n",[522,695,697,700,703,705,708],{"class":524,"line":696},9,[522,698,699],{"class":543},"    body: ",[522,701,702],{"class":532},"JSON",[522,704,429],{"class":543},[522,706,707],{"class":604},"stringify",[522,709,710],{"class":543},"(body),\n",[522,712,714],{"class":524,"line":713},10,[522,715,716],{"class":543},"  });\n",[522,718,720,723,726,729,732,735,738,741,744,747,750,753],{"class":524,"line":719},11,[522,721,722],{"class":528},"  if",[522,724,725],{"class":543}," (",[522,727,728],{"class":528},"!",[522,730,731],{"class":543},"res.ok) ",[522,733,734],{"class":528},"throw",[522,736,737],{"class":528}," new",[522,739,740],{"class":604}," Error",[522,742,743],{"class":543},"((",[522,745,746],{"class":528},"await",[522,748,749],{"class":543}," res.",[522,751,752],{"class":604},"json",[522,754,755],{"class":543},"()).error.code);\n",[522,757,759,762,764,766],{"class":524,"line":758},12,[522,760,761],{"class":528},"  return",[522,763,749],{"class":543},[522,765,752],{"class":604},[522,767,768],{"class":543},"();\n",[522,770,772],{"class":524,"line":771},13,[522,773,774],{"class":543},"}\n",[390,776,778],{"id":777},"or-from-your-server","Or from your server",[342,780,781,782,785,786,788,789,791],{},"Server-rendered pages can call the same routes from the shop's server. Use a secret key with read access, limited to the index the shop searches (see ",[371,783,80],{"href":784},"\u002Fdocs\u002Fkeys\u002Fapi-keys#index-scope","): a server call sends no ",[353,787,503],{}," header, so a public key answers ",[353,790,507],{}," there.",[513,793,797],{"className":794,"code":795,"language":796,"meta":518,"style":518},"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\u002Fsearch\u002F$PROFILE_KEY \\\n  -H \"Authorization: Bearer $ZS_KEY\" -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"q\": \"packing tape\", \"filters\": {\"color\": [\"Brown\", \"Clear\"]}, \"sort\": \"price:asc\", \"page\": 1}'\n","bash",[353,798,799,819,842],{"__ignoreMap":518},[522,800,801,804,807,810,813,816],{"class":524,"line":525},[522,802,803],{"class":611},"curl",[522,805,806],{"class":532}," -X",[522,808,809],{"class":539}," POST",[522,811,812],{"class":539}," https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fsearch\u002F",[522,814,815],{"class":543},"$PROFILE_KEY ",[522,817,818],{"class":528},"\\\n",[522,820,821,824,827,830,833,836,839],{"class":524,"line":547},[522,822,823],{"class":532},"  -H",[522,825,826],{"class":539}," \"Authorization: Bearer ",[522,828,829],{"class":543},"$ZS_KEY",[522,831,832],{"class":539},"\"",[522,834,835],{"class":532}," -H",[522,837,838],{"class":539}," \"Content-Type: application\u002Fjson\"",[522,840,841],{"class":528}," \\\n",[522,843,844,847],{"class":524,"line":567},[522,845,846],{"class":532},"  -d",[522,848,849],{"class":539}," '{\"q\": \"packing tape\", \"filters\": {\"color\": [\"Brown\", \"Clear\"]}, \"sort\": \"price:asc\", \"page\": 1}'\n",[851,852,853],"note",{},[342,854,855,856,429],{},"Rate limits count per key and per client IP: 600 searches and 1200 suggest requests per minute per key. Every shopper shares that key budget, from the browser too. From the browser each shopper has their own IP, while through your server they also share one IP. See ",[371,857,85],{"href":86},[337,859,861],{"id":860},"search-results-page","Search results page",[863,864],"api-route",{"auth":865,"method":866,"path":867},"Public key from an allowed origin, or any secret key of the project","POST","\u002Fv1\u002Fsearch\u002F:profileKey",[342,869,870],{},"The request body holds only what the shopper chose. Everything else, such as the fields to search and the facets to show, comes from the profile.",[872,873,874,892],"table",{},[875,876,877],"thead",{},[878,879,880,884,886,889],"tr",{},[881,882,883],"th",{},"Field",[881,885,411],{},[881,887,888],{},"Default",[881,890,891],{},"What it does",[893,894,895,919,937,956,974,996,1018],"tbody",{},[878,896,897,903,906,911],{},[898,899,900],"td",{},[353,901,902],{},"q",[898,904,905],{},"string, up to 500 characters",[898,907,908],{},[353,909,910],{},"\"\"",[898,912,913,914,918],{},"The query. An empty query returns every product, which is how a category page works. An ",[371,915,917],{"href":916},"\u002Fdocs\u002Fsearch\u002Frules#empty-search","empty-search rule"," picks the products that lead when there are no filters either.",[878,920,921,926,929,934],{},[898,922,923],{},[353,924,925],{},"filters",[898,927,928],{},"field → filter",[898,930,931],{},[353,932,933],{},"{}",[898,935,936],{},"The facet values and other filters the shopper selected.",[878,938,939,944,947,950],{},[898,940,941],{},[353,942,943],{},"sort",[898,945,946],{},"string",[898,948,949],{},"the profile's default sort",[898,951,952,953,429],{},"One of the profile's sort options, for example ",[353,954,955],{},"price:asc",[878,957,958,963,966,971],{},[898,959,960],{},[353,961,962],{},"page",[898,964,965],{},"integer from 1",[898,967,968],{},[353,969,970],{},"1",[898,972,973],{},"The page of results.",[878,975,976,981,984,990],{},[898,977,978],{},[353,979,980],{},"perPage",[898,982,983],{},"integer",[898,985,986,987],{},"the profile's ",[353,988,989],{},"perPage.default",[898,991,992,993,429],{},"Results per page, up to the profile's ",[353,994,995],{},"perPage.max",[878,997,998,1003,1006,1011],{},[898,999,1000],{},[353,1001,1002],{},"highlight",[898,1004,1005],{},"boolean",[898,1007,1008],{},[353,1009,1010],{},"false",[898,1012,1013,1014,1017],{},"Adds ",[353,1015,1016],{},"_highlight"," to every hit with the matched words marked.",[878,1019,1020,1025,1035,1038],{},[898,1021,1022],{},[353,1023,1024],{},"sessionId",[898,1026,1027,1028,1031,1032],{},"string, 1 to 100 letters, digits, ",[353,1029,1030],{},"-"," or ",[353,1033,1034],{},"_",[898,1036,1037],{},"none",[898,1039,1040],{},"One id per visitor, so paging through results stays stable.",[342,1042,1043],{},"The answer:",[513,1045,1048],{"className":1046,"code":1047,"language":752,"meta":518,"style":518},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","{\n  \"items\": [{ \"id\": \"tape-48\", \"title\": \"Brown packaging tape 48mm\", \"color\": \"Brown\", \"price\": 1.86 }],\n  \"total\": 42,\n  \"page\": 1,\n  \"perPage\": 24,\n  \"facets\": [\n    { \"type\": \"terms\", \"field\": \"color\", \"label\": \"Color\", \"items\": [{ \"key\": \"Brown\", \"count\": 18, \"selected\": true }] }\n  ],\n  \"correctedQuery\": null,\n  \"tookMs\": 12\n}\n",[353,1049,1050,1055,1105,1117,1128,1140,1148,1217,1222,1234,1244],{"__ignoreMap":518},[522,1051,1052],{"class":524,"line":525},[522,1053,1054],{"class":543},"{\n",[522,1056,1057,1061,1064,1067,1069,1072,1074,1077,1079,1082,1084,1087,1089,1092,1094,1097,1099,1102],{"class":524,"line":547},[522,1058,1060],{"class":1059},"sb7M8","  \"items\"",[522,1062,1063],{"class":543},": [{ ",[522,1065,1066],{"class":1059},"\"id\"",[522,1068,687],{"class":543},[522,1070,1071],{"class":539},"\"tape-48\"",[522,1073,681],{"class":543},[522,1075,1076],{"class":1059},"\"title\"",[522,1078,687],{"class":543},[522,1080,1081],{"class":539},"\"Brown packaging tape 48mm\"",[522,1083,681],{"class":543},[522,1085,1086],{"class":1059},"\"color\"",[522,1088,687],{"class":543},[522,1090,1091],{"class":539},"\"Brown\"",[522,1093,681],{"class":543},[522,1095,1096],{"class":1059},"\"price\"",[522,1098,687],{"class":543},[522,1100,1101],{"class":532},"1.86",[522,1103,1104],{"class":543}," }],\n",[522,1106,1107,1110,1112,1115],{"class":524,"line":567},[522,1108,1109],{"class":1059},"  \"total\"",[522,1111,687],{"class":543},[522,1113,1114],{"class":532},"42",[522,1116,664],{"class":543},[522,1118,1119,1122,1124,1126],{"class":524,"line":585},[522,1120,1121],{"class":1059},"  \"page\"",[522,1123,687],{"class":543},[522,1125,970],{"class":532},[522,1127,664],{"class":543},[522,1129,1130,1133,1135,1138],{"class":524,"line":592},[522,1131,1132],{"class":1059},"  \"perPage\"",[522,1134,687],{"class":543},[522,1136,1137],{"class":532},"24",[522,1139,664],{"class":543},[522,1141,1142,1145],{"class":524,"line":618},[522,1143,1144],{"class":1059},"  \"facets\"",[522,1146,1147],{"class":543},": [\n",[522,1149,1150,1153,1156,1158,1161,1163,1166,1168,1170,1172,1175,1177,1180,1182,1185,1187,1190,1192,1194,1196,1199,1201,1204,1206,1209,1211,1214],{"class":524,"line":655},[522,1151,1152],{"class":543},"    { ",[522,1154,1155],{"class":1059},"\"type\"",[522,1157,687],{"class":543},[522,1159,1160],{"class":539},"\"terms\"",[522,1162,681],{"class":543},[522,1164,1165],{"class":1059},"\"field\"",[522,1167,687],{"class":543},[522,1169,1086],{"class":539},[522,1171,681],{"class":543},[522,1173,1174],{"class":1059},"\"label\"",[522,1176,687],{"class":543},[522,1178,1179],{"class":539},"\"Color\"",[522,1181,681],{"class":543},[522,1183,1184],{"class":1059},"\"items\"",[522,1186,1063],{"class":543},[522,1188,1189],{"class":1059},"\"key\"",[522,1191,687],{"class":543},[522,1193,1091],{"class":539},[522,1195,681],{"class":543},[522,1197,1198],{"class":1059},"\"count\"",[522,1200,687],{"class":543},[522,1202,1203],{"class":532},"18",[522,1205,681],{"class":543},[522,1207,1208],{"class":1059},"\"selected\"",[522,1210,687],{"class":543},[522,1212,1213],{"class":532},"true",[522,1215,1216],{"class":543}," }] }\n",[522,1218,1219],{"class":524,"line":667},[522,1220,1221],{"class":543},"  ],\n",[522,1223,1224,1227,1229,1232],{"class":524,"line":696},[522,1225,1226],{"class":1059},"  \"correctedQuery\"",[522,1228,687],{"class":543},[522,1230,1231],{"class":532},"null",[522,1233,664],{"class":543},[522,1235,1236,1239,1241],{"class":524,"line":713},[522,1237,1238],{"class":1059},"  \"tookMs\"",[522,1240,687],{"class":543},[522,1242,1243],{"class":532},"12\n",[522,1245,1246],{"class":524,"line":719},[522,1247,774],{"class":543},[346,1249,1250,1262,1283],{},[349,1251,1252,1253,1256,1257,496,1259,1261],{},"Show ",[353,1254,1255],{},"total"," as the result count and build the pager from ",[353,1258,1255],{},[353,1260,980],{},". A page must start within the first 10000 results, so offer filters rather than page 500.",[349,1263,1264,1265,1268,1269,1272,1273,1276,1277,1279,1280,1282],{},"When ",[353,1266,1267],{},"correctedQuery"," is set, the query found nothing and did-you-mean found a better spelling. If ",[353,1270,1271],{},"items"," is not empty, the results come from that spelling: show \"Showing results for ",[1274,1275,1267],"em",{},"\". If ",[353,1278,1271],{}," is empty, the profile only suggests it: show \"Did you mean ",[1274,1281,1267],{},"?\" as a link.",[349,1284,1285,1286,429],{},"A hit carries the fields the profile returns. A hit placed by a ranking rule also has ",[353,1287,1288],{},"\"_pinned\": true",[337,1290,218],{"id":1291},"facets",[342,1293,1294,1295,1297,1298,1300,1301,1304],{},"Each entry in ",[353,1296,1291],{}," describes one facet to draw. Its ",[353,1299,1271],{}," are the values with their product counts, and ",[353,1302,1303],{},"selected"," marks the values the current filters picked.",[872,1306,1307,1322],{},[875,1308,1309],{},[878,1310,1311,1316,1319],{},[881,1312,1313],{},[353,1314,1315],{},"type",[881,1317,1318],{},"Draw it as",[881,1320,1321],{},"Filter to send when the shopper picks a value",[893,1323,1324,1340,1362,1384],{},[878,1325,1326,1331,1334],{},[898,1327,1328],{},[353,1329,1330],{},"terms",[898,1332,1333],{},"A list of checkboxes",[898,1335,1336,1339],{},[353,1337,1338],{},"{\"color\": [\"Brown\", \"Clear\"]}",". Several values match any of them.",[878,1341,1342,1347,1350],{},[898,1343,1344],{},[353,1345,1346],{},"range",[898,1348,1349],{},"A list of price bands",[898,1351,1352,1355,1356,496,1359,429],{},[353,1353,1354],{},"{\"price\": {\"gte\": 100, \"lt\": 500}}",", using the item's ",[353,1357,1358],{},"from",[353,1360,1361],{},"to",[878,1363,1364,1369,1379],{},[898,1365,1366],{},[353,1367,1368],{},"stats",[898,1370,1371,1372,1375,1376],{},"A slider from ",[353,1373,1374],{},"min"," to ",[353,1377,1378],{},"max",[898,1380,1381],{},[353,1382,1383],{},"{\"price\": {\"gte\": 150, \"lte\": 400}}",[878,1385,1386,1391,1394],{},[898,1387,1388],{},[353,1389,1390],{},"hierarchy",[898,1392,1393],{},"A category tree, one level at a time",[898,1395,1396,1399],{},[353,1397,1398],{},"{\"categories\": [\"Tapes>Duct tapes\"]}",". The facet then lists the children of the deepest selected node.",[342,1401,1402,1403,1406,1407,1410,1411,1414,1415,374,1418,1420],{},"Filters on different fields must all match. A request may filter only on fields the profile has as facets or lists under ",[353,1404,1405],{},"filterFields",". Any other field answers ",[353,1408,1409],{},"400 FILTER_NOT_ALLOWED",". A filter also accepts a single value, ",[353,1412,1413],{},"{\"inStock\": true}",", and ",[353,1416,1417],{},"{\"exists\": true}",[371,1419,212],{"href":213}," explains how to set up facets and filter fields.",[337,1422,1424],{"id":1423},"autocomplete-box","Autocomplete box",[863,1426],{"auth":865,"method":866,"path":1427},"\u002Fv1\u002Fsuggest\u002F:suggestKey",[342,1429,1430],{},"Send what the shopper has typed so far, up to 100 characters:",[513,1432,1434],{"className":794,"code":1433,"language":796,"meta":518,"style":518},"curl -X POST https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fsuggest\u002F$SUGGEST_KEY \\\n  -H \"Authorization: Bearer $ZS_KEY\" -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"q\": \"ta\"}'\n",[353,1435,1436,1452,1468],{"__ignoreMap":518},[522,1437,1438,1440,1442,1444,1447,1450],{"class":524,"line":525},[522,1439,803],{"class":611},[522,1441,806],{"class":532},[522,1443,809],{"class":539},[522,1445,1446],{"class":539}," https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fsuggest\u002F",[522,1448,1449],{"class":543},"$SUGGEST_KEY ",[522,1451,818],{"class":528},[522,1453,1454,1456,1458,1460,1462,1464,1466],{"class":524,"line":547},[522,1455,823],{"class":532},[522,1457,826],{"class":539},[522,1459,829],{"class":543},[522,1461,832],{"class":539},[522,1463,835],{"class":532},[522,1465,838],{"class":539},[522,1467,841],{"class":528},[522,1469,1470,1472],{"class":524,"line":567},[522,1471,846],{"class":532},[522,1473,1474],{"class":539}," '{\"q\": \"ta\"}'\n",[513,1476,1478],{"className":1046,"code":1477,"language":752,"meta":518,"style":518},"{\n  \"suggestions\": [\n    { \"text\": \"duct tape\", \"kind\": \"query\", \"facetHint\": { \"key\": \"categories\", \"value\": \"Tapes>Duct tapes\" } },\n    { \"text\": \"Tapes\", \"kind\": \"field\", \"facetHint\": null }\n  ],\n  \"searchProfileKey\": \"Ab3dE9xQk2LmP0sT\",\n  \"tookMs\": 3\n}\n",[353,1479,1480,1484,1491,1541,1571,1575,1587,1596],{"__ignoreMap":518},[522,1481,1482],{"class":524,"line":525},[522,1483,1054],{"class":543},[522,1485,1486,1489],{"class":524,"line":547},[522,1487,1488],{"class":1059},"  \"suggestions\"",[522,1490,1147],{"class":543},[522,1492,1493,1495,1498,1500,1503,1505,1508,1510,1513,1515,1518,1521,1523,1525,1528,1530,1533,1535,1538],{"class":524,"line":567},[522,1494,1152],{"class":543},[522,1496,1497],{"class":1059},"\"text\"",[522,1499,687],{"class":543},[522,1501,1502],{"class":539},"\"duct tape\"",[522,1504,681],{"class":543},[522,1506,1507],{"class":1059},"\"kind\"",[522,1509,687],{"class":543},[522,1511,1512],{"class":539},"\"query\"",[522,1514,681],{"class":543},[522,1516,1517],{"class":1059},"\"facetHint\"",[522,1519,1520],{"class":543},": { ",[522,1522,1189],{"class":1059},[522,1524,687],{"class":543},[522,1526,1527],{"class":539},"\"categories\"",[522,1529,681],{"class":543},[522,1531,1532],{"class":1059},"\"value\"",[522,1534,687],{"class":543},[522,1536,1537],{"class":539},"\"Tapes>Duct tapes\"",[522,1539,1540],{"class":543}," } },\n",[522,1542,1543,1545,1547,1549,1552,1554,1556,1558,1560,1562,1564,1566,1568],{"class":524,"line":585},[522,1544,1152],{"class":543},[522,1546,1497],{"class":1059},[522,1548,687],{"class":543},[522,1550,1551],{"class":539},"\"Tapes\"",[522,1553,681],{"class":543},[522,1555,1507],{"class":1059},[522,1557,687],{"class":543},[522,1559,1165],{"class":539},[522,1561,681],{"class":543},[522,1563,1517],{"class":1059},[522,1565,687],{"class":543},[522,1567,1231],{"class":532},[522,1569,1570],{"class":543}," }\n",[522,1572,1573],{"class":524,"line":592},[522,1574,1221],{"class":543},[522,1576,1577,1580,1582,1585],{"class":524,"line":618},[522,1578,1579],{"class":1059},"  \"searchProfileKey\"",[522,1581,687],{"class":543},[522,1583,1584],{"class":539},"\"Ab3dE9xQk2LmP0sT\"",[522,1586,664],{"class":543},[522,1588,1589,1591,1593],{"class":524,"line":655},[522,1590,1238],{"class":1059},[522,1592,687],{"class":543},[522,1594,1595],{"class":532},"3\n",[522,1597,1598],{"class":524,"line":667},[522,1599,774],{"class":543},[346,1601,1602,1613,1630],{},[349,1603,1604,1605,1607,1608,1610,1611,429],{},"With an empty ",[353,1606,902],{},", the answer lists the most searched queries, if autocomplete is set to show them. Ask for them when the search box gets focus. To show products in the same dropdown, send a search with an empty ",[353,1609,902],{}," at the same time, and choose the products with an ",[371,1612,917],{"href":916},[349,1614,1615,1616,1619,1620,1623,1624,1627,1628,429],{},"When the shopper picks a suggestion, search for its ",[353,1617,1618],{},"text"," with the profile in ",[353,1621,1622],{},"searchProfileKey",". If the suggestion has a ",[353,1625,1626],{},"facetHint",", add it as a filter: ",[353,1629,1398],{},[349,1631,1632],{},"Wait until the shopper pauses typing, about 150 ms, before you send the request. Drop answers that arrive after a newer request went out.",[337,1634,1636],{"id":1635},"common-mistakes","Common mistakes",[346,1638,1639,1656,1659,1666],{},[349,1640,1641,1642,1645,1646,1031,1648,1650,1651,1653,1654,429],{},"Forgetting a domain on the public key. A page on ",[353,1643,1644],{},"www.shop.example.com"," needs ",[353,1647,1644],{},[353,1649,499],{}," on the key's allowed origins, not only ",[353,1652,495],{},". Otherwise the API answers ",[353,1655,507],{},[349,1657,1658],{},"Putting a full-access secret key into frontend code. Anyone can read it and delete your indices. Keep secret keys on the server, and use read access for search.",[349,1660,1661,1662,1665],{},"Sending a sort the profile does not offer. The API answers ",[353,1663,1664],{},"400 SORT_NOT_ALLOWED",". Show only the profile's sort options.",[349,1667,1668,1669,1671,1672,429],{},"Filtering on a field that is not a facet. Add the field to the profile's ",[353,1670,1405],{}," first (in the profile editor or through the API), or the API answers ",[353,1673,1409],{},[337,1675,1677],{"id":1676},"related","Related",[346,1679,1680,1684,1688,1692,1696,1700],{},[349,1681,1682],{},[371,1683,212],{"href":213},[349,1685,1686],{},[371,1687,80],{"href":81},[349,1689,1690],{},[371,1691,242],{"href":249},[349,1693,1694],{},[371,1695,23],{"href":24},[349,1697,1698],{},[371,1699,85],{"href":86},[349,1701,1702],{},[371,1703,35],{"href":36},[1705,1706,1707],"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":518,"searchDepth":547,"depth":547,"links":1709},[1710,1711,1716,1719,1720,1721,1722,1723],{"id":339,"depth":547,"text":340},{"id":380,"depth":547,"text":381,"children":1712},[1713,1714,1715],{"id":392,"depth":567,"text":393},{"id":432,"depth":567,"text":433},{"id":450,"depth":567,"text":451},{"id":472,"depth":547,"text":473,"children":1717},[1718],{"id":777,"depth":567,"text":778},{"id":860,"depth":547,"text":861},{"id":1291,"depth":547,"text":218},{"id":1423,"depth":547,"text":1424},{"id":1635,"depth":547,"text":1636},{"id":1676,"depth":547,"text":1677},"md",{},{"icon":33},{"title":29,"description":32},"b6k-PS2DZUb2NSHsZga11eXh8RE7y0a7UFDVX1G6Udg",[1730,1731],{"title":23,"path":24,"stem":25,"description":26,"icon":27,"children":-1},{"title":35,"path":36,"stem":37,"description":38,"icon":39,"children":-1},1793717706297]