[{"data":1,"prerenderedAt":1371},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Findexing\u002Fdata-source":331,"docs-\u002Fdocs\u002Findexing\u002Fdata-source-surround":1368},[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":127,"body":333,"description":130,"extension":1363,"meta":1364,"navigation":1365,"path":128,"seo":1366,"stem":129,"__hash__":1367},"docs\u002Fdocs\u002F4.indexing\u002F6.data-source.md",{"type":334,"value":335,"toc":1338},"minimark",[336,341,345,348,356,360,387,390,394,402,661,664,667,698,701,815,818,821,828,831,834,880,899,903,912,929,933,963,966,970,977,992,999,1002,1008,1038,1045,1055,1059,1090,1093,1103,1106,1116,1126,1132,1136,1140,1143,1148,1150,1152,1156,1159,1162,1165,1210,1214,1315,1319],[337,338,340],"h2",{"id":339},"what-a-data-source-does","What a data source does",[342,343,344],"p",{},"A data source is a URL to your full product feed. Zaproo downloads it on a schedule, turns each item into a document and compares it with what the feed sent last time. Only new and changed products are written. Products that are no longer in the feed are deleted. You write no sync code.",[342,346,347],{},"Each index has at most one data source. The feed must hold the whole catalog on every download, because a product missing from the feed counts as deleted.",[342,349,350,351,355],{},"The data source writes through normal document tasks, so you can follow its writes on the ",[352,353,354],"strong",{},"Tasks"," page. Documents you send through the API are not touched unless the feed also holds their id.",[337,357,359],{"id":358},"before-you-start","Before you start",[342,361,362,363,367,368,372,373,376,377,379,380,383,384,386],{},"The data source writes into the fields of the index ",[364,365,366],"a",{"href":104},"mapping",", so the index needs a mapping first. An index created without fields gets one from its first ",[364,369,371],{"href":370},"\u002Fdocs\u002Findexing\u002Fdocuments#upload-a-file-in-the-cabinet","upload",", or you add the fields on ",[352,374,375],{},"Fields & mapping",". Until then the ",[352,378,127],{}," page shows ",[352,381,382],{},"Map the fields first"," with a link to ",[352,385,375],{},".",[342,388,389],{},"Only organization owners and admins can change the data source. Members see the form and the run log read-only.",[337,391,393],{"id":392},"set-it-up","Set it up",[342,395,396],{},[397,398],"img",{"alt":399,"src":400,"title":401},"The Data source page with the Feed form: Feed URL, Format CSV \u002F TSV with Delimiter and Encoding, Authentication None, Schedule Every day, Max deletions per run 20%, the Enabled switch on, a Preview button and the start of the Mapping table","\u002Fdocs\u002Fscreenshots\u002Ffeed.png","The Data source page holds the feed settings, the field mapping and the run log",[403,404,406,411,430,539,542,552,556,566,569,593,597,628,634,638],"steps",{"level":405},"3",[407,408,410],"h3",{"id":409},"enter-the-feed","Enter the feed",[342,412,413,414,416,417,420,421,425,426,429],{},"Open the index, then ",[352,415,127],{},". Enter the ",[352,418,419],{},"Feed URL",", for example ",[422,423,424],"code",{},"https:\u002F\u002Fshop.example.com\u002Ffeed.xml",", and pick the ",[352,427,428],{},"Format",". The options next to it change with the format:",[431,432,433,448],"table",{},[434,435,436],"thead",{},[437,438,439,442,445],"tr",{},[440,441,428],"th",{},[440,443,444],{},"Items",[440,446,447],{},"Options",[449,450,451,483,503,516],"tbody",{},[437,452,453,459,462],{},[454,455,456],"td",{},[352,457,458],{},"CSV \u002F TSV",[454,460,461],{},"One row per item; the first row names the fields.",[454,463,464,467,468,471,472,475,476,475,479,482],{},[352,465,466],{},"Delimiter"," (comma, semicolon, tab or pipe) and ",[352,469,470],{},"Encoding"," (",[422,473,474],{},"utf-8",", ",[422,477,478],{},"windows-1251",[422,480,481],{},"windows-1252",").",[437,484,485,490,493],{},[454,486,487],{},[352,488,489],{},"JSON",[454,491,492],{},"The objects of one array.",[454,494,495,498,499,502],{},[352,496,497],{},"Item path",": a dotted path to the array, such as ",[422,500,501],{},"data.products",". Leave it empty when the file is the array.",[437,504,505,510,513],{},[454,506,507],{},[352,508,509],{},"JSON Lines",[454,511,512],{},"One object per line.",[454,514,515],{},"None.",[437,517,518,523,526],{},[454,519,520],{},[352,521,522],{},"XML",[454,524,525],{},"One element per item.",[454,527,528,530,531,534,535,538],{},[352,529,497],{},": element names joined by ",[422,532,533],{},"\u002F",". The default is ",[422,536,537],{},"rss\u002Fchannel\u002Fitem",", which fits Google Shopping feeds.",[342,540,541],{},"Any format may be gzipped. Zaproo detects it.",[342,543,544,545,548,549,386],{},"If the feed needs a password or a token, pick it under ",[352,546,547],{},"Authentication",". See ",[364,550,547],{"href":551},"#authentication",[407,553,555],{"id":554},"preview","Preview",[342,557,558,559,561,562,565],{},"Click ",[352,560,555],{},". Zaproo reads the first 50 items and lists every field it found, with sample values, under ",[352,563,564],{},"Source fields",". Nothing is saved.",[342,567,568],{},"How fields are named:",[570,571,572,576,582],"ul",{},[573,574,575],"li",{},"CSV: the header name.",[573,577,578,579,386],{},"JSON: a dotted path, such as ",[422,580,581],{},"price.amount",[573,583,584,585,588,589,592],{},"XML: the child element name as written, prefix included, such as ",[422,586,587],{},"g:price",". Nested elements join with a dot, such as ",[422,590,591],{},"g:shipping.g:country",". An element that repeats becomes a list.",[407,594,596],{"id":595},"choose-the-source-fields","Choose the source fields",[342,598,599,600,603,604,607,608,611,612,615,616,619,620,623,624,386],{},"The ",[352,601,602],{},"Mapping"," table has one row per index field. For ",[422,605,606],{},"id",", pick the source field that holds the product id. For each other field you want filled, pick a ",[352,609,610],{},"Source field",", or leave it on ",[352,613,614],{},"Not mapped"," to skip it. ",[352,617,618],{},"Pattern"," and ",[352,621,622],{},"Split on"," are optional; see ",[364,625,627],{"href":626},"#map-the-fields","Map the fields",[342,629,558,630,633],{},[352,631,632],{},"Preview mapped documents"," to see the first documents as they will be written, and the items that would be skipped with their reason.",[407,635,637],{"id":636},"save","Save",[342,639,640,641,644,645,648,649,653,654,657,658,660],{},"Pick the ",[352,642,643],{},"Schedule",", check ",[352,646,647],{},"Max deletions per run"," (see ",[364,650,652],{"href":651},"#the-delete-guard","the delete guard",") and keep ",[352,655,656],{},"Enabled"," on. Click ",[352,659,637],{},". The first run starts within a minute.",[337,662,627],{"id":663},"map-the-fields",[342,665,666],{},"Each index field takes its value from one source field. Two optional steps change the value first.",[570,668,669,682],{},[573,670,671,673,674,677,678,681],{},[352,672,618],{}," is a regular expression with exactly one capture group. Only the captured part is kept. To take the id from a product URL like ",[422,675,676],{},"https:\u002F\u002Fshop.example.com\u002Fp\u002F1042",", choose the URL column and enter ",[422,679,680],{},"\u002Fp\u002F(\\d+)",". When the pattern does not match, the value is empty.",[573,683,684,686,687,690,691,694,695,386],{},[352,685,622],{}," turns a text into a list. With ",[422,688,689],{},",",", the value ",[422,692,693],{},"red, blue"," becomes ",[422,696,697],{},"[\"red\", \"blue\"]",[342,699,700],{},"Then the value is converted to the type of the index field:",[431,702,703,713],{},[434,704,705],{},[437,706,707,710],{},[440,708,709],{},"Field type",[440,711,712],{},"What is accepted",[449,714,715,745,772,789,802],{},[437,716,717,731],{},[454,718,719,475,722,475,725,475,728],{},[422,720,721],{},"float",[422,723,724],{},"double",[422,726,727],{},"integer",[422,729,730],{},"long",[454,732,733,734,694,737,740,741,744],{},"The first number in the text: ",[422,735,736],{},"19.99 EUR",[422,738,739],{},"19.99",". A comma decimal such as ",[422,742,743],{},"19,99"," works when there is no dot.",[437,746,747,752],{},[454,748,749],{},[422,750,751],{},"boolean",[454,753,754,475,757,475,760,475,763,475,766,475,769,386],{},[422,755,756],{},"true",[422,758,759],{},"false",[422,761,762],{},"1",[422,764,765],{},"0",[422,767,768],{},"yes",[422,770,771],{},"no",[437,773,774,779],{},[454,775,776],{},[422,777,778],{},"date",[454,780,781,782,785,786,386],{},"ISO dates only, such as ",[422,783,784],{},"2026-10-16"," or ",[422,787,788],{},"2026-10-16T10:00:00Z",[437,790,791,796],{},[454,792,793],{},[422,794,795],{},"hierarchy",[454,797,798,799,386],{},"Passed as is, such as ",[422,800,801],{},"Office > Paper > A4",[437,803,804,812],{},[454,805,806,475,809],{},[422,807,808],{},"text",[422,810,811],{},"keyword",[454,813,814],{},"Passed as is.",[342,816,817],{},"An empty value leaves the field out of the document.",[342,819,820],{},"An item without an id, or whose document does not fit the mapping, is invalid. It is skipped, counted and listed with its reason in the run log. An invalid item is never treated as deleted.",[342,822,823,824,827],{},"If you later remove a field from the index mapping that the data source still fills, runs fail with ",[422,825,826],{},"FEED_MAPPING_OUT_OF_DATE"," until you update the data source.",[337,829,643],{"id":830},"schedule",[342,832,833],{},"The plan sets how often a data source may run:",[431,835,836,846],{},[434,837,838],{},[437,839,840,843],{},[440,841,842],{},"Plan",[440,844,845],{},"Shortest interval",[449,847,848,856,864,872],{},[437,849,850,853],{},[454,851,852],{},"Free",[454,854,855],{},"Every day (1440 minutes)",[437,857,858,861],{},[454,859,860],{},"Starter",[454,862,863],{},"Every 6 hours (360 minutes)",[437,865,866,869],{},[454,867,868],{},"Growth",[454,870,871],{},"Every hour (60 minutes)",[437,873,874,877],{},[454,875,876],{},"Enterprise",[454,878,879],{},"Every 15 minutes",[342,881,882,885,886,888,889,892,893,896,897,386],{},[352,883,884],{},"Sync now",", next to ",[352,887,637],{}," once the data source is saved, starts a run straight away. It is refused with ",[422,890,891],{},"409 FEED_RUN_PENDING"," while a run is queued or running, and with ",[422,894,895],{},"429 FEED_SYNC_TOO_SOON"," within 15 minutes of the previous ",[352,898,884],{},[337,900,902],{"id":901},"pause-or-delete-the-data-source","Pause or delete the data source",[342,904,905,906,908,909,911],{},"To pause it, switch ",[352,907,656],{}," off and click ",[352,910,637],{},". The settings and the run log stay, and no run starts until you switch it back on.",[342,913,914,915,918,919,921,922,924,925,386],{},"To delete it, click ",[352,916,917],{},"Delete"," next to ",[352,920,884],{},", then ",[352,923,917],{}," again to confirm. This removes the data source and its run log. The documents it wrote stay in the index. To empty the index as well, use ",[364,926,928],{"href":927},"\u002Fdocs\u002Findexing\u002Fdocuments#delete-all-documents","Delete all documents",[337,930,932],{"id":931},"what-a-run-does","What a run does",[934,935,936,954,957,960],"ol",{},[573,937,938,939,619,942,945,946,949,950,953],{},"Downloads the feed. Zaproo sends the ",[422,940,941],{},"ETag",[422,943,944],{},"Last-Modified"," of the previous download. When the server answers ",[422,947,948],{},"304 Not Modified",", the run ends as ",[422,951,952],{},"NOT_MODIFIED"," and nothing is read.",[573,955,956],{},"Maps every item and compares it with the version the feed sent last time.",[573,958,959],{},"Writes new and changed products as upsert tasks. Unchanged products are not written.",[573,961,962],{},"Deletes the products that the data source wrote before and that are no longer in the feed. It never deletes documents it did not write.",[342,964,965],{},"A write that fails is retried on the next run.",[407,967,969],{"id":968},"the-delete-guard","The delete guard",[342,971,972,973,976],{},"A broken export can look like a catalog that lost most of its products. To protect the index, a run deletes nothing and ends as ",[422,974,975],{},"GUARDED"," when:",[570,978,979,989],{},[573,980,981,982,984,985,988],{},"more than 20% of the products the data source wrote would be deleted (change the share with ",[352,983,647],{},", or ",[422,986,987],{},"maxDeletePercent"," in the API), or",[573,990,991],{},"more than 10% of the items in the feed are invalid.",[342,993,994,995,998],{},"New and changed products are still written. Once the feed is fixed, the next run deletes as usual. A feed with no valid items fails with ",[422,996,997],{},"EMPTY_FEED"," and deletes nothing.",[337,1000,547],{"id":1001},"authentication",[342,1003,1004,1005,1007],{},"Under ",[352,1006,547],{},", pick how Zaproo signs in to your feed:",[570,1009,1010,1015,1025],{},[573,1011,1012,386],{},[352,1013,1014],{},"None",[573,1016,1017,1020,1021,1024],{},[352,1018,1019],{},"Basic (user:password)",": enter ",[422,1022,1023],{},"user:password"," in the box next to it.",[573,1026,1027,1030,1031,1034,1035,386],{},[352,1028,1029],{},"Header (Name: value)",": enter one header as ",[422,1032,1033],{},"Name: value",", such as ",[422,1036,1037],{},"X-Api-Key: 3f9c…",[342,1039,1040,1041,1044],{},"The secret is stored encrypted and never shown again. Once one is stored, the box says ",[352,1042,1043],{},"A secret is stored. Leave this empty to keep it."," Type a new one to replace it. A URL on another host, port or scheme needs the secret typed again.",[342,1046,1047,1048,785,1051,1054],{},"The URL must be public ",[422,1049,1050],{},"http",[422,1052,1053],{},"https",". Addresses in private and local networks are refused.",[337,1056,1058],{"id":1057},"run-log","Run log",[342,1060,599,1061,1063,1064,1067,1068,619,1071,1073,1074,1067,1077,619,1080,1082,1083,1086,1087,1089],{},[352,1062,1058],{}," below the form lists the runs in two tabs. ",[352,1065,1066],{},"Succeeded"," holds ",[422,1069,1070],{},"SUCCEEDED",[422,1072,952],{}," runs. ",[352,1075,1076],{},"Failed",[422,1078,1079],{},"FAILED",[422,1081,975],{}," runs. A run in progress shows on top. Click ",[352,1084,1085],{},"Refresh"," to load new runs. Click a run to see the HTTP answer, the counts (seen, created, updated, unchanged, deleted, invalid, duplicates), the error, up to 50 skipped items with their reason, the start of the response body for failed and guarded runs, and links to its tasks on the ",[352,1088,354],{}," page.",[342,1091,1092],{},"Zaproo keeps the newest 20 successful and the newest 20 failed runs.",[342,1094,1095,1096,1099,1100,1102],{},"After 10 failed runs in a row the data source turns itself off. The page shows ",[352,1097,1098],{},"The data source is off"," with the last error. Fix the cause, switch ",[352,1101,656],{}," back on and save.",[337,1104,133],{"id":1105},"integrations",[342,1107,1108,1109,1112,1113,1115],{},"A shop platform plugin, such as the Magento 2 module, writes documents itself, so an index it is connected to does not need a data source. While a plugin is connected, a data source cannot be saved or synced (",[422,1110,1111],{},"409 INDEX_HAS_INTEGRATION",") and does not run on its schedule. A data source saved before stays stored and resumes when the plugin is disconnected. While the plugin is connected, the ",[352,1114,127],{}," page shows only the plugin; the data source form and its run log come back once you disconnect it.",[342,1117,1118,1119,1121,1122,1125],{},"The plugin connects with a full-access secret key and reports its settings each time they change. The index overview and the ",[352,1120,127],{}," page show it. To stop using it, for example when the shop is gone or the plugin is uninstalled, click ",[352,1123,1124],{},"Disconnect"," there. Documents stay in the index. A plugin that is still installed connects again the next time it saves its settings.",[1127,1128],"api-route",{"auth":1129,"method":1130,"path":1131},"A full-access secret key","PUT","\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Fintegration",[1127,1133],{"auth":1134,"method":1135,"path":1131},"Project admin or a full-access secret key","DELETE",[337,1137,1139],{"id":1138},"with-the-api","With the API",[342,1141,1142],{},"Everything on the page has a route. There are no MCP tools for data sources.",[1127,1144],{"auth":1145,"method":1146,"path":1147},"Project member or any secret key","GET","\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Ffeed",[1127,1149],{"auth":1134,"method":1130,"path":1147},[1127,1151],{"auth":1134,"method":1135,"path":1147},[1127,1153],{"auth":1134,"method":1154,"path":1155},"POST","\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Ffeed\u002Fpreview",[1127,1157],{"auth":1134,"method":1154,"path":1158},"\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Ffeed\u002Fsync",[1127,1160],{"auth":1145,"method":1146,"path":1161},"\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Ffeed\u002Fruns",[1127,1163],{"auth":1145,"method":1146,"path":1164},"\u002Fv1\u002Fprojects\u002F:projectId\u002Findices\u002F:indexId\u002Ffeed\u002Fruns\u002F:runId",[342,1166,1167,1169,1170,475,1173,475,1176,475,1179,475,1182,475,1184,475,1187,1190,1191,1193,1194,1196,1197,1199,1200,1203,1204,1199,1207,386],{},[422,1168,1130],{}," creates or replaces the index's one data source. Its body holds ",[422,1171,1172],{},"url",[422,1174,1175],{},"format",[422,1177,1178],{},"formatOptions",[422,1180,1181],{},"auth",[422,1183,366],{},[422,1185,1186],{},"intervalMinutes",[422,1188,1189],{},"enabled"," (default ",[422,1192,756],{},") and ",[422,1195,987],{}," (default 20). ",[422,1198,1135],{}," answers ",[422,1201,1202],{},"204",", and ",[422,1205,1206],{},"sync",[422,1208,1209],{},"202",[337,1211,1213],{"id":1212},"errors","Errors",[431,1215,1216,1226],{},[434,1217,1218],{},[437,1219,1220,1223],{},[440,1221,1222],{},"Code",[440,1224,1225],{},"When",[449,1227,1228,1238,1253,1263,1273,1283,1293,1304],{},[437,1229,1230,1235],{},[454,1231,1232],{},[422,1233,1234],{},"409 FEED_NEEDS_MAPPING",[454,1236,1237],{},"The index has no mapping yet.",[437,1239,1240,1244],{},[454,1241,1242],{},[422,1243,1111],{},[454,1245,1246,1247,1249,1250,386],{},"Saving or ",[352,1248,884],{}," while a shop platform plugin is connected. See ",[364,1251,133],{"href":1252},"#integrations",[437,1254,1255,1260],{},[454,1256,1257],{},[422,1258,1259],{},"400 FEED_MAPPING_INVALID",[454,1261,1262],{},"A mapped index field is not in the index mapping.",[437,1264,1265,1270],{},[454,1266,1267],{},[422,1268,1269],{},"400 FEED_INTERVAL_NOT_ALLOWED",[454,1271,1272],{},"The interval is shorter than the plan allows.",[437,1274,1275,1280],{},[454,1276,1277],{},[422,1278,1279],{},"400 FEED_AUTH_SECRET_REQUIRED",[454,1281,1282],{},"Basic or Header authentication was chosen without a secret, and none of that kind is stored for the same host, port and scheme.",[437,1284,1285,1290],{},[454,1286,1287],{},[422,1288,1289],{},"422 FEED_FETCH_FAILED",[454,1291,1292],{},"Preview could not download or read the feed. The message says why.",[437,1294,1295,1299],{},[454,1296,1297],{},[422,1298,891],{},[454,1300,1301,1303],{},[352,1302,884],{}," while a run is queued or running.",[437,1305,1306,1310],{},[454,1307,1308],{},[422,1309,895],{},[454,1311,1312,1314],{},[352,1313,884],{}," within 15 minutes of the previous one.",[337,1316,1318],{"id":1317},"related","Related",[570,1320,1321,1325,1329,1333],{},[573,1322,1323],{},[364,1324,103],{"href":104},[573,1326,1327],{},[364,1328,109],{"href":110},[573,1330,1331],{},[364,1332,115],{"href":116},[573,1334,1335],{},[364,1336,1337],{"href":147},"Magento extension",{"title":1339,"searchDepth":1340,"depth":1340,"links":1341},"",2,[1342,1343,1344,1351,1352,1353,1354,1357,1358,1359,1360,1361,1362],{"id":339,"depth":1340,"text":340},{"id":358,"depth":1340,"text":359},{"id":392,"depth":1340,"text":393,"children":1345},[1346,1348,1349,1350],{"id":409,"depth":1347,"text":410},3,{"id":554,"depth":1347,"text":555},{"id":595,"depth":1347,"text":596},{"id":636,"depth":1347,"text":637},{"id":663,"depth":1340,"text":627},{"id":830,"depth":1340,"text":643},{"id":901,"depth":1340,"text":902},{"id":931,"depth":1340,"text":932,"children":1355},[1356],{"id":968,"depth":1347,"text":969},{"id":1001,"depth":1340,"text":547},{"id":1057,"depth":1340,"text":1058},{"id":1105,"depth":1340,"text":133},{"id":1138,"depth":1340,"text":1139},{"id":1212,"depth":1340,"text":1213},{"id":1317,"depth":1340,"text":1318},"md",{},{"icon":131},{"title":127,"description":130},"SGS8rQWCfOHwqThQTWJehmICLlok5hpw-A80SHMMsfw",[1369,1370],{"title":121,"path":122,"stem":123,"description":124,"icon":125,"children":-1},{"title":140,"path":141,"stem":142,"description":143,"icon":144,"children":-1},1793717706308]