[{"data":1,"prerenderedAt":392},["ShallowReactive",2],{"navigation_docs":3,"-scraping-webhooks":178,"-scraping-webhooks-surround":387},[4,25,50,81,112,133,158],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":16,"path":17,"stem":18,"icon":19},"Concepts","\u002Fgetting-started\u002Fconcepts","1.getting-started\u002F2.concepts","i-lucide-book-a",{"title":21,"path":22,"stem":23,"icon":24},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-rocket",{"title":26,"icon":27,"path":28,"stem":29,"children":30,"page":6},"Workspace","i-lucide-users","\u002Fworkspace","2.workspace",[31,36,41,45],{"title":32,"path":33,"stem":34,"icon":35},"Account","\u002Fworkspace\u002Faccount","2.workspace\u002F1.account","i-lucide-circle-user",{"title":37,"path":38,"stem":39,"icon":40},"Teams","\u002Fworkspace\u002Fteams","2.workspace\u002F2.teams","i-lucide-building-2",{"title":42,"path":43,"stem":44,"icon":27},"Members and roles","\u002Fworkspace\u002Fmembers-and-roles","2.workspace\u002F3.members-and-roles",{"title":46,"path":47,"stem":48,"icon":49},"Projects","\u002Fworkspace\u002Fprojects","2.workspace\u002F4.projects","i-lucide-folder-kanban",{"title":51,"icon":52,"path":53,"stem":54,"children":55,"page":6},"Catalogue","i-lucide-package","\u002Fcatalogue","3.catalogue",[56,61,66,71,76],{"title":57,"path":58,"stem":59,"icon":60},"Products","\u002Fcatalogue\u002Fproducts","3.catalogue\u002F1.products","i-lucide-box",{"title":62,"path":63,"stem":64,"icon":65},"Offers","\u002Fcatalogue\u002Foffers","3.catalogue\u002F2.offers","i-lucide-tag",{"title":67,"path":68,"stem":69,"icon":70},"Brands","\u002Fcatalogue\u002Fbrands","3.catalogue\u002F3.brands","i-lucide-badge-check",{"title":72,"path":73,"stem":74,"icon":75},"Merchants","\u002Fcatalogue\u002Fmerchants","3.catalogue\u002F4.merchants","i-lucide-store",{"title":77,"path":78,"stem":79,"icon":80},"Custom attributes","\u002Fcatalogue\u002Fcustom-attributes","3.catalogue\u002F5.custom-attributes","i-lucide-list-plus",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":6},"Scraping","i-lucide-scan-search","\u002Fscraping","4.scraping",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Connect Scrape Admin","\u002Fscraping\u002Fconnect-scrape-admin","4.scraping\u002F1.connect-scrape-admin","i-lucide-plug",{"title":93,"path":94,"stem":95,"icon":96},"Scrape profiles","\u002Fscraping\u002Fscrape-profiles","4.scraping\u002F2.scrape-profiles","i-lucide-scan-text",{"title":98,"path":99,"stem":100,"icon":101},"Schedules and configuration","\u002Fscraping\u002Fschedules-and-configuration","4.scraping\u002F3.schedules-and-configuration","i-lucide-sliders-horizontal",{"title":103,"path":104,"stem":105,"icon":106},"Sync and reconcile","\u002Fscraping\u002Fsync-and-reconcile","4.scraping\u002F4.sync-and-reconcile","i-lucide-refresh-cw",{"title":108,"path":109,"stem":110,"icon":111},"Webhooks","\u002Fscraping\u002Fwebhooks","4.scraping\u002F5.webhooks","i-lucide-webhook",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":6},"Growing the catalogue","i-lucide-sprout","\u002Fgrowing-the-catalogue","5.growing-the-catalogue",[118,123,128],{"title":119,"path":120,"stem":121,"icon":122},"Imports","\u002Fgrowing-the-catalogue\u002Fimports","5.growing-the-catalogue\u002F1.imports","i-lucide-import",{"title":124,"path":125,"stem":126,"icon":127},"Repair queues","\u002Fgrowing-the-catalogue\u002Frepair-queues","5.growing-the-catalogue\u002F2.repair-queues","i-lucide-wrench",{"title":129,"path":130,"stem":131,"icon":132},"Wrong URL flow","\u002Fgrowing-the-catalogue\u002Fwrong-url-flow","5.growing-the-catalogue\u002F3.wrong-url-flow","i-lucide-route",{"title":134,"icon":135,"path":136,"stem":137,"children":138,"page":6},"Publishing","i-lucide-globe","\u002Fpublishing","6.publishing",[139,143,148,153],{"title":140,"path":141,"stem":142,"icon":135},"Websites","\u002Fpublishing\u002Fwebsites","6.publishing\u002F1.websites",{"title":144,"path":145,"stem":146,"icon":147},"Website content","\u002Fpublishing\u002Fwebsite-content","6.publishing\u002F2.website-content","i-lucide-languages",{"title":149,"path":150,"stem":151,"icon":152},"SEO templates","\u002Fpublishing\u002Fseo-templates","6.publishing\u002F3.seo-templates","i-lucide-search",{"title":154,"path":155,"stem":156,"icon":157},"Analytics","\u002Fpublishing\u002Fanalytics","6.publishing\u002F4.analytics","i-lucide-chart-line",{"title":159,"icon":160,"path":161,"stem":162,"children":163,"page":6},"Developers","i-lucide-code","\u002Fdevelopers","7.developers",[164,169,173],{"title":165,"path":166,"stem":167,"icon":168},"Public API","\u002Fdevelopers\u002Fpublic-api","7.developers\u002F1.public-api","i-lucide-code-xml",{"title":170,"path":171,"stem":172,"icon":52},"Listings client","\u002Fdevelopers\u002Flistings-client","7.developers\u002F2.listings-client",{"title":174,"path":175,"stem":176,"icon":177},"Click tracking","\u002Fdevelopers\u002Fclick-tracking","7.developers\u002F3.click-tracking","i-lucide-mouse-pointer-click",{"id":179,"title":108,"body":180,"description":379,"extension":380,"links":381,"meta":382,"navigation":383,"path":109,"seo":384,"stem":110,"__hash__":386},"docs\u002F4.scraping\u002F5.webhooks.md",{"type":181,"value":182,"toc":373},"minimark",[183,187,199,204,207,218,225,228,267,277,284,288,299,337,348,359,363,370],[184,185,186],"p",{},"Scrape results do not come in by polling. When Scrape Admin has scraped an offer, it sends the result to the platform with a webhook. The platform checks it, updates the offer's price, stock and status, adds a price history point when the price changed, and logs the delivery.",[188,189,190,191,194,195,198],"note",{},"The ",[192,193,108],"strong",{}," item in the project sidebar is marked ",[192,196,197],{},"Soon"," and shows \"Not available yet\". The project-wide delivery log and destinations are still being built. Today deliveries are inspected per offer, as described below.",[200,201,203],"h2",{"id":202},"how-results-arrive","How results arrive",[184,205,206],{},"Each offer has its own destination:",[208,209,214],"pre",{"className":210,"code":212,"language":213},[211],"language-text","POST \u002Fapi\u002Fwebhooks\u002Fscrape-admin\u002Foffers\u002F{offerId}\nAuthorization: Bearer \u003Cwebhook secret>\n","text",[215,216,212],"code",{"__ignoreMap":217},"",[184,219,220,221,224],{},"The platform sets this up for you when it syncs an offer's entry to Scrape Admin, together with the project's webhook secret, so you normally do not configure anything by hand. See ",[222,223,88],"a",{"href":89}," for the secret and how it is rotated.",[184,226,227],{},"A request is handled in this order:",[229,230,231,239,245,251,257],"ol",{},[232,233,234,235,238],"li",{},"The offer id must exist, otherwise the delivery is logged as ",[192,236,237],{},"Unknown offer",".",[232,240,241,242,238],{},"The bearer token must match the project's webhook secret (the previous one is also accepted for 24 hours after a rotation), otherwise ",[192,243,244],{},"Bad secret",[232,246,247,248,238],{},"The body must be a valid scrape result and no larger than 256 KB, otherwise ",[192,249,250],{},"Invalid payload",[232,252,253,254,238],{},"The same body for the same offer within 10 minutes is acknowledged and dropped as a ",[192,255,256],{},"Duplicate",[232,258,259,260,263,264,238],{},"Otherwise the result is applied and logged as ",[192,261,262],{},"Processed",". If applying it fails, it is logged as ",[192,265,266],{},"Failed",[184,268,269,270,273,274,276],{},"Which results Scrape Admin delivers is set per offer with its ",[192,271,272],{},"Webhook trigger"," (on change, on every run, or custom code), see ",[222,275,62],{"href":63},". An offer without one delivers on change. Results that did not change are only delivered when the trigger asks for them.",[184,278,279,280,283],{},"What a processed result does depends on the project's ",[222,281,282],{"href":99},"configuration",": the price and stock attributes it reads, the status codes that deactivate the offer, and whether redirects update the URL.",[200,285,287],{"id":286},"the-delivery-log","The delivery log",[184,289,290,291,294,295,298],{},"Open an offer, click ",[192,292,293],{},"Diagnose"," and choose the ",[192,296,297],{},"Deliveries"," tab. It lists every result Scrape Admin sent for that offer, newest first, ten per page. Each row shows:",[300,301,302,320,323,330],"ul",{},[232,303,304,305,307,308,307,310,307,312,307,314,316,317,319],{},"the status: ",[192,306,262],{},", ",[192,309,256],{},[192,311,244],{},[192,313,250],{},[192,315,237],{}," or ",[192,318,266],{},";",[232,321,322],{},"the HTTP status the platform answered with and how long it took;",[232,324,325,326,329],{},"a ",[192,327,328],{},"replay"," badge if the row is itself a replay;",[232,331,332,333,336],{},"when it was received, any error, and the fields it ",[192,334,335],{},"Changed",", such as the price.",[184,338,339,340,343,344,347],{},"Click a row to expand it. You see the ",[192,341,342],{},"normalized"," result, which is what the platform understood, and the raw ",[192,345,346],{},"body"," as sent. Deliveries that were rejected before authentication, and duplicates, have no stored payload.",[184,349,350,351,354,355,358],{},"When nothing is listed, the offer has not received a result yet. If the project is connected, check the ",[192,352,353],{},"Scrape Admin"," tab in the same dialog for failed runs: runs that fail inside Scrape Admin never send a webhook, which is why an offer can become ",[192,356,357],{},"Stale"," instead.",[200,360,362],{"id":361},"replay-a-delivery","Replay a delivery",[184,364,365,366,369],{},"Admins can click ",[192,367,368],{},"Replay"," on an expanded delivery. The platform runs the stored body through the same processing again, as if it had just arrived, and logs a new delivery marked as a replay. A toast tells you which fields changed, or that nothing changed.",[184,371,372],{},"Replay is useful after you changed the configuration, for example the price attributes or status codes, or after fixing a currency problem, and want an earlier result to be applied under the new rules. It only works while the delivery has a stored body and the offer still exists.",{"title":217,"searchDepth":374,"depth":374,"links":375},2,[376,377,378],{"id":202,"depth":374,"text":203},{"id":286,"depth":374,"text":287},{"id":361,"depth":374,"text":362},"How scrape results arrive from Scrape Admin, how to read the delivery log and how to replay a delivery.","md",null,{},{"icon":111},{"title":108,"description":385},"How Scrape Admin delivers scrape results to the platform, which requests are accepted or rejected, how to read an offer's delivery log and how to replay a delivery.","dvgxXFzORdyb0aLGh0EENwVuEt3paAYBoDN6wW_LPko",[388,390],{"title":103,"path":104,"stem":105,"description":389,"icon":106,"children":-1},"Keep profiles, merchants and offers in step with Scrape Admin, check for drift and push everything again.",{"title":119,"path":120,"stem":121,"description":391,"icon":122,"children":-1},"Add many product URLs at once as a review list, then accept them into offers one by one or in bulk.",1792440614213]