[{"data":1,"prerenderedAt":1888},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Findexing\u002Fdocuments":331,"docs-\u002Fdocs\u002Findexing\u002Fdocuments-surround":1885},[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":109,"body":333,"description":112,"extension":1880,"meta":1881,"navigation":1882,"path":110,"seo":1883,"stem":111,"__hash__":1884},"docs\u002Fdocs\u002F4.indexing\u002F3.documents.md",{"type":334,"value":335,"toc":1861},"minimark",[336,341,355,366,369,373,381,389,558,564,594,605,609,628,631,635,650,775,778,786,790,811,814,817,821,824,853,857,942,945,948,952,955,1069,1072,1091,1130,1133,1161,1172,1176,1191,1198,1208,1223,1226,1229,1261,1486,1507,1511,1589,1603,1607,1703,1707,1733,1758,1762,1769,1783,1786,1790,1800,1806,1810,1831,1835,1857],[337,338,340],"h2",{"id":339},"how-writes-work","How writes work",[342,343,344,345,349,350,354],"p",{},"A document is one product in your ",[346,347,348],"a",{"href":99},"index",". Every document write is asynchronous. Zaproo checks the batch, stores it and creates a task. A worker then writes the documents to the index. The ",[351,352,353],"strong",{},"Tasks"," page, or the task id the API answers with, tells you when the documents are searchable and which ones failed.",[342,356,357,358,361,362,365],{},"Use uploads and deletes for day-to-day changes: a price, a stock level, a new product. To send the whole catalog and drop everything you did not send, use a ",[346,359,360],{"href":116},"full catalog sync"," instead. To have Zaproo fetch your product feed on a schedule, set up a ",[346,363,364],{"href":128},"data source",".",[342,367,368],{},"Uploading and deleting needs the organization owner or admin role. Members can browse documents and tasks.",[337,370,372],{"id":371},"upsert-documents","Upsert documents",[342,374,375,376,380],{},"An upsert adds documents, or replaces the ones whose ",[377,378,379],"code",{},"id"," the index already holds. A replaced document is replaced as a whole: fields you leave out are gone from it afterwards, so always send the complete document.",[342,382,383],{},[384,385],"img",{"alt":386,"src":387,"title":388},"The Documents page with the Upload documents drop zone, a search box and a table of documents with ID, SKU, name, description and a View JSON button","\u002Fdocs\u002Fscreenshots\u002Fdocuments.png","Drop a JSON file on Upload documents",[390,391,392,415,537],"tabs",{},[393,394,396],"tabs-item",{"icon":275,"label":395},"Cabinet",[342,397,398,399,402,403,406,407,410,411,365],{},"Open the index, then ",[351,400,401],{},"Documents",", and drop a ",[377,404,405],{},".json"," file on ",[351,408,409],{},"Upload documents",", or click the area to choose one. See ",[346,412,414],{"href":413},"#upload-a-file-in-the-cabinet","upload a file in the cabinet",[393,416,419,425],{"icon":417,"label":418},"i-lucide-terminal","curl",[342,420,421,422,424],{},"The body is a bare JSON array of documents, not an object around one. Every document has an ",[377,423,379],{}," string of 1 to 512 bytes.",[426,427,432],"pre",{"className":428,"code":429,"language":430,"meta":431,"style":431},"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\u002Fdocuments \\\n  -H \"Authorization: Bearer $ZS_KEY\" -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Idempotency-Key: catalog-2026-10-16-batch-1\" \\\n  -d '[\n    {\"id\": \"tape-48\", \"title\": \"Brown packaging tape 48mm\", \"brand\": \"Demo Store\", \"price\": 1.86, \"attributes\": {\"color\": \"brown\"}},\n    {\"id\": \"box-300\", \"title\": \"Cardboard box 300x200x200mm\", \"brand\": \"Demo Store\", \"price\": 0.32, \"attributes\": {\"color\": \"brown\"}}\n  ]'\n# 202 {\"taskId\": \"0b9f7c1e-3a52-4f7e-9d0b-6a1c2e4d8f10\"}\n","bash","",[377,433,434,470,493,503,512,518,524,530],{"__ignoreMap":431},[435,436,439,442,446,450,453,457,460,463,466],"span",{"class":437,"line":438},"line",1,[435,440,418],{"class":441},"szw1H",[435,443,445],{"class":444},"ssYy9"," -X",[435,447,449],{"class":448},"semJd"," POST",[435,451,452],{"class":448}," https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F",[435,454,456],{"class":455},"s7iLA","$PROJECT_ID",[435,458,459],{"class":448},"\u002Findices\u002F",[435,461,462],{"class":455},"$INDEX_ID",[435,464,465],{"class":448},"\u002Fdocuments",[435,467,469],{"class":468},"sklAV"," \\\n",[435,471,473,476,479,482,485,488,491],{"class":437,"line":472},2,[435,474,475],{"class":444},"  -H",[435,477,478],{"class":448}," \"Authorization: Bearer ",[435,480,481],{"class":455},"$ZS_KEY",[435,483,484],{"class":448},"\"",[435,486,487],{"class":444}," -H",[435,489,490],{"class":448}," \"Content-Type: application\u002Fjson\"",[435,492,469],{"class":468},[435,494,496,498,501],{"class":437,"line":495},3,[435,497,475],{"class":444},[435,499,500],{"class":448}," \"Idempotency-Key: catalog-2026-10-16-batch-1\"",[435,502,469],{"class":468},[435,504,506,509],{"class":437,"line":505},4,[435,507,508],{"class":444},"  -d",[435,510,511],{"class":448}," '[\n",[435,513,515],{"class":437,"line":514},5,[435,516,517],{"class":448},"    {\"id\": \"tape-48\", \"title\": \"Brown packaging tape 48mm\", \"brand\": \"Demo Store\", \"price\": 1.86, \"attributes\": {\"color\": \"brown\"}},\n",[435,519,521],{"class":437,"line":520},6,[435,522,523],{"class":448},"    {\"id\": \"box-300\", \"title\": \"Cardboard box 300x200x200mm\", \"brand\": \"Demo Store\", \"price\": 0.32, \"attributes\": {\"color\": \"brown\"}}\n",[435,525,527],{"class":437,"line":526},7,[435,528,529],{"class":448},"  ]'\n",[435,531,533],{"class":437,"line":532},8,[435,534,536],{"class":535},"sq92B","# 202 {\"taskId\": \"0b9f7c1e-3a52-4f7e-9d0b-6a1c2e4d8f10\"}\n",[393,538,540,548],{"icon":279,"label":539},"MCP",[426,541,546],{"className":542,"code":544,"language":545,"meta":431},[543],"language-text","Upload the documents in .\u002Fcatalog.json to the products index and tell me when the task is done.\n","text",[377,547,544],{"__ignoreMap":431},[342,549,550,551,554,555,365],{},"The agent calls ",[377,552,553],{},"index_documents"," with up to 1000 documents per call, then ",[377,556,557],{},"get_task",[559,560],"api-route",{"auth":561,"method":562,"path":563},"Project admin or a full-access secret key","POST","\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Fdocuments",[342,565,566,567,570,571,573,574,577,578,581,582,585,586,589,590,593],{},"Before it creates the task, Zaproo checks every document against the ",[346,568,569],{"href":104},"mapping",". If any document has a value of the wrong type or the same ",[377,572,379],{}," appears twice in the batch, the whole batch is refused with ",[377,575,576],{},"400 INVALID_DOCUMENTS",". Nothing is written. ",[377,579,580],{},"details"," lists up to 20 problems, each with ",[377,583,584],{},"docId",", ",[377,587,588],{},"path"," and ",[377,591,592],{},"message",". Fix them and send the batch again.",[342,595,596,597,601,602,365],{},"Fields the mapping does not list are accepted and stored, but search ignores them. They show up as ",[346,598,600],{"href":599},"\u002Fdocs\u002Findexing\u002Fmapping#unmapped-fields","unmapped fields"," on ",[351,603,604],{},"Fields & mapping",[606,607,315],"h3",{"id":608},"limits",[610,611,612,616,622],"ul",{},[613,614,615],"li",{},"Up to 1000 documents per request.",[613,617,618,619,365],{},"Up to 10 MB of JSON per request. A larger body answers ",[377,620,621],{},"413 PAYLOAD_TOO_LARGE",[613,623,624,625,627],{},"A document ",[377,626,379],{}," is 1 to 512 bytes.",[342,629,630],{},"To send more through the API, split the catalog into batches and send them one after another. Each batch is its own task. The cabinet upload does the splitting for you.",[337,632,634],{"id":633},"upload-a-file-in-the-cabinet","Upload a file in the cabinet",[342,636,637,638,640,641,406,643,645,646,649],{},"On ",[351,639,401],{},", drop a ",[377,642,405],{},[351,644,409],{}," or click the area to choose one. The file holds a JSON array of documents, or an object with a ",[377,647,648],{},"documents"," array:",[426,651,655],{"className":652,"code":653,"language":654,"meta":431,"style":431},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","[\n  { \"id\": \"tape-48\", \"title\": \"Brown packaging tape 48mm\", \"color\": \"Brown\", \"price\": 1.86, \"categories\": [\"Tapes\"] },\n  { \"id\": \"box-300\", \"title\": \"Cardboard box 300x200x200mm\", \"color\": \"Brown\", \"price\": 0.32, \"categories\": [\"Boxes\"] }\n]\n","json",[377,656,657,662,721,770],{"__ignoreMap":431},[435,658,659],{"class":437,"line":438},[435,660,661],{"class":455},"[\n",[435,663,664,667,671,674,677,679,682,684,687,689,692,694,697,699,702,704,707,709,712,715,718],{"class":437,"line":472},[435,665,666],{"class":455},"  { ",[435,668,670],{"class":669},"sb7M8","\"id\"",[435,672,673],{"class":455},": ",[435,675,676],{"class":448},"\"tape-48\"",[435,678,585],{"class":455},[435,680,681],{"class":669},"\"title\"",[435,683,673],{"class":455},[435,685,686],{"class":448},"\"Brown packaging tape 48mm\"",[435,688,585],{"class":455},[435,690,691],{"class":669},"\"color\"",[435,693,673],{"class":455},[435,695,696],{"class":448},"\"Brown\"",[435,698,585],{"class":455},[435,700,701],{"class":669},"\"price\"",[435,703,673],{"class":455},[435,705,706],{"class":444},"1.86",[435,708,585],{"class":455},[435,710,711],{"class":669},"\"categories\"",[435,713,714],{"class":455},": [",[435,716,717],{"class":448},"\"Tapes\"",[435,719,720],{"class":455},"] },\n",[435,722,723,725,727,729,732,734,736,738,741,743,745,747,749,751,753,755,758,760,762,764,767],{"class":437,"line":495},[435,724,666],{"class":455},[435,726,670],{"class":669},[435,728,673],{"class":455},[435,730,731],{"class":448},"\"box-300\"",[435,733,585],{"class":455},[435,735,681],{"class":669},[435,737,673],{"class":455},[435,739,740],{"class":448},"\"Cardboard box 300x200x200mm\"",[435,742,585],{"class":455},[435,744,691],{"class":669},[435,746,673],{"class":455},[435,748,696],{"class":448},[435,750,585],{"class":455},[435,752,701],{"class":669},[435,754,673],{"class":455},[435,756,757],{"class":444},"0.32",[435,759,585],{"class":455},[435,761,711],{"class":669},[435,763,714],{"class":455},[435,765,766],{"class":448},"\"Boxes\"",[435,768,769],{"class":455},"] }\n",[435,771,772],{"class":437,"line":505},[435,773,774],{"class":455},"]\n",[342,776,777],{},"The cabinet splits the file into batches of up to 1000 documents and 10 MB, sends them one after another and shows a row for each batch's task as it runs.",[610,779,780,783],{},[613,781,782],{},"A batch the API refuses shows its error code and the documents at fault. The other batches still go through.",[613,784,785],{},"Each batch carries an Idempotency-Key made from the file's content and the batch number. After a failure, upload the same file again: batches already accepted in the last 24 hours are not written twice.",[337,787,789],{"id":788},"browse-documents","Browse documents",[342,791,792,793,795,796,798,799,802,803,806,807,810],{},"Open ",[351,794,401],{},". The table lists the stored documents in ",[377,797,379],{}," order, 20 at a time; click ",[351,800,801],{},"Load more"," for the next ones. Type an id or a value in the search box above the table to narrow it. ",[351,804,805],{},"View JSON"," shows a stored document as it is saved, unmapped fields included. ",[351,808,809],{},"Refresh"," loads the list again.",[342,812,813],{},"The search box matches a document id exactly, or the start of a value in a searchable or filterable field.",[342,815,816],{},"With the API:",[559,818],{"auth":819,"method":820,"path":563},"Project member or any secret key","GET",[559,822],{"auth":819,"method":820,"path":823},"\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Fdocuments\u002F:docId",[342,825,826,827,829,830,833,834,837,838,841,842,845,846,849,850,365],{},"The list returns documents ordered by ",[377,828,379],{},", as search sees them. ",[377,831,832],{},"limit"," is 1 to 100 (default 20). Pass ",[377,835,836],{},"nextCursor"," as ",[377,839,840],{},"cursor"," for the next page. ",[377,843,844],{},"q"," does what the search box does. One document by id answers ",[377,847,848],{},"404 DOCUMENT_NOT_FOUND"," when the index does not hold it. Over MCP, the tool is ",[377,851,852],{},"get_document",[337,854,856],{"id":855},"delete-documents","Delete documents",[390,858,859,870,929],{},[393,860,861],{"icon":275,"label":395},[342,862,792,863,865,866,869],{},[351,864,401],{}," and tick the documents in the table. Click ",[351,867,868],{},"Delete selected"," at the top of the page. The button shows how many are ticked. There is no confirmation step. The page shows the delete task's status and reloads the list when the task ends.",[393,871,872,875],{"icon":417,"label":418},[342,873,874],{},"The body is a bare JSON array of up to 1000 document ids.",[426,876,878],{"className":428,"code":877,"language":430,"meta":431,"style":431},"curl -X POST https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F$PROJECT_ID\u002Findices\u002F$INDEX_ID\u002Fdocuments\u002Fdelete \\\n  -H \"Authorization: Bearer $ZS_KEY\" -H \"Content-Type: application\u002Fjson\" \\\n  -d '[\"tape-48\", \"box-300\"]'\n# 202 {\"taskId\": \"...\"}\n",[377,879,880,901,917,924],{"__ignoreMap":431},[435,881,882,884,886,888,890,892,894,896,899],{"class":437,"line":438},[435,883,418],{"class":441},[435,885,445],{"class":444},[435,887,449],{"class":448},[435,889,452],{"class":448},[435,891,456],{"class":455},[435,893,459],{"class":448},[435,895,462],{"class":455},[435,897,898],{"class":448},"\u002Fdocuments\u002Fdelete",[435,900,469],{"class":468},[435,902,903,905,907,909,911,913,915],{"class":437,"line":472},[435,904,475],{"class":444},[435,906,478],{"class":448},[435,908,481],{"class":455},[435,910,484],{"class":448},[435,912,487],{"class":444},[435,914,490],{"class":448},[435,916,469],{"class":468},[435,918,919,921],{"class":437,"line":495},[435,920,508],{"class":444},[435,922,923],{"class":448}," '[\"tape-48\", \"box-300\"]'\n",[435,925,926],{"class":437,"line":505},[435,927,928],{"class":535},"# 202 {\"taskId\": \"...\"}\n",[393,930,931,937],{"icon":279,"label":539},[426,932,935],{"className":933,"code":934,"language":545,"meta":431},[543],"Delete the documents tape-48 and box-300 from the products index.\n",[377,936,934],{"__ignoreMap":431},[342,938,550,939,365],{},[377,940,941],{},"delete_documents",[559,943],{"auth":561,"method":562,"path":944},"\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Fdocuments\u002Fdelete",[342,946,947],{},"An id the index does not hold is not an error. Duplicate ids are counted once.",[337,949,951],{"id":950},"delete-all-documents","Delete all documents",[342,953,954],{},"Deleting all documents (a flush) empties the index at once, to start its data over after a bad import, test data or a catalog switch. It cannot be undone.",[390,956,957,985,1055],{},[393,958,959,982],{"icon":275,"label":395},[960,961,962,971,977],"ol",{},[613,963,792,964,966,967,970],{},[351,965,401],{}," and scroll to the ",[351,968,969],{},"Danger zone"," at the bottom.",[613,972,973,974,976],{},"Click ",[351,975,951],{},". The dialog lists what is deleted and what stays, and warns you when an enabled data source would fill the index again.",[613,978,979,980,365],{},"Type the index name and click ",[351,981,951],{},[342,983,984],{},"The page then shows the task until it ends, and how many documents it deleted. Members see the button disabled.",[393,986,987,1024],{"icon":417,"label":418},[426,988,990],{"className":428,"code":989,"language":430,"meta":431,"style":431},"curl -X POST https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F$PROJECT_ID\u002Findices\u002F$INDEX_ID\u002Fdocuments\u002Fflush \\\n  -H \"Authorization: Bearer $ZS_KEY\"\n",[377,991,992,1013],{"__ignoreMap":431},[435,993,994,996,998,1000,1002,1004,1006,1008,1011],{"class":437,"line":438},[435,995,418],{"class":441},[435,997,445],{"class":444},[435,999,449],{"class":448},[435,1001,452],{"class":448},[435,1003,456],{"class":455},[435,1005,459],{"class":448},[435,1007,462],{"class":455},[435,1009,1010],{"class":448},"\u002Fdocuments\u002Fflush",[435,1012,469],{"class":468},[435,1014,1015,1017,1019,1021],{"class":437,"line":472},[435,1016,475],{"class":444},[435,1018,478],{"class":448},[435,1020,481],{"class":455},[435,1022,1023],{"class":448},"\"\n",[426,1025,1027],{"className":652,"code":1026,"language":654,"meta":431,"style":431},"{ \"taskId\": \"5c2d1f0a-7e43-4b8e-a1d9-3f6b2c8e0d47\", \"previousDocCount\": 1200 }\n",[377,1028,1029],{"__ignoreMap":431},[435,1030,1031,1034,1037,1039,1042,1044,1047,1049,1052],{"class":437,"line":438},[435,1032,1033],{"class":455},"{ ",[435,1035,1036],{"class":669},"\"taskId\"",[435,1038,673],{"class":455},[435,1040,1041],{"class":448},"\"5c2d1f0a-7e43-4b8e-a1d9-3f6b2c8e0d47\"",[435,1043,585],{"class":455},[435,1045,1046],{"class":669},"\"previousDocCount\"",[435,1048,673],{"class":455},[435,1050,1051],{"class":444},"1200",[435,1053,1054],{"class":455}," }\n",[393,1056,1057,1063],{"icon":279,"label":539},[426,1058,1061],{"className":1059,"code":1060,"language":545,"meta":431},[543],"Delete every document in the products index.\n",[377,1062,1060],{"__ignoreMap":431},[342,1064,550,1065,1068],{},[377,1066,1067],{},"flush_documents",". It should ask you to confirm first.",[559,1070],{"auth":561,"method":562,"path":1071},"\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Fdocuments\u002Fflush",[342,1073,1074,1075,1078,1079,1082,1083,1086,1087,1090],{},"The answer is ",[377,1076,1077],{},"202"," with a ",[377,1080,1081],{},"DOCS_FLUSH"," task. ",[377,1084,1085],{},"previousDocCount"," is the number of documents the index held. When the task is ",[377,1088,1089],{},"SUCCEEDED",":",[610,1092,1093,1113,1120,1123],{},[613,1094,1095,1096,1100,1101,1104,1105,1108,1109,1112],{},"Every ",[346,1097,1099],{"href":1098},"\u002Fdocs\u002Findexing\u002Fversions#versions","physical version"," of the index is deleted, the one search served included. The index serves a new, empty version built from the saved mapping, so it is ",[377,1102,1103],{},"READY"," (a pending ",[377,1106,1107],{},"NEEDS_REINDEX"," is resolved) and ",[377,1110,1111],{},"docCount"," is 0.",[613,1114,1115,1116,1119],{},"Search answers ",[377,1117,1118],{},"200"," with no hits. Autocomplete stops suggesting values of the deleted documents once its suggestions are rebuilt, which the flush starts. Custom suggestions and popular searches stay.",[613,1121,1122],{},"The mapping, facets, search profiles, rules, synonyms, autocomplete settings, data source, analytics and API keys stay.",[613,1124,1125,1126,1129],{},"The documents quota on the ",[351,1127,1128],{},"Billing"," page follows at its next count.",[342,1131,1132],{},"What was in flight when the flush was accepted:",[610,1134,1135,1146,1149,1152],{},[613,1136,1137,1138,1141,1142,1145],{},"Uploads and deletes still ",[377,1139,1140],{},"QUEUED"," are ",[377,1143,1144],{},"CANCELLED",". A write already running finishes first, and what it wrote is deleted too.",[613,1147,1148],{},"An open replace session is aborted and a running reindex is cancelled.",[613,1150,1151],{},"Uploads sent after the flush land in the new version, even while the task runs.",[613,1153,1154,1155,1157,1158,1160],{},"An enabled ",[346,1156,364],{"href":128}," fills the index again at its next sync. Switch it off on the ",[351,1159,127],{}," page first to keep the index empty.",[342,1162,1163,1164,1167,1168,1171],{},"A second flush while one is queued or running answers the same task. Cancelling a reindex while a flush runs answers ",[377,1165,1166],{},"409 FLUSH_RUNNING",". If the saved mapping would break a profile, rule, facet, autocomplete field or data source, the flush is refused with ",[377,1169,1170],{},"409 MAPPING_BREAKS_CONFIG"," and nothing is stopped, as for a reindex.",[337,1173,1175],{"id":1174},"follow-a-task","Follow a task",[342,1177,398,1178,1180,1181,1183,1184,1186,1187,1190],{},[351,1179,353],{},". The table lists the index's tasks, newest first, with each task's type, status, counts, creation time and duration. Pick a status in the ",[351,1182,326],{}," list to see only those tasks, and click ",[351,1185,809],{}," to load new ones. ",[351,1188,1189],{},"Details"," opens a task with its attempts, counts and errors, one row per failed document.",[342,1192,1193],{},[384,1194],{"alt":1195,"src":1196,"title":1197},"The Tasks page with a Status filter and two SUCCEEDED tasks, a SUGGEST_BUILD and a DOCS_UPSERT, with received, succeeded, superseded and failed counts, created time and duration","\u002Fdocs\u002Fscreenshots\u002Ftasks.png","Every write is a task with its own counts",[342,1199,1200,1201,1203,1204,1207],{},"Documents are searchable once their task reaches ",[377,1202,1089],{}," or ",[377,1205,1206],{},"PARTIAL",", and the index's document count includes them by then.",[342,1209,1210,1211,1213,1214,585,1216,585,1218,1203,1221,1090],{},"With the API, the write answers ",[377,1212,1077],{}," with the task id. Poll it every second or two until the status is one of ",[377,1215,1089],{},[377,1217,1206],{},[377,1219,1220],{},"FAILED",[377,1222,1144],{},[559,1224],{"auth":819,"method":820,"path":1225},"\u002Fv1\u002Fprojects\u002F:projectId\u002Ftasks\u002F:taskId",[559,1227],{"auth":819,"method":820,"path":1228},"\u002Fv1\u002Fprojects\u002F:projectId\u002Ftasks",[426,1230,1232],{"className":428,"code":1231,"language":430,"meta":431,"style":431},"curl https:\u002F\u002Fapi.search.zaproo.cloud\u002Fv1\u002Fprojects\u002F$PROJECT_ID\u002Ftasks\u002F$TASK_ID \\\n  -H \"Authorization: Bearer $ZS_KEY\"\n",[377,1233,1234,1251],{"__ignoreMap":431},[435,1235,1236,1238,1240,1242,1245,1248],{"class":437,"line":438},[435,1237,418],{"class":441},[435,1239,452],{"class":448},[435,1241,456],{"class":455},[435,1243,1244],{"class":448},"\u002Ftasks\u002F",[435,1246,1247],{"class":455},"$TASK_ID ",[435,1249,1250],{"class":468},"\\\n",[435,1252,1253,1255,1257,1259],{"class":437,"line":472},[435,1254,475],{"class":444},[435,1256,478],{"class":448},[435,1258,481],{"class":455},[435,1260,1023],{"class":448},[426,1262,1264],{"className":652,"code":1263,"language":654,"meta":431,"style":431},"{\n  \"id\": \"0b9f7c1e-3a52-4f7e-9d0b-6a1c2e4d8f10\",\n  \"type\": \"DOCS_UPSERT\",\n  \"status\": \"PARTIAL\",\n  \"seq\": 1042,\n  \"attempts\": 1,\n  \"counts\": { \"received\": 2, \"succeeded\": 1, \"superseded\": 0, \"failed\": 1 },\n  \"errors\": [{ \"docId\": \"box-300\", \"type\": \"mapper_parsing_exception\", \"reason\": \"failed to parse field [price]\" }],\n  \"idempotencyKey\": \"catalog-2026-10-16-batch-1\",\n  \"sessionId\": null,\n  \"createdAt\": \"2026-10-16T09:30:00.000Z\",\n  \"startedAt\": \"2026-10-16T09:30:00.120Z\",\n  \"finishedAt\": \"2026-10-16T09:30:00.480Z\"\n}\n",[377,1265,1266,1271,1284,1296,1308,1320,1332,1379,1417,1430,1443,1456,1469,1480],{"__ignoreMap":431},[435,1267,1268],{"class":437,"line":438},[435,1269,1270],{"class":455},"{\n",[435,1272,1273,1276,1278,1281],{"class":437,"line":472},[435,1274,1275],{"class":669},"  \"id\"",[435,1277,673],{"class":455},[435,1279,1280],{"class":448},"\"0b9f7c1e-3a52-4f7e-9d0b-6a1c2e4d8f10\"",[435,1282,1283],{"class":455},",\n",[435,1285,1286,1289,1291,1294],{"class":437,"line":495},[435,1287,1288],{"class":669},"  \"type\"",[435,1290,673],{"class":455},[435,1292,1293],{"class":448},"\"DOCS_UPSERT\"",[435,1295,1283],{"class":455},[435,1297,1298,1301,1303,1306],{"class":437,"line":505},[435,1299,1300],{"class":669},"  \"status\"",[435,1302,673],{"class":455},[435,1304,1305],{"class":448},"\"PARTIAL\"",[435,1307,1283],{"class":455},[435,1309,1310,1313,1315,1318],{"class":437,"line":514},[435,1311,1312],{"class":669},"  \"seq\"",[435,1314,673],{"class":455},[435,1316,1317],{"class":444},"1042",[435,1319,1283],{"class":455},[435,1321,1322,1325,1327,1330],{"class":437,"line":520},[435,1323,1324],{"class":669},"  \"attempts\"",[435,1326,673],{"class":455},[435,1328,1329],{"class":444},"1",[435,1331,1283],{"class":455},[435,1333,1334,1337,1340,1343,1345,1348,1350,1353,1355,1357,1359,1362,1364,1367,1369,1372,1374,1376],{"class":437,"line":526},[435,1335,1336],{"class":669},"  \"counts\"",[435,1338,1339],{"class":455},": { ",[435,1341,1342],{"class":669},"\"received\"",[435,1344,673],{"class":455},[435,1346,1347],{"class":444},"2",[435,1349,585],{"class":455},[435,1351,1352],{"class":669},"\"succeeded\"",[435,1354,673],{"class":455},[435,1356,1329],{"class":444},[435,1358,585],{"class":455},[435,1360,1361],{"class":669},"\"superseded\"",[435,1363,673],{"class":455},[435,1365,1366],{"class":444},"0",[435,1368,585],{"class":455},[435,1370,1371],{"class":669},"\"failed\"",[435,1373,673],{"class":455},[435,1375,1329],{"class":444},[435,1377,1378],{"class":455}," },\n",[435,1380,1381,1384,1387,1390,1392,1394,1396,1399,1401,1404,1406,1409,1411,1414],{"class":437,"line":532},[435,1382,1383],{"class":669},"  \"errors\"",[435,1385,1386],{"class":455},": [{ ",[435,1388,1389],{"class":669},"\"docId\"",[435,1391,673],{"class":455},[435,1393,731],{"class":448},[435,1395,585],{"class":455},[435,1397,1398],{"class":669},"\"type\"",[435,1400,673],{"class":455},[435,1402,1403],{"class":448},"\"mapper_parsing_exception\"",[435,1405,585],{"class":455},[435,1407,1408],{"class":669},"\"reason\"",[435,1410,673],{"class":455},[435,1412,1413],{"class":448},"\"failed to parse field [price]\"",[435,1415,1416],{"class":455}," }],\n",[435,1418,1420,1423,1425,1428],{"class":437,"line":1419},9,[435,1421,1422],{"class":669},"  \"idempotencyKey\"",[435,1424,673],{"class":455},[435,1426,1427],{"class":448},"\"catalog-2026-10-16-batch-1\"",[435,1429,1283],{"class":455},[435,1431,1433,1436,1438,1441],{"class":437,"line":1432},10,[435,1434,1435],{"class":669},"  \"sessionId\"",[435,1437,673],{"class":455},[435,1439,1440],{"class":444},"null",[435,1442,1283],{"class":455},[435,1444,1446,1449,1451,1454],{"class":437,"line":1445},11,[435,1447,1448],{"class":669},"  \"createdAt\"",[435,1450,673],{"class":455},[435,1452,1453],{"class":448},"\"2026-10-16T09:30:00.000Z\"",[435,1455,1283],{"class":455},[435,1457,1459,1462,1464,1467],{"class":437,"line":1458},12,[435,1460,1461],{"class":669},"  \"startedAt\"",[435,1463,673],{"class":455},[435,1465,1466],{"class":448},"\"2026-10-16T09:30:00.120Z\"",[435,1468,1283],{"class":455},[435,1470,1472,1475,1477],{"class":437,"line":1471},13,[435,1473,1474],{"class":669},"  \"finishedAt\"",[435,1476,673],{"class":455},[435,1478,1479],{"class":448},"\"2026-10-16T09:30:00.480Z\"\n",[435,1481,1483],{"class":437,"line":1482},14,[435,1484,1485],{"class":455},"}\n",[342,1487,1488,1489,589,1492,1495,1496,1498,1499,1501,1502,1504,1505,365],{},"The list returns the project's tasks newest first. Filter with ",[377,1490,1491],{},"indexId",[377,1493,1494],{},"status",". ",[377,1497,832],{}," is 1 to 100 (default 50). Pass ",[377,1500,836],{}," from the previous page as ",[377,1503,840],{}," to get the next page. Over MCP, the tool is ",[377,1506,557],{},[606,1508,1510],{"id":1509},"task-status","Task status",[1512,1513,1514,1526],"table",{},[1515,1516,1517],"thead",{},[1518,1519,1520,1523],"tr",{},[1521,1522,326],"th",{},[1521,1524,1525],{},"Meaning",[1527,1528,1529,1539,1549,1558,1571,1580],"tbody",{},[1518,1530,1531,1536],{},[1532,1533,1534],"td",{},[377,1535,1140],{},[1532,1537,1538],{},"Accepted, waiting for a worker. A task that hit a temporary error waits here before its next attempt.",[1518,1540,1541,1546],{},[1532,1542,1543],{},[377,1544,1545],{},"RUNNING",[1532,1547,1548],{},"A worker is writing it.",[1518,1550,1551,1555],{},[1532,1552,1553],{},[377,1554,1089],{},[1532,1556,1557],{},"Every document was written or superseded.",[1518,1559,1560,1564],{},[1532,1561,1562],{},[377,1563,1206],{},[1532,1565,1566,1567,1570],{},"Some documents failed. ",[377,1568,1569],{},"errors"," names them.",[1518,1572,1573,1577],{},[1532,1574,1575],{},[377,1576,1220],{},[1532,1578,1579],{},"Every document failed, or the task failed as a whole.",[1518,1581,1582,1586],{},[1532,1583,1584],{},[377,1585,1144],{},[1532,1587,1588],{},"The index was deleted or flushed, or the reindex or replace session the task belonged to was cancelled, aborted or expired.",[342,1590,1591,1592,1595,1596,1598,1599,1203,1601,365],{},"Document tasks are tried up to 5 times, with a growing pause, when the search cluster is busy or unreachable. ",[377,1593,1594],{},"attempts"," counts the tries. A document the cluster rejects for its content is not retried: it lands in ",[377,1597,1569],{}," and the task ends ",[377,1600,1206],{},[377,1602,1220],{},[606,1604,1606],{"id":1605},"task-types","Task types",[1512,1608,1609,1619],{},[1515,1610,1611],{},[1518,1612,1613,1616],{},[1521,1614,1615],{},"Type",[1521,1617,1618],{},"Created by",[1527,1620,1621,1631,1641,1654,1664,1677,1691],{},[1518,1622,1623,1628],{},[1532,1624,1625],{},[377,1626,1627],{},"DOCS_UPSERT",[1532,1629,1630],{},"An upload",[1518,1632,1633,1638],{},[1532,1634,1635],{},[377,1636,1637],{},"DOCS_DELETE",[1532,1639,1640],{},"A delete",[1518,1642,1643,1648],{},[1532,1644,1645],{},[377,1646,1647],{},"SESSION_BATCH",[1532,1649,1650,1651],{},"A batch sent to a ",[346,1652,1653],{"href":116},"replace session",[1518,1655,1656,1661],{},[1532,1657,1658],{},[377,1659,1660],{},"SESSION_COMMIT",[1532,1662,1663],{},"A replace session commit",[1518,1665,1666,1671],{},[1532,1667,1668],{},[377,1669,1670],{},"REINDEX",[1532,1672,1673,1674],{},"A ",[346,1675,1676],{"href":122},"reindex",[1518,1678,1679,1684],{},[1532,1680,1681],{},[377,1682,1683],{},"SUGGEST_BUILD",[1532,1685,1686,1687,1690],{},"A rebuild of the ",[346,1688,1689],{"href":249},"autocomplete"," suggestions",[1518,1692,1693,1697],{},[1532,1694,1695],{},[377,1696,1081],{},[1532,1698,1673,1699],{},[346,1700,1702],{"href":1701},"#delete-all-documents","delete of every document",[606,1704,1706],{"id":1705},"counts-and-errors","Counts and errors",[610,1708,1709,1715,1721,1727],{},[613,1710,1711,1714],{},[377,1712,1713],{},"received",": documents in the batch. For a reindex, the documents to copy. For a flush, the documents the index held.",[613,1716,1717,1720],{},[377,1718,1719],{},"succeeded",": documents written.",[613,1722,1723,1726],{},[377,1724,1725],{},"superseded",": documents skipped because a newer version was already stored.",[613,1728,1729,1732],{},[377,1730,1731],{},"failed",": documents the cluster rejected.",[342,1734,1735,1737,1738,585,1740,589,1743,1495,1746,1748,1749,1751,1752,1754,1755,365],{},[377,1736,1569],{}," holds up to 1000 entries, each with ",[377,1739,584],{},[377,1741,1742],{},"type",[377,1744,1745],{},"reason",[377,1747,584],{}," is ",[377,1750,1440],{}," for an error that failed the whole task, and ",[351,1753,1189],{}," shows it as ",[351,1756,1757],{},"whole task",[337,1759,1761],{"id":1760},"retry-safely-with-idempotency-key","Retry safely with Idempotency-Key",[342,1763,1764,1765,1768],{},"This applies to API writes. A network error leaves you unsure whether the API received a batch. Send an ",[377,1766,1767],{},"Idempotency-Key"," header with every write, up to 200 characters, and retry with the same key.",[610,1770,1771,1774,1780],{},[613,1772,1773],{},"The same key within 24 hours returns the task of the first request. No second task is created, even if the body changed.",[613,1775,1776,1777,365],{},"Keys are unique per project. The same key for another index, another replace session or another operation answers ",[377,1778,1779],{},"409 IDEMPOTENCY_KEY_REUSED",[613,1781,1782],{},"After 24 hours the key can be used again.",[342,1784,1785],{},"Build the key from what makes the batch unique, for example your export run and the batch number. The cabinet upload does this with a hash of the file and the batch position, so uploading the same file twice does not write it twice.",[337,1787,1789],{"id":1788},"write-order-and-superseded-documents","Write order and superseded documents",[342,1791,1792,1793,1796,1797,1799],{},"Each task gets a sequence number, ",[377,1794,1795],{},"seq",", when the API accepts it. The worker writes every document with ",[377,1798,1795],{}," as its version, and the index never replaces a document with an older version. When two tasks change the same document, the one accepted last wins, whichever finishes first.",[342,1801,1802,1803,1805],{},"A write that finds a newer version already stored is counted as ",[377,1804,1725],{},". It counts as success: the newer data is already there. You see superseded documents when an older task was retried after a newer one, or when two of your processes send the same product.",[337,1807,1809],{"id":1808},"common-mistakes","Common mistakes",[610,1811,1812,1819,1822,1828],{},[613,1813,1814,1815,1818],{},"Sending ",[377,1816,1817],{},"{\"documents\": [...]}"," to the API. The API takes a bare array. Only the cabinet upload accepts the wrapped form.",[613,1820,1821],{},"Sending only the changed fields. An upsert replaces the whole document.",[613,1823,1824,1825,1827],{},"Treating ",[377,1826,1077],{}," as done. The documents are searchable only when the task finishes.",[613,1829,1830],{},"Retrying without an Idempotency-Key. A retry of a batch the API already accepted creates a second task. It writes the same data, but it costs a task and shows twice in the task list.",[337,1832,1834],{"id":1833},"related","Related",[610,1836,1837,1841,1845,1849,1853],{},[613,1838,1839],{},[346,1840,23],{"href":24},[613,1842,1843],{},[346,1844,103],{"href":104},[613,1846,1847],{},[346,1848,115],{"href":116},[613,1850,1851],{},[346,1852,127],{"href":128},[613,1854,1855],{},[346,1856,121],{"href":122},[1858,1859,1860],"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 pre.shiki code .sq92B, html code.shiki .sq92B{--shiki-light:#66707B;--shiki-default:#66707B;--shiki-dark:#BDC4CC}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":431,"searchDepth":472,"depth":472,"links":1862},[1863,1864,1867,1868,1869,1870,1871,1876,1877,1878,1879],{"id":339,"depth":472,"text":340},{"id":371,"depth":472,"text":372,"children":1865},[1866],{"id":608,"depth":495,"text":315},{"id":633,"depth":472,"text":634},{"id":788,"depth":472,"text":789},{"id":855,"depth":472,"text":856},{"id":950,"depth":472,"text":951},{"id":1174,"depth":472,"text":1175,"children":1872},[1873,1874,1875],{"id":1509,"depth":495,"text":1510},{"id":1605,"depth":495,"text":1606},{"id":1705,"depth":495,"text":1706},{"id":1760,"depth":472,"text":1761},{"id":1788,"depth":472,"text":1789},{"id":1808,"depth":472,"text":1809},{"id":1833,"depth":472,"text":1834},"md",{},{"icon":113},{"title":109,"description":112},"bzfFJx5pTHgSRuXcmVJ-igs_DJF0JdF8zn80MQvZN0w",[1886,1887],{"title":103,"path":104,"stem":105,"description":106,"icon":107,"children":-1},{"title":115,"path":116,"stem":117,"description":118,"icon":119,"children":-1},1793717706306]