[{"data":1,"prerenderedAt":1460},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Fkeys\u002Frate-limits":319,"docs-\u002Fdocs\u002Fkeys\u002Frate-limits-surround":1457},[4],{"title":5,"path":6,"stem":7,"children":8,"page":34},"Docs","\u002Fdocs","docs",[9,35,60,78,120,186,229,240,264,289],{"title":10,"description":11,"icon":12,"path":13,"stem":14,"children":15,"page":34},"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],{"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","From a new account to a first search request in six steps, with curl or from your AI agent.","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",false,{"title":36,"description":37,"icon":38,"path":39,"stem":40,"children":41,"page":34},"Account and team","Sign-in, sessions, organizations, members, roles and projects.","i-lucide-users","\u002Fdocs\u002Faccount","docs\u002F2.account",[42,48,54],{"title":43,"path":44,"stem":45,"description":46,"icon":47},"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":49,"path":50,"stem":51,"description":52,"icon":53},"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":55,"path":56,"stem":57,"description":58,"icon":59},"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":61,"description":62,"icon":63,"path":64,"stem":65,"children":66,"page":34},"API keys and security","Secret and public keys, scopes, allowed origins, rate limits and errors.","i-lucide-key-round","\u002Fdocs\u002Fkeys","docs\u002F3.keys",[67,72],{"title":68,"path":69,"stem":70,"description":71,"icon":63},"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":73,"path":74,"stem":75,"description":76,"icon":77},"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":79,"description":80,"icon":81,"path":82,"stem":83,"children":84,"page":34},"Indexing","Indices, languages, mappings, documents, tasks, full catalog sync and reindexing.","i-lucide-database","\u002Fdocs\u002Findexing","docs\u002F4.indexing",[85,90,96,102,108,114],{"title":86,"path":87,"stem":88,"description":89,"icon":81},"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":91,"path":92,"stem":93,"description":94,"icon":95},"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":97,"path":98,"stem":99,"description":100,"icon":101},"Documents and tasks","\u002Fdocs\u002Findexing\u002Fdocuments","docs\u002F4.indexing\u002F3.documents","Upload and delete documents in batches, follow each write as a task, retry safely with Idempotency-Key, and browse what the index holds.","i-lucide-file-json",{"title":103,"path":104,"stem":105,"description":106,"icon":107},"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":109,"path":110,"stem":111,"description":112,"icon":113},"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":115,"path":116,"stem":117,"description":118,"icon":119},"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":121,"description":122,"icon":123,"path":124,"stem":125,"children":126,"page":34},"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",[127,133,139,144,150,156,161,166,171,176,181],{"title":128,"path":129,"stem":130,"description":131,"icon":132},"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 an integration shows up in the cabinet.","i-lucide-layout-grid",{"title":134,"path":135,"stem":136,"description":137,"icon":138},"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":140,"path":141,"stem":142,"description":143,"icon":119},"Product feed","\u002Fdocs\u002Fintegrations\u002Fproduct-feed","docs\u002F4.integrations\u002F03.product-feed","Connect any shop that can publish its catalog as a feed. Zaproo downloads it on a schedule and writes only what changed.",{"title":145,"path":146,"stem":147,"description":148,"icon":149},"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":151,"path":152,"stem":153,"description":154,"icon":155},"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":157,"path":158,"stem":159,"description":160,"icon":155},"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":162,"path":163,"stem":164,"description":165,"icon":155},"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":167,"path":168,"stem":169,"description":170,"icon":155},"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":172,"path":173,"stem":174,"description":175,"icon":155},"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":177,"path":178,"stem":179,"description":180,"icon":155},"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":182,"path":183,"stem":184,"description":185,"icon":155},"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":187,"description":188,"icon":189,"path":190,"stem":191,"children":192,"page":34},"Search and relevance","The search API, search profiles, facets, synonyms and ranking rules.","i-lucide-search","\u002Fdocs\u002Fsearch","docs\u002F5.search",[193,199,205,211,217,223],{"title":194,"path":195,"stem":196,"description":197,"icon":198},"Search API","\u002Fdocs\u002Fsearch\u002Fsearch-api","docs\u002F5.search\u002F1.search-api","The search request and response, every filter form, sorting, paging, highlighting and the inline profile for previews.","i-lucide-search-code",{"title":200,"path":201,"stem":202,"description":203,"icon":204},"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":206,"path":207,"stem":208,"description":209,"icon":210},"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":212,"path":213,"stem":214,"description":215,"icon":216},"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":218,"path":219,"stem":220,"description":221,"icon":222},"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":224,"path":225,"stem":226,"description":227,"icon":228},"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":230,"description":231,"icon":232,"path":233,"stem":234,"children":235,"page":34},"Autocomplete","Query suggestions as the shopper types.","i-lucide-text-cursor-input","\u002Fdocs\u002Fautocomplete","docs\u002F6.autocomplete",[236],{"title":230,"path":237,"stem":238,"description":239,"icon":232},"\u002Fdocs\u002Fautocomplete\u002Fsuggestions","docs\u002F6.autocomplete\u002F1.suggestions","Query suggestions as the shopper types, built every hour from your own searches, field values and custom entries.",{"title":241,"description":242,"icon":243,"path":244,"stem":245,"children":246,"page":34},"Analytics","Searches, zero-result queries and latency.","i-lucide-chart-line","\u002Fdocs\u002Fanalytics","docs\u002F7.analytics",[247,252,258],{"title":248,"path":249,"stem":250,"description":251,"icon":243},"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":253,"path":254,"stem":255,"description":256,"icon":257},"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":259,"path":260,"stem":261,"description":262,"icon":263},"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":265,"description":266,"icon":267,"path":268,"stem":269,"children":270,"page":34},"AI agents (MCP)","Connect Claude Code or any MCP client and manage search from an agent.","i-lucide-bot","\u002Fdocs\u002Fmcp","docs\u002F8.mcp",[271,277,283],{"title":272,"path":273,"stem":274,"description":275,"icon":276},"MCP setup","\u002Fdocs\u002Fmcp\u002Fsetup","docs\u002F8.mcp\u002F1.setup","Connect Claude Code or any MCP client to Zaproo Search and manage indices, documents, profiles, synonyms and ranking rules from your agent.","i-lucide-plug",{"title":278,"path":279,"stem":280,"description":281,"icon":282},"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":284,"path":285,"stem":286,"description":287,"icon":288},"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":290,"description":291,"icon":292,"path":293,"stem":294,"children":295,"page":34},"Reference","Every REST route, every limit, plans and billing, and status.","i-lucide-book-open","\u002Fdocs\u002Freference","docs\u002F9.reference",[296,302,307,313],{"title":297,"path":298,"stem":299,"description":300,"icon":301},"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":303,"path":304,"stem":305,"description":306,"icon":77},"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":308,"path":309,"stem":310,"description":311,"icon":312},"Plans and billing","\u002Fdocs\u002Freference\u002Fbilling","docs\u002F9.reference\u002F3.billing","The plans, how usage is measured, what happens near a quota, and how plan changes and invoices work.","i-lucide-credit-card",{"title":314,"path":315,"stem":316,"description":317,"icon":318},"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":320,"title":73,"body":321,"description":76,"extension":1452,"meta":1453,"navigation":1454,"path":74,"seo":1455,"stem":75,"__hash__":1456},"docs\u002Fdocs\u002F3.keys\u002F2.rate-limits.md",{"type":322,"value":323,"toc":1435},"minimark",[324,329,333,336,353,356,360,529,532,538,546,550,561,603,609,614,640,644,647,737,763,767,778,782,965,969,1041,1045,1144,1148,1198,1202,1350,1354,1412,1416,1431],[325,326,328],"h2",{"id":327},"how-rate-limits-work","How rate limits work",[330,331,332],"p",{},"Every limit counts requests in a fixed window of 60 seconds. A counter starts with the first request and resets 60 seconds later. Every API server shares the same counters, so spreading requests over servers does not raise a limit.",[330,334,335],{},"A route counts against two kinds of limits:",[337,338,339,347],"ul",{},[340,341,342,346],"li",{},[343,344,345],"strong",{},"Per caller",": one counter per API key or per signed-in user.",[340,348,349,352],{},[343,350,351],{},"Per IP address",": one counter per client IP, whatever key or token it sends.",[330,354,355],{},"A request has to stay under both. The IP limit is counted first, so a client over its IP limit does not use up any key's budget.",[325,357,359],{"id":358},"limits-per-route","Limits per route",[361,362,363,377],"table",{},[364,365,366],"thead",{},[367,368,369,373,375],"tr",{},[370,371,372],"th",{},"Routes",[370,374,345],{},[370,376,351],{},[378,379,380,395,408,419,436,448,459,471,486,498,510,519],"tbody",{},[367,381,382,389,392],{},[383,384,385],"td",{},[386,387,388],"code",{},"POST \u002Fv1\u002Fsearch\u002F:profileKey",[383,390,391],{},"600 per key",[383,393,394],{},"1200",[367,396,397,402,405],{},[383,398,399],{},[386,400,401],{},"POST \u002Fv1\u002Fsuggest\u002F:suggestKey",[383,403,404],{},"1200 per key",[383,406,407],{},"2400",[367,409,410,415,417],{},[383,411,412],{},[386,413,414],{},"\u002Fmcp",[383,416,391],{},[383,418,394],{},[367,420,421,430,433],{},[383,422,423,426,427],{},[386,424,425],{},"POST \u002Fv1\u002Fauth\u002Flogin",", ",[386,428,429],{},"POST \u002Fv1\u002Fauth\u002Fchange-password",[383,431,432],{},"none",[383,434,435],{},"10",[367,437,438,443,445],{},[383,439,440],{},[386,441,442],{},"POST \u002Fv1\u002Fauth\u002Fregister",[383,444,432],{},[383,446,447],{},"5",[367,449,450,455,457],{},[383,451,452],{},[386,453,454],{},"POST \u002Fv1\u002Fauth\u002Fforgot-password",[383,456,432],{},[383,458,447],{},[367,460,461,466,468],{},[383,462,463],{},[386,464,465],{},"POST \u002Fv1\u002Fauth\u002Frefresh",[383,467,432],{},[383,469,470],{},"120",[367,472,473,481,483],{},[383,474,475,426,478],{},[386,476,477],{},"GET \u002Fv1\u002Fauth\u002Fverify-email",[386,479,480],{},"POST \u002Fv1\u002Fauth\u002Freset-password",[383,482,432],{},[383,484,485],{},"30",[367,487,488,493,496],{},[383,489,490],{},[386,491,492],{},"POST \u002Fv1\u002Fauth\u002Fresend-verification",[383,494,495],{},"3 per user",[383,497,432],{},[367,499,500,505,507],{},[383,501,502],{},[386,503,504],{},"GET \u002Fv1\u002Fstatus",[383,506,432],{},[383,508,509],{},"600",[367,511,512,515,517],{},[383,513,514],{},"Every other route, with a secret key",[383,516,404],{},[383,518,432],{},[367,520,521,524,527],{},[383,522,523],{},"Every other route, signed in to the cabinet",[383,525,526],{},"600 per user",[383,528,432],{},[330,530,531],{},"All values are requests per 60 seconds.",[330,533,534,535,537],{},"The last two rows are one budget per caller across all routes. A secret key that uploads documents, polls tasks and reads mappings spends 1200 requests per minute in total, not 1200 on each route. Search, suggest and ",[386,536,414],{}," have their own counters and do not spend that budget.",[330,539,540,541,545],{},"Plan limits are separate from rate limits. The monthly searches of your plan are counted for billing and warn you at 80% and 100%, but they never block a search. ",[542,543,308],"a",{"href":544},"\u002Fdocs\u002Freference\u002Fbilling#plans"," lists the limits of each plan.",[325,547,549],{"id":548},"when-you-hit-a-limit","When you hit a limit",[330,551,552,553,556,557,560],{},"A request over a limit answers ",[386,554,555],{},"429"," with a ",[386,558,559],{},"Retry-After"," header. The header holds the number of seconds until the counter resets.",[562,563,568],"pre",{"className":564,"code":565,"language":566,"meta":567,"style":567},"language-http shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","HTTP\u002F1.1 429 Too Many Requests\nRetry-After: 23\nContent-Type: application\u002Fjson\n\n{\"error\": {\"code\": \"RATE_LIMITED\", \"message\": \"Too many requests, retry later\", \"details\": []}}\n","http","",[386,569,570,578,584,590,597],{"__ignoreMap":567},[571,572,575],"span",{"class":573,"line":574},"line",1,[571,576,577],{},"HTTP\u002F1.1 429 Too Many Requests\n",[571,579,581],{"class":573,"line":580},2,[571,582,583],{},"Retry-After: 23\n",[571,585,587],{"class":573,"line":586},3,[571,588,589],{},"Content-Type: application\u002Fjson\n",[571,591,593],{"class":573,"line":592},4,[571,594,596],{"emptyLinePlaceholder":595},true,"\n",[571,598,600],{"class":573,"line":599},5,[571,601,602],{},"{\"error\": {\"code\": \"RATE_LIMITED\", \"message\": \"Too many requests, retry later\", \"details\": []}}\n",[330,604,605,606,608],{},"Wait for the seconds in ",[386,607,559],{},", then send the request again. Do not retry right away. Every rejected request still counts against the IP limit of the current window.",[610,611,613],"h3",{"id":612},"stay-under-the-limits","Stay under the limits",[337,615,616,622,628,634],{},[340,617,618,621],{},[343,619,620],{},"Batch your documents."," One upload takes up to 1000 documents. A catalog of 50,000 products is 50 requests, not 50,000.",[340,623,624,627],{},[343,625,626],{},"Poll tasks slowly."," Check a task every second or two, not in a tight loop.",[340,629,630,633],{},[343,631,632],{},"Wait for a pause before you suggest."," Send the suggest request when the shopper stops typing for about 150 ms, not on every key press.",[340,635,636,639],{},[343,637,638],{},"Count shoppers behind your server."," When your storefront server calls search for every shopper, they all share your server's key and IP. 600 searches per minute is 10 per second. Cache popular results on your server if you need more.",[325,641,643],{"id":642},"the-error-format","The error format",[330,645,646],{},"Every error answers with the same JSON body:",[562,648,652],{"className":649,"code":650,"language":651,"meta":567,"style":567},"language-json shiki shiki-themes github-light-high-contrast github-light-high-contrast github-dark-high-contrast","{\n  \"error\": {\n    \"code\": \"VALIDATION_FAILED\",\n    \"message\": \"Request validation failed\",\n    \"details\": [{ \"path\": \"allowedOrigins.0\", \"message\": \"expected scheme:\u002F\u002Fhost[:port], optionally *.host\" }]\n  }\n}\n","json",[386,653,654,660,669,684,696,725,731],{"__ignoreMap":567},[571,655,656],{"class":573,"line":574},[571,657,659],{"class":658},"s7iLA","{\n",[571,661,662,666],{"class":573,"line":580},[571,663,665],{"class":664},"sb7M8","  \"error\"",[571,667,668],{"class":658},": {\n",[571,670,671,674,677,681],{"class":573,"line":586},[571,672,673],{"class":664},"    \"code\"",[571,675,676],{"class":658},": ",[571,678,680],{"class":679},"semJd","\"VALIDATION_FAILED\"",[571,682,683],{"class":658},",\n",[571,685,686,689,691,694],{"class":573,"line":592},[571,687,688],{"class":664},"    \"message\"",[571,690,676],{"class":658},[571,692,693],{"class":679},"\"Request validation failed\"",[571,695,683],{"class":658},[571,697,698,701,704,707,709,712,714,717,719,722],{"class":573,"line":599},[571,699,700],{"class":664},"    \"details\"",[571,702,703],{"class":658},": [{ ",[571,705,706],{"class":664},"\"path\"",[571,708,676],{"class":658},[571,710,711],{"class":679},"\"allowedOrigins.0\"",[571,713,426],{"class":658},[571,715,716],{"class":664},"\"message\"",[571,718,676],{"class":658},[571,720,721],{"class":679},"\"expected scheme:\u002F\u002Fhost[:port], optionally *.host\"",[571,723,724],{"class":658}," }]\n",[571,726,728],{"class":573,"line":727},6,[571,729,730],{"class":658},"  }\n",[571,732,734],{"class":573,"line":733},7,[571,735,736],{"class":658},"}\n",[337,738,739,744,750],{},[340,740,741,743],{},[386,742,386],{}," is stable. Branch on it in your code.",[340,745,746,749],{},[386,747,748],{},"message"," is for people. It may change, so do not parse it.",[340,751,752,755,756,759,760,762],{},[386,753,754],{},"details"," lists the fields that failed, each with a ",[386,757,758],{},"path"," and a ",[386,761,748],{},". It is empty for errors that are not about one field.",[325,764,766],{"id":765},"error-codes","Error codes",[330,768,769,770,773,774,777],{},"Ids of another organization's projects, indices or keys answer ",[386,771,772],{},"404",", the same as ids that do not exist. So a ",[386,775,776],{},"403 FORBIDDEN"," means the resource exists and you may see it, but your role or your key may not do this to it.",[610,779,781],{"id":780},"bad-request-400","Bad request (400)",[361,783,784,794],{},[364,785,786],{},[367,787,788,791],{},[370,789,790],{},"Code",[370,792,793],{},"Meaning",[378,795,796,809,822,832,842,852,865,875,885,895,905,915,925,935,945,955],{},[367,797,798,803],{},[383,799,800],{},[386,801,802],{},"VALIDATION_FAILED",[383,804,805,806,808],{},"The body, query or path does not match the route's schema. ",[386,807,754],{}," names each field.",[367,810,811,816],{},[383,812,813],{},[386,814,815],{},"INVALID_DOCUMENTS",[383,817,818,819,821],{},"Some documents do not match the index mapping. ",[386,820,754],{}," names them.",[367,823,824,829],{},[383,825,826],{},[386,827,828],{},"INVALID_FILTER",[383,830,831],{},"A search filter has the wrong form for its field, or the field is not mapped.",[367,833,834,839],{},[383,835,836],{},[386,837,838],{},"FILTER_NOT_ALLOWED",[383,840,841],{},"The search filters on a field the profile does not offer as a facet or filter field.",[367,843,844,849],{},[383,845,846],{},[386,847,848],{},"SORT_NOT_ALLOWED",[383,850,851],{},"The search sorts by an option the profile does not offer.",[367,853,854,859],{},[383,855,856],{},[386,857,858],{},"PER_PAGE_TOO_LARGE",[383,860,861,864],{},[386,862,863],{},"perPage"," is above the profile's maximum.",[367,866,867,872],{},[383,868,869],{},[386,870,871],{},"PAGE_OUT_OF_RANGE",[383,873,874],{},"The page starts past the first 10000 results.",[367,876,877,882],{},[383,878,879],{},[386,880,881],{},"PROFILE_INVALID",[383,883,884],{},"The profile uses fields the mapping does not allow.",[367,886,887,892],{},[383,888,889],{},[386,890,891],{},"FACETS_INVALID",[383,893,894],{},"The facets use fields the mapping does not allow.",[367,896,897,902],{},[383,898,899],{},[386,900,901],{},"RULE_INVALID",[383,903,904],{},"The rule uses fields or profiles the index does not have.",[367,906,907,912],{},[383,908,909],{},[386,910,911],{},"RULE_ORDER_MISMATCH",[383,913,914],{},"The new rule order does not list every rule of the index exactly once.",[367,916,917,922],{},[383,918,919],{},[386,920,921],{},"SUGGEST_CONFIG_INVALID",[383,923,924],{},"The autocomplete settings do not fit the index.",[367,926,927,932],{},[383,928,929],{},[386,930,931],{},"SYNONYM_PARSE_FAILED",[383,933,934],{},"A synonyms import line cannot be read.",[367,936,937,942],{},[383,938,939],{},[386,940,941],{},"LANGUAGE_UNAVAILABLE",[383,943,944],{},"The search cluster cannot analyze this language.",[367,946,947,952],{},[383,948,949],{},[386,950,951],{},"INVALID_TOKEN",[383,953,954],{},"An email verification or password reset link is invalid, expired or already used.",[367,956,957,962],{},[383,958,959],{},[386,960,961],{},"WRONG_PASSWORD",[383,963,964],{},"The current password is wrong.",[610,966,968],{"id":967},"unauthorized-401","Unauthorized (401)",[361,970,971,979],{},[364,972,973],{},[367,974,975,977],{},[370,976,790],{},[370,978,793],{},[378,980,981,991,1001,1011,1021,1031],{},[367,982,983,988],{},[383,984,985],{},[386,986,987],{},"UNAUTHENTICATED",[383,989,990],{},"No credentials, credentials the API does not know, or a key that cannot call this route.",[367,992,993,998],{},[383,994,995],{},[386,996,997],{},"API_KEY_REVOKED",[383,999,1000],{},"The key was revoked.",[367,1002,1003,1008],{},[383,1004,1005],{},[386,1006,1007],{},"API_KEY_EXPIRED",[383,1009,1010],{},"The key's expiry date has passed.",[367,1012,1013,1018],{},[383,1014,1015],{},[386,1016,1017],{},"INVALID_CREDENTIALS",[383,1019,1020],{},"The email or the password is wrong.",[367,1022,1023,1028],{},[383,1024,1025],{},[386,1026,1027],{},"INVALID_REFRESH_TOKEN",[383,1029,1030],{},"The cabinet session expired or was signed out. Sign in again.",[367,1032,1033,1038],{},[383,1034,1035],{},[386,1036,1037],{},"REFRESH_TOKEN_REUSED",[383,1039,1040],{},"An old refresh token was used again, so that device was signed out. Sign in again.",[610,1042,1044],{"id":1043},"forbidden-403","Forbidden (403)",[361,1046,1047,1055],{},[364,1048,1049],{},[367,1050,1051,1053],{},[370,1052,790],{},[370,1054,793],{},[378,1056,1057,1067,1081,1091,1101,1111,1121,1131],{},[367,1058,1059,1064],{},[383,1060,1061],{},[386,1062,1063],{},"FORBIDDEN",[383,1065,1066],{},"Your role or the key's access does not allow this route.",[367,1068,1069,1074],{},[383,1070,1071],{},[386,1072,1073],{},"ORIGIN_NOT_ALLOWED",[383,1075,1076,1077,1080],{},"A public key was used from an origin that is not on its allowed origins, or with no ",[386,1078,1079],{},"Origin"," header.",[367,1082,1083,1088],{},[383,1084,1085],{},[386,1086,1087],{},"INLINE_PROFILE_FORBIDDEN",[383,1089,1090],{},"A public key sent an inline search profile. Only secret keys may.",[367,1092,1093,1098],{},[383,1094,1095],{},[386,1096,1097],{},"INDEX_SCOPED_KEY",[383,1099,1100],{},"A key limited to some indices tried to create an index.",[367,1102,1103,1108],{},[383,1104,1105],{},[386,1106,1107],{},"SECRET_KEY_REQUIRED",[383,1109,1110],{},"The MCP server was called with a public key.",[367,1112,1113,1118],{},[383,1114,1115],{},[386,1116,1117],{},"EMAIL_NOT_VERIFIED",[383,1119,1120],{},"Verify your email before you create API keys.",[367,1122,1123,1128],{},[383,1124,1125],{},[386,1126,1127],{},"IMPERSONATION_FORBIDDEN",[383,1129,1130],{},"Support cannot do this while acting as you.",[367,1132,1133,1138],{},[383,1134,1135],{},[386,1136,1137],{},"CSRF_HEADER_REQUIRED",[383,1139,1140,1141,1080],{},"A cabinet session request is missing its ",[386,1142,1143],{},"X-Requested-With",[610,1145,1147],{"id":1146},"not-found-404","Not found (404)",[330,1149,1150,1151,426,1154,426,1157,426,1160,426,1163,426,1166,426,1169,426,1172,426,1175,426,1178,426,1181,426,1184,426,1187,426,1190,1193,1194,1197],{},"The resource does not exist or belongs to another organization. The code names what was not found: ",[386,1152,1153],{},"ORG_NOT_FOUND",[386,1155,1156],{},"PROJECT_NOT_FOUND",[386,1158,1159],{},"INDEX_NOT_FOUND",[386,1161,1162],{},"DOCUMENT_NOT_FOUND",[386,1164,1165],{},"TASK_NOT_FOUND",[386,1167,1168],{},"PROFILE_NOT_FOUND",[386,1170,1171],{},"SUGGEST_NOT_FOUND",[386,1173,1174],{},"SUGGESTION_NOT_FOUND",[386,1176,1177],{},"SYNONYM_NOT_FOUND",[386,1179,1180],{},"RULE_NOT_FOUND",[386,1182,1183],{},"API_KEY_NOT_FOUND",[386,1185,1186],{},"MEMBER_NOT_FOUND",[386,1188,1189],{},"USER_NOT_FOUND",[386,1191,1192],{},"SESSION_NOT_FOUND",". A route that does not exist answers ",[386,1195,1196],{},"NOT_FOUND",".",[610,1199,1201],{"id":1200},"conflict-409","Conflict (409)",[361,1203,1204,1212],{},[364,1205,1206],{},[367,1207,1208,1210],{},[370,1209,790],{},[370,1211,793],{},[378,1213,1214,1224,1234,1244,1254,1264,1274,1284,1303,1317,1327,1337],{},[367,1215,1216,1221],{},[383,1217,1218],{},[386,1219,1220],{},"EMAIL_TAKEN",[383,1222,1223],{},"An account with this email already exists.",[367,1225,1226,1231],{},[383,1227,1228],{},[386,1229,1230],{},"ALREADY_MEMBER",[383,1232,1233],{},"The person is already a member of the organization.",[367,1235,1236,1241],{},[383,1237,1238],{},[386,1239,1240],{},"USER_NOT_VERIFIED",[383,1242,1243],{},"The person has not verified their email yet, so they cannot be added to an organization.",[367,1245,1246,1251],{},[383,1247,1248],{},[386,1249,1250],{},"LAST_OWNER",[383,1252,1253],{},"The change would leave the organization without an owner.",[367,1255,1256,1261],{},[383,1257,1258],{},[386,1259,1260],{},"INDEX_NAME_TAKEN",[383,1262,1263],{},"The project already has an index with this name.",[367,1265,1266,1271],{},[383,1267,1268],{},[386,1269,1270],{},"PROFILE_NAME_TAKEN",[383,1272,1273],{},"The index already has a profile with this name.",[367,1275,1276,1281],{},[383,1277,1278],{},[386,1279,1280],{},"SUGGESTION_TAKEN",[383,1282,1283],{},"The index already has a custom suggestion with this text.",[367,1285,1286,1300],{},[383,1287,1288,426,1291,426,1294,426,1297],{},[386,1289,1290],{},"PROFILE_LIMIT_REACHED",[386,1292,1293],{},"RULE_LIMIT_REACHED",[386,1295,1296],{},"SYNONYM_LIMIT_REACHED",[386,1298,1299],{},"SUGGESTION_LIMIT_REACHED",[383,1301,1302],{},"The index holds the most profiles, rules, synonym rules or custom suggestions it can.",[367,1304,1305,1310],{},[383,1306,1307],{},[386,1308,1309],{},"IDEMPOTENCY_KEY_REUSED",[383,1311,1312,1313,1316],{},"This ",[386,1314,1315],{},"Idempotency-Key"," was already used for another index, session or operation.",[367,1318,1319,1324],{},[383,1320,1321],{},[386,1322,1323],{},"VERSION_BUILDING",[383,1325,1326],{},"A new index version is being built. Retry once it finishes.",[367,1328,1329,1334],{},[383,1330,1331],{},[386,1332,1333],{},"REINDEX_NOT_RUNNING",[383,1335,1336],{},"There is no reindex to cancel.",[367,1338,1339,1347],{},[383,1340,1341,426,1344],{},[386,1342,1343],{},"SESSION_OPEN",[386,1345,1346],{},"SESSION_NOT_OPEN",[383,1348,1349],{},"A full catalog sync is open and blocks this, or the sync is no longer open.",[610,1351,1353],{"id":1352},"other-statuses","Other statuses",[361,1355,1356,1366],{},[364,1357,1358],{},[367,1359,1360,1362,1364],{},[370,1361,314],{},[370,1363,790],{},[370,1365,793],{},[378,1367,1368,1384,1399],{},[367,1369,1370,1373,1378],{},[383,1371,1372],{},"413",[383,1374,1375],{},[386,1376,1377],{},"PAYLOAD_TOO_LARGE",[383,1379,1380,1381,1383],{},"The body is larger than the route accepts: 10 MB on document uploads, synonym imports and ",[386,1382,414],{},", 100 kB everywhere else.",[367,1385,1386,1388,1393],{},[383,1387,555],{},[383,1389,1390],{},[386,1391,1392],{},"RATE_LIMITED",[383,1394,1395,1396,1398],{},"Too many requests. Wait for the ",[386,1397,559],{}," seconds.",[367,1400,1401,1404,1409],{},[383,1402,1403],{},"500",[383,1405,1406],{},[386,1407,1408],{},"INTERNAL",[383,1410,1411],{},"Something failed on our side. Retry later, and contact support if it keeps failing.",[325,1413,1415],{"id":1414},"related","Related",[337,1417,1418,1422,1427],{},[340,1419,1420],{},[542,1421,68],{"href":69},[340,1423,1424],{},[542,1425,49],{"href":1426},"\u002Fdocs\u002Faccount\u002Forganizations#what-each-role-may-do",[340,1428,1429],{},[542,1430,29],{"href":30},[1432,1433,1434],"style",{},"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 .s7iLA, html code.shiki .s7iLA{--shiki-light:#0E1116;--shiki-default:#0E1116;--shiki-dark:#F0F3F6}html pre.shiki code .sb7M8, html code.shiki .sb7M8{--shiki-light:#024C1A;--shiki-default:#024C1A;--shiki-dark:#72F088}html pre.shiki code .semJd, html code.shiki .semJd{--shiki-light:#032563;--shiki-default:#032563;--shiki-dark:#ADDCFF}",{"title":567,"searchDepth":580,"depth":580,"links":1436},[1437,1438,1439,1442,1443,1451],{"id":327,"depth":580,"text":328},{"id":358,"depth":580,"text":359},{"id":548,"depth":580,"text":549,"children":1440},[1441],{"id":612,"depth":586,"text":613},{"id":642,"depth":580,"text":643},{"id":765,"depth":580,"text":766,"children":1444},[1445,1446,1447,1448,1449,1450],{"id":780,"depth":586,"text":781},{"id":967,"depth":586,"text":968},{"id":1043,"depth":586,"text":1044},{"id":1146,"depth":586,"text":1147},{"id":1200,"depth":586,"text":1201},{"id":1352,"depth":586,"text":1353},{"id":1414,"depth":580,"text":1415},"md",{},{"icon":77},{"title":73,"description":76},"tLp09zyPhvB0sJJ63RjeStVm_fd0y31Fd5mTd4vACUE",[1458,1459],{"title":68,"path":69,"stem":70,"description":71,"icon":63,"children":-1},{"title":86,"path":87,"stem":88,"description":89,"icon":81,"children":-1},1792794344452]