How to Build a Price Monitoring Agent with Pydantic AI and ZenRows A developer built a price monitoring agent using ZenRows and Pydantic AI that achieves a 99.93% success rate against protected e-commerce sites like Amazon and Walmart. The system addresses two common failure modes: retrieval failures where protected sites return blank pages or block requests, and extraction failures where LLM output drifts in data types across runs. The tutorial demonstrates a two-step pipeline that retrieves product pages via ZenRows and validates LLM output against a defined schema using Pydantic AI. Most price monitoring systems look simple on paper: point a scraper at a product page, ask an LLM to extract the price, and store the result in a database. The problem arises when the same workflow runs continuously against heavily protected targets such as Amazon and Walmart. At scale, reliability becomes the real challenge. The why comes down to two failures that happen quietly: retrieval and extraction. Retrieval fails when a protected site returns a blank JavaScript shell, incomplete data, and a block page instead of the product data. Extraction fails when the LLM returns a field in a data type or shape that your downstream database write action does not expect. Both failures pass for normal output, so the pipeline keeps running and drops records downstream without raising an error. This tutorial shows you how you can build a price monitoring agent using ZenRows and Pydantic AI. ZenRows retrieves the page and returns product details with a 99.93% success rate https://www.zenrows.com/ against protected websites, while Pydantic AI extracts and validates LLM output against a defined schema. The tutorial walks through the two-step pipeline from a single product page to a multi-site price monitoring run across Amazon and Walmart, two heavily protected e-commerce sites. Two failure modes break the price monitoring pipeline: retrieval and extraction. You send a request to the protected site, and the response looks successful at the HTTP level. But the page still contains no usable product data or encounters an error 1020 https://www.zenrows.com/blog/cloudflare-error-1020 what-is-error-1020 . The code below shows this failed retrieval directly. python import requests Demo page that behaves like a protected target PROTECTED URL = "https://www.scrapingcourse.com/antibot-challenge" resp = requests.get PROTECTED URL, timeout=30 print f"status code: {resp.status code}" print f"bytes returned: {len resp.text }" print "contains 'price'?", "price" in resp.text.lower print resp.text :200 The request returns a 403, so the pipeline does not receive the product page required for price monitoring. benny@Mac price monitoring % python3 test.py status code: 403 bytes returned: 5507 contains 'price'? False < DOCTYPE html