[{"data":1,"prerenderedAt":250},["ShallowReactive",2],{"learn-courses":3},[4,60,101,140,179,217],{"order":5,"slug":6,"title":7,"subtitle":8,"cardText":9,"level":10,"time":11,"lessonCount":12,"lessons":13},1,"competitor-price-monitoring","Build a competitor price monitoring pipeline","Price monitoring looks like a scraping problem for about a week. Then you discover that scraping was the easy part, and the project actually lives or dies on which competitors you picked, whether their listings are really the same product as yours, and whether anyone notices the morning the feed comes back half empty. This course is those eight decisions, in the order you have to make them.","From \"we check three competitors by hand on Mondays\" to a feed you trust enough to reprice from. The eight decisions in order, including the two that quietly ruin most projects.","No coding required","8 lessons, about 90 minutes",8,[14,21,27,34,39,45,50,55],{"slug":15,"navTitle":16,"title":17,"summary":18,"time":19,"needsAccount":20},"what-is-competitor-price-monitoring","What it actually is","What competitor price monitoring actually is","The four stages of a price pipeline, why only two of them are scraping, and the one question to ask before you build anything.","9 min",false,{"slug":22,"navTitle":23,"title":24,"summary":25,"time":26,"needsAccount":20},"choose-competitors-and-skus","Choosing what to track","Choosing which competitors and which SKUs to track","How to build a list that is small enough to afford and large enough to matter, using margin at risk rather than gut feel.","11 min",{"slug":28,"navTitle":29,"title":30,"summary":31,"time":32,"needsAccount":33},"find-competitor-product-urls","Finding product URLs","Finding every competitor product URL without copying them by hand","Four ways to get a competitor's full product URL list, ranked by how much work they are, and what to do when none of them work.","12 min",true,{"slug":35,"navTitle":36,"title":37,"summary":38,"time":32,"needsAccount":33},"extract-price-stock-and-shipping","Extracting the fields","Getting price, stock and shipping off the page","Which fields to extract, why the sale price is two fields and not one, and the four ways a price appears on a page.",{"slug":40,"navTitle":41,"title":42,"summary":43,"time":44,"needsAccount":20},"match-listings-to-your-catalogue","Matching to your catalogue","Matching competitor listings to your own catalogue","The stage that decides whether your feed is intelligence or fiction, and the denominator trick that makes bad match rates look good.","13 min",{"slug":46,"navTitle":47,"title":48,"summary":49,"time":26,"needsAccount":20},"schedule-runs-and-catch-silent-failure","Scheduling and data quality","Scheduling runs and catching silent data loss","How often to actually check, and the four alerts that catch a degrading feed before someone reprices from it.",{"slug":51,"navTitle":52,"title":53,"summary":54,"time":19,"needsAccount":33},"export-to-sheets-bi-and-erp","Getting the data out","Getting the data into Sheets, BI or your ERP","Four delivery routes ranked by how likely they are to actually get used, and the column contract that stops downstream jobs breaking.",{"slug":56,"navTitle":57,"title":58,"summary":59,"time":32,"needsAccount":20},"turn-price-data-into-repricing-rules","From data to decisions","Turning price data into repricing decisions","Why \"match the cheapest\" destroys margin, what a rule needs besides a competitor price, and how to start without automating anything.",{"order":61,"slug":62,"title":63,"subtitle":64,"cardText":65,"level":66,"time":67,"lessonCount":68,"lessons":69},2,"ai-agent-web-data-mcp","Give your AI agent live web data via MCP","Ask an assistant what a product costs today and you will usually get a number. It is often wrong, and it is always wrong in the same way: the model is reconstructing a plausible price from training data rather than looking at a page. This course is about closing that gap properly — what the Model Context Protocol actually is, how to wire a server into a client, how to design tools a model can use without hand-holding, and what to put in place before an agent spends your money.","Your agent is confidently wrong about prices because it has never seen one. What MCP is, how to connect a server, how to design tools a model can actually use, and the guardrails you need before you let it loose.","Comfortable editing a config file","6 lessons, about 60 minutes",6,[70,75,81,86,91,96],{"slug":71,"navTitle":72,"title":73,"summary":74,"time":19,"needsAccount":20},"what-is-mcp","What MCP is","What MCP actually is, in plain terms","The Model Context Protocol described without jargon: what problem it solves, its three primitives, and when it is the wrong tool.",{"slug":76,"navTitle":77,"title":78,"summary":79,"time":80,"needsAccount":20},"why-agents-get-live-data-wrong","Why agents get it wrong","Why your agent's answer about a price is wrong","Four distinct failure modes that all look identical from the outside, and how to tell which one you have before you try to fix it.","10 min",{"slug":82,"navTitle":83,"title":84,"summary":85,"time":80,"needsAccount":20},"connect-an-mcp-server","Connecting a server","Connecting an MCP server and proving it works","The config for local and remote servers, the four things that go wrong, and how to verify the tools registered rather than assuming.",{"slug":87,"navTitle":88,"title":89,"summary":90,"time":26,"needsAccount":20},"design-tools-an-agent-can-use","Designing usable tools","Designing tools an agent can actually use","A connected server is not a useful server. The model only sees your tool names, descriptions and parameter schemas, so those three things are the entire user interface. Here is what makes a tool get called correctly and what makes it get ignored.",{"slug":92,"navTitle":93,"title":94,"summary":95,"time":32,"needsAccount":33},"give-an-agent-a-scraper","Giving an agent a scraper","Giving an agent a real price feed","A worked example. Connect the ScrapeWise MCP server to a client, let the agent read a live scraper's output, and watch where the hand-off between \"the data is right\" and \"the answer is right\" actually breaks.",{"slug":97,"navTitle":98,"title":99,"summary":100,"time":26,"needsAccount":20},"guardrails-cost-and-untrusted-content","Guardrails and cost","Guardrails, cost control and untrusted content","Live web access turns an agent into something that can spend money and read text written by strangers. Neither is a reason not to do it. Both are reasons to put limits in before you need them.",{"order":102,"slug":103,"title":104,"subtitle":105,"cardText":106,"level":107,"time":108,"lessonCount":68,"lessons":109},3,"product-data-api","Pull product data over an API","Search volume for \"\u003Cretailer> API documentation\" is enormous and the documentation mostly does not exist. Amazon, Walmart, Target, Home Depot — developers keep looking for a product endpoint that was never published, or that was published and then locked behind a partner agreement. So you end up calling a web data API instead: something that takes a URL and gives you back the fields. This course is about doing that properly, from the first authenticated request to a feed your warehouse can depend on.","Every retailer gets asked for an API and most of them never ship one, so you end up calling somebody else's. What a product data API actually returns, how to declare the fields you want, why long runs are asynchronous, and how to retry without paying twice.","Comfortable with HTTP and JSON","6 lessons, about 70 minutes",[110,115,120,125,130,135],{"slug":111,"navTitle":112,"title":113,"summary":114,"time":80,"needsAccount":20},"when-an-api-beats-a-scraper","API, scraper or dataset","When an API beats writing your own scraper","Three ways to get product data, the honest cost of each, and the specific question that decides between them.",{"slug":116,"navTitle":117,"title":118,"summary":119,"time":80,"needsAccount":20},"authentication-and-your-first-call","Auth and the first call","Authentication, keys, and your first real request","Bearer tokens versus query-string keys, where to keep the secret, and how to read the first response you get back.",{"slug":121,"navTitle":122,"title":123,"summary":124,"time":32,"needsAccount":33},"declare-the-fields-you-want","Declaring the fields","Declaring a schema, and why your fields came back empty","An extractor returns what you asked for, and most people ask badly. How to declare fields, why types matter, and the one mistake that silently drops a column.",{"slug":126,"navTitle":127,"title":128,"summary":129,"time":26,"needsAccount":20},"asynchronous-runs-and-polling","Async runs and polling","Asynchronous runs, polling, and partial results","Why collection APIs hand back a job rather than data, how to poll without hammering, and what to do with a run that finished eighty per cent done.",{"slug":131,"navTitle":132,"title":133,"summary":134,"time":26,"needsAccount":20},"errors-retries-and-double-billing","Errors and retries","Errors, retries, and not paying twice","Which failures are worth retrying, how idempotency keys stop a retry becoming a second invoice, and the error class that means stop rather than try harder.",{"slug":136,"navTitle":137,"title":138,"summary":139,"time":32,"needsAccount":33},"put-the-feed-into-your-stack","Into your stack","Putting the feed into your stack without it drifting","Scheduling, loading, and the schema decisions that determine whether a price feed is still trustworthy in six months.",{"order":141,"slug":142,"title":143,"subtitle":144,"cardText":145,"level":146,"time":147,"lessonCount":68,"lessons":148},4,"keep-scrapers-alive","Keep scrapers alive after the first week","Writing a scraper is a pleasant afternoon. Keeping forty of them returning correct data for two years is a different discipline, and almost nothing written about scraping covers it. This course is the maintenance half: how pages fail, how to tell a block from a redesign from an empty result, what makes a selector durable, and how to find out your feed is wrong before the person using it does.","Every scraper works on the day you write it. This course is about the other three hundred and sixty four days: why they break, how to read a failure instead of guessing at it, which selectors survive a redesign, and how to notice a feed has gone quietly wrong before somebody prices against it.","You already have something running","6 lessons, about 65 minutes",[149,154,159,164,169,174],{"slug":150,"navTitle":151,"title":152,"summary":153,"time":80,"needsAccount":20},"why-scrapers-break","Why scrapers break","The five reasons a scraper stops working","Breakage is not one problem. It is five, they have different fixes, and treating them as one is why maintenance feels endless.",{"slug":155,"navTitle":156,"title":157,"summary":158,"time":32,"needsAccount":20},"read-the-failure-not-the-symptom","Read the failure","Read the failure, not the symptom","A diagnosis routine that gets you to the cause in ten minutes, and the three false conclusions it is designed to prevent.",{"slug":160,"navTitle":161,"title":162,"summary":163,"time":26,"needsAccount":20},"selectors-that-survive-a-redesign","Durable selectors","Selectors that survive a redesign","A ranking of extraction targets by how long they last, why generated class names are a trap, and the fallback chain worth building.",{"slug":165,"navTitle":166,"title":167,"summary":168,"time":26,"needsAccount":20},"bot-walls-and-what-actually-works","Bot walls","Bot walls, and what actually changes the outcome","What a protection layer is measuring, why the laptop test lies to you, and the boring answers that work better than the clever ones.",{"slug":170,"navTitle":171,"title":172,"summary":173,"time":26,"needsAccount":20},"monitor-the-feed-not-the-run","Monitor the feed","Monitor the feed, not the run","Six checks that catch a scraper that is lying to you, and how to set thresholds that do not train everyone to ignore the alert.",{"slug":175,"navTitle":176,"title":177,"summary":178,"time":80,"needsAccount":20},"decide-what-to-do-when-a-site-wins","When a site wins","Deciding what to do when a site wins","A decision rule for fix, work around, or stop — and how to report a coverage gap so that it is useful rather than an apology.",{"order":180,"slug":181,"title":182,"subtitle":183,"cardText":184,"level":185,"time":108,"lessonCount":68,"lessons":186},5,"matching-products-across-sites","Match the same product across different sites","A price comparison is a claim that two things are the same thing. Almost every disappointing price monitoring project fails here rather than at collection: the prices were fine and the matches were not. This course is about doing the matching properly — leaning on identifiers where they exist, being honest about confidence where they do not, and measuring the result in a way that does not flatter you.","Collecting prices is the easy half. Deciding that this product on your site and that product on a competitor's are the same thing is where price monitoring actually succeeds or fails. Identifiers, fuzzy matching, variants, confidence scores and how to measure your match rate without flattering yourself.","You have data from more than one site",[187,192,197,202,207,212],{"slug":188,"navTitle":189,"title":190,"summary":191,"time":80,"needsAccount":20},"why-matching-is-the-hard-part","Why matching is hard","Why matching is the hard part","The same object is described differently by every retailer that sells it, and the differences are not noise — they are deliberate.",{"slug":193,"navTitle":194,"title":195,"summary":196,"time":26,"needsAccount":20},"identifiers-first-gtin-ean-mpn","Identifiers first","Identifiers first: GTIN, EAN, UPC and MPN","What each identifier means, how to validate one before trusting it, and the three ways a correct-looking barcode still produces a wrong match.",{"slug":198,"navTitle":199,"title":200,"summary":201,"time":32,"needsAccount":20},"when-there-is-no-barcode","No barcode","Matching when there is no barcode","Normalisation, blocking, scoring on multiple signals, and why the string similarity algorithm matters far less than everyone assumes.",{"slug":203,"navTitle":204,"title":205,"summary":206,"time":32,"needsAccount":20},"variants-bundles-and-multipacks","Variants and packs","Variants, bundles and multipacks","The highest-scoring wrong matches all live here. Normalising to a comparable unit, and knowing when two things are genuinely not comparable.",{"slug":208,"navTitle":209,"title":210,"summary":211,"time":26,"needsAccount":33},"score-confidence-and-build-a-review-queue","Confidence and review","Confidence scores and a review queue worth using","Why one score is not enough, how to set the two thresholds, and how to order a queue so an hour of human attention is worth having.",{"slug":213,"navTitle":214,"title":215,"summary":216,"time":26,"needsAccount":20},"measure-your-match-rate-honestly","Measure it honestly","Measure your match rate honestly","The denominator everyone picks is the flattering one. Precision, recall, a hand-labelled sample, and what to do with a number you do not like.",{"order":68,"slug":218,"title":219,"subtitle":220,"cardText":221,"level":222,"time":223,"lessonCount":180,"lessons":224},"web-scraping-legal-and-ethical","The legal and ethical side, without the hand-waving","Most writing on this subject is either a confident \"it's public data, you're fine\" or a lawyer's refusal to say anything useful. Neither helps you decide whether to start. This course sets out the distinctions that actually matter — public versus logged-in, factual versus personal, considerate versus costly — so you can make a defensible call and write it down. It is written by practitioners and it is not legal advice.","The question that stops projects: are we allowed to do this? Public data versus terms of service, what changes the moment you log in, where personal data rules bite, what good conduct actually looks like, and how to write the one page your legal team needs.","No legal background assumed","5 lessons, about 55 minutes",[225,230,235,240,245],{"slug":226,"navTitle":227,"title":228,"summary":229,"time":80,"needsAccount":20},"is-web-scraping-legal","Is it legal?","Three questions hiding inside one","\"Is scraping legal\" bundles access, copying and use into a single question. Separating them is most of the work.",{"slug":231,"navTitle":232,"title":233,"summary":234,"time":26,"needsAccount":20},"public-data-terms-of-service-and-logins","Terms and logins","Public data, terms of service, and what changes at the login","Why a terms page you never agreed to is weaker than people think, why the one you did agree to is stronger, and where that leaves mobile app APIs.",{"slug":236,"navTitle":237,"title":238,"summary":239,"time":26,"needsAccount":20},"personal-data-and-gdpr","Personal data","Personal data, and why product scraping quietly becomes it","Public does not mean unregulated. The categories that catch people out, and the simplest way to stay clear of the whole problem.",{"slug":241,"navTitle":242,"title":243,"summary":244,"time":26,"needsAccount":20},"rate-limits-robots-and-being-a-good-citizen","Conduct and rate limits","Rate limits, robots.txt, and being easy to live with","The conduct half. What robots.txt is for, what rate to actually use, and why identifying yourself is the most underrated decision available.",{"slug":246,"navTitle":247,"title":248,"summary":249,"time":32,"needsAccount":20},"what-to-put-in-front-of-your-legal-team","Briefing legal","What to put in front of your legal team","A one-page brief that gets a real answer, the three mistakes that guarantee a no, and the position we operate under ourselves.",1791047864771]