[{"data":1,"prerenderedAt":1071},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Findexing\u002Ffull-sync":331,"docs-\u002Fdocs\u002Findexing\u002Ffull-sync-surround":1068},[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":115,"body":333,"description":118,"extension":1063,"meta":1064,"navigation":1065,"path":116,"seo":1066,"stem":117,"__hash__":1067},"docs\u002Fdocs\u002F4.indexing\u002F4.full-sync.md",{"type":334,"value":335,"toc":1047},"minimark",[336,341,345,348,361,369,384,388,391,402,418,422,719,723,742,750,753,758,769,852,856,859,926,929,933,942,946,1001,1005,1019,1023,1043],[337,338,340],"h2",{"id":339},"when-to-use-a-replace-session","When to use a replace session",[342,343,344],"p",{},"Upserts and deletes change the documents you name. They cannot remove a product you forgot to delete. A replace session makes the index hold exactly what you send: you open it, send the whole catalog in batches and commit. Search switches to the new catalog in one step, and every document you did not send is gone.",[342,346,347],{},"Use a replace session when:",[349,350,351,355,358],"ul",{},[352,353,354],"li",{},"your shop exports the full catalog on a schedule, for example every night, and you have no reliable list of deleted products;",[352,356,357],{},"the index has drifted from the shop and you want a clean copy;",[352,359,360],{},"you changed the mapping and want to rebuild from your source data instead of from the stored documents.",[342,362,363,364,368],{},"Use ",[365,366,367],"a",{"href":110},"upserts and deletes"," for changes during the day. They are cheaper, and they keep working while a session is open.",[370,371,372],"note",{},[342,373,374,375,379,380,383],{},"A replace session is an API workflow, meant for your export script or shop plugin. The cabinet has no control to open, fill or commit one. It shows an open session in the ",[376,377,378],"strong",{},"Reindex"," panel and lets you abort it. If you want Zaproo to fetch your full catalog on a schedule without writing code, set up a ",[365,381,382],{"href":128},"data source"," instead: it also deletes products that left your feed.",[337,385,387],{"id":386},"how-a-session-works","How a session works",[342,389,390],{},"Opening a session builds a new, empty version of the index next to the live one, with the saved mapping. Search keeps using the live version the whole time.",[349,392,393,396,399],{},[352,394,395],{},"Batches sent to the session go to the new version only.",[352,397,398],{},"Normal upserts and deletes sent while the session is open go to both versions, so they survive the commit.",[352,400,401],{},"Commit waits until every batch is written, then swaps search to the new version in one step.",[342,403,404,405,409,410,413,414,417],{},"The index's status is ",[406,407,408],"code",{},"REINDEXING"," while the session is open, and its ",[406,411,412],{},"buildingVersion"," is the session's ",[406,415,416],{},"version",".",[337,419,421],{"id":420},"run-a-sync","Run a sync",[423,424,426,431,437,498,581,587,591,594,609,677,681,691,695,698],"steps",{"level":425},"3",[427,428,430],"h3",{"id":429},"open-a-session","Open a session",[432,433],"api-route",{"auth":434,"method":435,"path":436},"Project admin or a full-access secret key","POST","\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Freplace-sessions",[438,439,444],"pre",{"className":440,"code":441,"language":442,"meta":443,"style":443},"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\u002Fprojects\u002F$PROJECT_ID\u002Findices\u002F$INDEX_ID\u002Freplace-sessions \\\n  -H \"Authorization: Bearer $ZS_KEY\"\n","bash","",[406,445,446,483],{"__ignoreMap":443},[447,448,451,455,459,463,466,470,473,476,479],"span",{"class":449,"line":450},"line",1,[447,452,454],{"class":453},"szw1H","curl",[447,456,458],{"class":457},"ssYy9"," -X",[447,460,462],{"class":461},"semJd"," POST",[447,464,465],{"class":461}," https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F",[447,467,469],{"class":468},"s7iLA","$PROJECT_ID",[447,471,472],{"class":461},"\u002Findices\u002F",[447,474,475],{"class":468},"$INDEX_ID",[447,477,478],{"class":461},"\u002Freplace-sessions",[447,480,482],{"class":481},"sklAV"," \\\n",[447,484,486,489,492,495],{"class":449,"line":485},2,[447,487,488],{"class":457},"  -H",[447,490,491],{"class":461}," \"Authorization: Bearer ",[447,493,494],{"class":468},"$ZS_KEY",[447,496,497],{"class":461},"\"\n",[438,499,503],{"className":500,"code":501,"language":502,"meta":443,"style":443},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","{\n  \"id\": \"5d2c9a40-8a51-4c3e-b8f1-2f6d0e7c9b13\",\n  \"version\": 4,\n  \"status\": \"OPEN\",\n  \"expiresAt\": \"2026-10-16T15:30:00.000Z\",\n  \"commitTaskId\": null\n}\n","json",[406,504,505,510,525,538,551,564,575],{"__ignoreMap":443},[447,506,507],{"class":449,"line":450},[447,508,509],{"class":468},"{\n",[447,511,512,516,519,522],{"class":449,"line":485},[447,513,515],{"class":514},"sb7M8","  \"id\"",[447,517,518],{"class":468},": ",[447,520,521],{"class":461},"\"5d2c9a40-8a51-4c3e-b8f1-2f6d0e7c9b13\"",[447,523,524],{"class":468},",\n",[447,526,528,531,533,536],{"class":449,"line":527},3,[447,529,530],{"class":514},"  \"version\"",[447,532,518],{"class":468},[447,534,535],{"class":457},"4",[447,537,524],{"class":468},[447,539,541,544,546,549],{"class":449,"line":540},4,[447,542,543],{"class":514},"  \"status\"",[447,545,518],{"class":468},[447,547,548],{"class":461},"\"OPEN\"",[447,550,524],{"class":468},[447,552,554,557,559,562],{"class":449,"line":553},5,[447,555,556],{"class":514},"  \"expiresAt\"",[447,558,518],{"class":468},[447,560,561],{"class":461},"\"2026-10-16T15:30:00.000Z\"",[447,563,524],{"class":468},[447,565,567,570,572],{"class":449,"line":566},6,[447,568,569],{"class":514},"  \"commitTaskId\"",[447,571,518],{"class":468},[447,573,574],{"class":457},"null\n",[447,576,578],{"class":449,"line":577},7,[447,579,580],{"class":468},"}\n",[342,582,583,584,417],{},"Only one version can be built at a time. If a reindex or another session is running, the API answers ",[406,585,586],{},"409 VERSION_BUILDING",[427,588,590],{"id":589},"send-the-catalog-in-batches","Send the catalog in batches",[432,592],{"auth":434,"method":435,"path":593},"\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Freplace-sessions\u002F:sessionId\u002Fdocuments",[342,595,596,597,600,601,604,605,608],{},"The body is the same bare array as an upsert, with the same limits: up to 1000 documents and 10 MB per request. Each batch answers ",[406,598,599],{},"202"," with a ",[406,602,603],{},"SESSION_BATCH"," task. Send an ",[406,606,607],{},"Idempotency-Key"," with each batch so a retry does not send it twice.",[438,610,612],{"className":440,"code":611,"language":442,"meta":443,"style":443},"curl -X POST https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F$PROJECT_ID\u002Findices\u002F$INDEX_ID\u002Freplace-sessions\u002F$SESSION_ID\u002Fdocuments \\\n  -H \"Authorization: Bearer $ZS_KEY\" -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Idempotency-Key: nightly-2026-10-16-batch-1\" \\\n  -d '[{\"id\": \"tape-48\", \"title\": \"Brown packaging tape 48mm\", \"price\": 1.86}]'\n",[406,613,614,641,660,669],{"__ignoreMap":443},[447,615,616,618,620,622,624,626,628,630,633,636,639],{"class":449,"line":450},[447,617,454],{"class":453},[447,619,458],{"class":457},[447,621,462],{"class":461},[447,623,465],{"class":461},[447,625,469],{"class":468},[447,627,472],{"class":461},[447,629,475],{"class":468},[447,631,632],{"class":461},"\u002Freplace-sessions\u002F",[447,634,635],{"class":468},"$SESSION_ID",[447,637,638],{"class":461},"\u002Fdocuments",[447,640,482],{"class":481},[447,642,643,645,647,649,652,655,658],{"class":449,"line":485},[447,644,488],{"class":457},[447,646,491],{"class":461},[447,648,494],{"class":468},[447,650,651],{"class":461},"\"",[447,653,654],{"class":457}," -H",[447,656,657],{"class":461}," \"Content-Type: application\u002Fjson\"",[447,659,482],{"class":481},[447,661,662,664,667],{"class":449,"line":527},[447,663,488],{"class":457},[447,665,666],{"class":461}," \"Idempotency-Key: nightly-2026-10-16-batch-1\"",[447,668,482],{"class":481},[447,670,671,674],{"class":449,"line":540},[447,672,673],{"class":457},"  -d",[447,675,676],{"class":461}," '[{\"id\": \"tape-48\", \"title\": \"Brown packaging tape 48mm\", \"price\": 1.86}]'\n",[427,678,680],{"id":679},"check-every-batch","Check every batch",[342,682,683,684,686,687,690],{},"Poll each batch task until it finishes, or watch the ",[406,685,603],{}," rows on the index's ",[376,688,689],{},"Tasks"," page. A document that failed in a batch is not in the new version, so it disappears from search when you commit. Fix and resend failed documents before you commit.",[427,692,694],{"id":693},"commit","Commit",[432,696],{"auth":434,"method":435,"path":697},"\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Freplace-sessions\u002F:sessionId\u002Fcommit",[342,699,700,701,600,703,706,707,710,711,714,715,718],{},"The answer is ",[406,702,599],{},[406,704,705],{},"SESSION_COMMIT"," task. The session moves to ",[406,708,709],{},"COMMITTING"," and takes no more batches. When the task succeeds, the session is ",[406,712,713],{},"COMMITTED",", the index's ",[406,716,717],{},"activeVersion"," is the session's version and search returns the new catalog.",[337,720,722],{"id":721},"watch-a-session","Watch a session",[342,724,725,726,729,730,733,734,736,737,739,740,417],{},"In the cabinet, open the index, then ",[376,727,728],{},"Fields & mapping",". While a session is ",[406,731,732],{},"OPEN"," or ",[406,735,709],{},", the ",[376,738,378],{}," panel at the top says so, with the session's version and when it expires. The index overview shows the same panel while a version is being built. The session's batch and commit tasks are listed on ",[376,741,689],{},[342,743,744],{},[745,746],"img",{"alt":747,"src":748,"title":749},"The Fields & mapping page with the Reindex panel on top showing the status READY and live version 1, above the field table","\u002Fdocs\u002Fscreenshots\u002Fmapping.png","The Reindex panel sits at the top of Fields & mapping, and lists an open session there",[342,751,752],{},"With the API:",[432,754],{"auth":755,"method":756,"path":757},"Project member or any secret key","GET","\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Freplace-sessions\u002F:sessionId",[342,759,760,761,764,765,768],{},"The index itself names its open session in ",[406,762,763],{},"openReplaceSessionId",". The session's ",[406,766,767],{},"status"," is one of:",[770,771,772,784],"table",{},[773,774,775],"thead",{},[776,777,778,781],"tr",{},[779,780,326],"th",{},[779,782,783],{},"Meaning",[785,786,787,797,806,815,825,839],"tbody",{},[776,788,789,794],{},[790,791,792],"td",{},[406,793,732],{},[790,795,796],{},"Takes batches.",[776,798,799,803],{},[790,800,801],{},[406,802,709],{},[790,804,805],{},"Commit is running. No more batches.",[776,807,808,812],{},[790,809,810],{},[406,811,713],{},[790,813,814],{},"The new catalog is live.",[776,816,817,822],{},[790,818,819],{},[406,820,821],{},"ABORTED",[790,823,824],{},"You aborted it. The live index is as it was.",[776,826,827,832],{},[790,828,829],{},[406,830,831],{},"EXPIRED",[790,833,834,835,838],{},"It stayed open past ",[406,836,837],{},"expiresAt",". The live index is as it was.",[776,840,841,846],{},[790,842,843],{},[406,844,845],{},"FAILED",[790,847,848,849,851],{},"The commit failed. The live index is as it was, and the index status is ",[406,850,845],{}," until the next build.",[337,853,855],{"id":854},"abort-a-session","Abort a session",[342,857,858],{},"Aborting drops the new version and cancels batches that have not finished. Search never sees any of it.",[860,861,862,883],"tabs",{},[863,864,866],"tabs-item",{"icon":275,"label":865},"Cabinet",[342,867,868,869,871,872,874,875,878,879,882],{},"Open the index, then ",[376,870,728],{},". In the ",[376,873,378],{}," panel, click ",[376,876,877],{},"Abort session",". It acts at once, with no confirmation step. ",[376,880,881],{},"Cancel reindex"," stays off while a session is open, because it does not apply to a session. Only organization owners and admins see these buttons.",[863,884,886],{"icon":885,"label":454},"i-lucide-terminal",[438,887,889],{"className":440,"code":888,"language":442,"meta":443,"style":443},"curl -X POST https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F$PROJECT_ID\u002Findices\u002F$INDEX_ID\u002Freplace-sessions\u002F$SESSION_ID\u002Fabort \\\n  -H \"Authorization: Bearer $ZS_KEY\"\n",[406,890,891,916],{"__ignoreMap":443},[447,892,893,895,897,899,901,903,905,907,909,911,914],{"class":449,"line":450},[447,894,454],{"class":453},[447,896,458],{"class":457},[447,898,462],{"class":461},[447,900,465],{"class":461},[447,902,469],{"class":468},[447,904,472],{"class":461},[447,906,475],{"class":468},[447,908,632],{"class":461},[447,910,635],{"class":468},[447,912,913],{"class":461},"\u002Fabort",[447,915,482],{"class":481},[447,917,918,920,922,924],{"class":449,"line":485},[447,919,488],{"class":457},[447,921,491],{"class":461},[447,923,494],{"class":468},[447,925,497],{"class":461},[432,927],{"auth":434,"method":435,"path":928},"\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Freplace-sessions\u002F:sessionId\u002Fabort",[337,930,932],{"id":931},"session-lifetime","Session lifetime",[342,934,935,936,938,939,941],{},"A session expires 6 hours after it was opened, counted from the open, not from the last batch. Within a minute of ",[406,937,837],{},", an open session becomes ",[406,940,831],{}," and its new version is dropped. Commit before then. A session that is already committing does not expire.",[337,943,945],{"id":944},"errors","Errors",[770,947,948,958],{},[773,949,950],{},[776,951,952,955],{},[779,953,954],{},"Code",[779,956,957],{},"When",[785,959,960,969,981,991],{},[776,961,962,966],{},[790,963,964],{},[406,965,586],{},[790,967,968],{},"Opening a session while a reindex or another session builds a version.",[776,970,971,976],{},[790,972,973],{},[406,974,975],{},"409 SESSION_NOT_OPEN",[790,977,978,979,417],{},"Sending a batch, committing or aborting a session that is no longer ",[406,980,732],{},[776,982,983,988],{},[790,984,985],{},[406,986,987],{},"404 SESSION_NOT_FOUND",[790,989,990],{},"The session does not exist or belongs to another index.",[776,992,993,998],{},[790,994,995],{},[406,996,997],{},"400 INVALID_DOCUMENTS",[790,999,1000],{},"A batch has documents that do not match the mapping. Nothing from that batch is written.",[337,1002,1004],{"id":1003},"common-mistakes","Common mistakes",[349,1006,1007,1010,1016],{},[352,1008,1009],{},"Committing before every batch task has finished without errors. Commit waits for the batches, but it does not check their results. Failed documents are missing from the new catalog.",[352,1011,1012,1013,1015],{},"Opening a session and never committing it. The index stays ",[406,1014,408],{},", and no reindex or breaking mapping change can start until the session expires 6 hours later. Abort it instead.",[352,1017,1018],{},"Running a full sync for a handful of changes. Upserts are enough, and they do not block other builds.",[337,1020,1022],{"id":1021},"related","Related",[349,1024,1025,1029,1033,1037],{},[352,1026,1027],{},[365,1028,109],{"href":110},[352,1030,1031],{},[365,1032,121],{"href":122},[352,1034,1035],{},[365,1036,127],{"href":128},[352,1038,1039],{},[365,1040,1042],{"href":1041},"\u002Fdocs\u002Findexing\u002Fdocuments#follow-a-task","Follow a task",[1044,1045,1046],"style",{},"html pre.shiki code .szw1H, html code.shiki .szw1H{--shiki-light:#702C00;--shiki-default:#702C00;--shiki-dark:#FFB757}html pre.shiki code .ssYy9, html code.shiki .ssYy9{--shiki-light:#023B95;--shiki-default:#023B95;--shiki-dark:#91CBFF}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}html pre.shiki code .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sklAV, html code.shiki .sklAV{--shiki-light:#A0111F;--shiki-default:#A0111F;--shiki-dark:#FF9492}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}",{"title":443,"searchDepth":485,"depth":485,"links":1048},[1049,1050,1051,1057,1058,1059,1060,1061,1062],{"id":339,"depth":485,"text":340},{"id":386,"depth":485,"text":387},{"id":420,"depth":485,"text":421,"children":1052},[1053,1054,1055,1056],{"id":429,"depth":527,"text":430},{"id":589,"depth":527,"text":590},{"id":679,"depth":527,"text":680},{"id":693,"depth":527,"text":694},{"id":721,"depth":485,"text":722},{"id":854,"depth":485,"text":855},{"id":931,"depth":485,"text":932},{"id":944,"depth":485,"text":945},{"id":1003,"depth":485,"text":1004},{"id":1021,"depth":485,"text":1022},"md",{},{"icon":119},{"title":115,"description":118},"v78Dro4tUDJUch9GHh593-7eDsMHcXGz7rj9yFx-xNU",[1069,1070],{"title":109,"path":110,"stem":111,"description":112,"icon":113,"children":-1},{"title":121,"path":122,"stem":123,"description":124,"icon":125,"children":-1},1793717706306]