<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rachel-Lee Nabors</title>
    <description>The latest articles on DEV Community by Rachel-Lee Nabors (@nearestnabors).</description>
    <link>https://dev.to/nearestnabors</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F45875%2F9a10e10f-c775-40df-99d0-d1ac586780ec.jpg</url>
      <title>DEV Community: Rachel-Lee Nabors</title>
      <link>https://dev.to/nearestnabors</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nearestnabors"/>
    <language>en</language>
    <item>
      <title>IE6, AI, and the future of browsing the Web</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Thu, 05 Jun 2025 14:33:38 +0000</pubDate>
      <link>https://dev.to/nearestnabors/ie6-ai-and-the-future-of-browsing-the-web-5bn5</link>
      <guid>https://dev.to/nearestnabors/ie6-ai-and-the-future-of-browsing-the-web-5bn5</guid>
      <description>&lt;p&gt;Chrome is the next IE6.&lt;/p&gt;

&lt;p&gt;The signs are there. A few years back, Google cut funding to longstanding community contractors working on standards with the W3C. Community members I spoke with at CSS Day 2023 in Amsterdam found the move confusing, given that Google had supported this vital work for so many years. And maybe it was important—to the Web. But what Google was saying with its actions was, “This work is &lt;strong&gt;not&lt;/strong&gt; important for Google right now.”&lt;/p&gt;

&lt;p&gt;And with good reason. For the first time ever, Google searches are dropping. And despite rhetoric that “users won’t pay to use the Web” they &lt;em&gt;are&lt;/em&gt; paying to use AI services competing with the Web like Perplexity. This happened once before when mobile apps hit the scene, and Google rose to defend the Web (and its advertising income) by launching Chrome, AMP, and a host of other initiatives to keep the web competitive with walled garden app stores.&lt;/p&gt;

&lt;p&gt;But this time is different. AI just broke the Web that Google built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chrome’s IE6 era
&lt;/h2&gt;

&lt;p&gt;While Google’s Chrome Platform team has been shipping new standards for web developers, Chrome, the browser itself, hasn’t made any significant improvements to its user experience in years. (By comparison, Firefox has shipped more UI updates in the same 5 years, including ones like sidebar navigation for tabs.) Perhaps Google sees no need to “fix” what is already working for ~70% of the Internet.&lt;/p&gt;

&lt;p&gt;A similar situation occurred with Microsoft’s Internet Explorer 6 (IE6). After finally achieving a 90% browser market share, Microsoft lost interest and diverted its resources to sell more Windows and Office licenses.&lt;/p&gt;

&lt;p&gt;The next largest browser is Safari, with around 15% of the browser market share, thanks to its iron grip on iOS. If you see Google/lobbyists pushing for &lt;a href="https://www.theverge.com/2024/1/25/24050478/apple-ios-17-4-browser-engines-eu" rel="noopener noreferrer"&gt;Apple to allow other browser engines onto its devices&lt;/a&gt; in courts, it is likely more about gobbling up that high-value slice of market share than giving users the power of choice. Chrome is, and always has been, a vehicle for ad revenue and data collection for Google’s money-making duo: Search and Ads. In protecting these interests, Google has gone so far as to &lt;a href="https://alternativeto.net/category/browsers/chromium-based/" rel="noopener noreferrer"&gt;backpedal on deprecating third-party cookies&lt;/a&gt;, which underpin data collection and ad targeting.&lt;/p&gt;

&lt;p&gt;Although Chrome receives the bulk of browser use, and thus Google has little motivation to innovate and compete, the writing on the wall is that Chrome’s days are numbered. User behavior suggests people are finding LLMs more convenient for finding answers than Googling, where they must leap over hurdles of ads, dive several pages into the search results, and then pogo in and out of websites to find answers to some of their most banal questions. And Google knows this. On May 7th, &lt;a href="https://www.thestreet.com/investing/analysts-reset-alphabet-stock-price-target-after-apples-bold-warning" rel="noopener noreferrer"&gt;Eddy Cue, Apple’s senior VP of services, shared that searches on Safari dipped for the first time last month&lt;/a&gt;, which he attributed to people using AI like Perplexity. Google I/O touted a vision of an Agentic and AI-driven future brought to you by Gemini.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google is shifting its attention
&lt;/h2&gt;

&lt;p&gt;We can watch externally and see how Alphabet is reorganizing Google to accommodate this upcoming modality. We can see them &lt;a href="https://theconversation.com/googles-ai-generated-search-feature-hasnt-yet-changed-how-users-interact-with-search-results-244607" rel="noopener noreferrer"&gt;testing AI-driven search results&lt;/a&gt; in Google. They &lt;a href="https://www.cityam.com/google-slashes-headcount-in-android-chrome-and-pixel-teams/" rel="noopener noreferrer"&gt;reorganized their devices and Chrome teams&lt;/a&gt; a few weeks back, cutting &lt;a href="https://nerdy.dev/ex-googler" rel="noopener noreferrer"&gt;industry-favorite Chrome team members&lt;/a&gt;. What do these actions say?&lt;/p&gt;

&lt;p&gt;Google is saying, “I’m not interested in continuing to pour the same resources into Chrome anymore. I’m not interested in stewarding the Web as we know it.”&lt;/p&gt;

&lt;p&gt;Consider also that the &lt;a href="https://www.cnet.com/tech/us-wants-judge-to-break-up-google-force-sale-of-chrome-heres-what-to-know/" rel="noopener noreferrer"&gt;FTC is currently deciding if Google and Chrome should be split up&lt;/a&gt; (which could see Chrome bought by Perplexity or even Yahoo). Google executives would have to be blind not to see where the ball is going, that ChatGPT and its ilk threaten its core business model of serving ads to people searching for answers. This may explain why, at Google I/O this year, new &lt;a href="https://blog.google/outreach-initiatives/accessibility/android-gemini-ai-gaad-2025/?_bhlid=3bfe910c145393f022185839d3ed11f37fe2c21b" rel="noopener noreferrer"&gt;AI features were shipping at the OS level&lt;/a&gt;, not the browser level. You could interpret all of this as Google pulling back resources from a product that is about to be outmoded, sold off, or, at the very least, doesn’t require further innovation to remain the top browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Web’s post-ads era
&lt;/h2&gt;

&lt;p&gt;If you build websites, you might be offended—“How dare Google stop investing in the free and open web?”&lt;/p&gt;

&lt;p&gt;My friend, Google was always investing in keeping the Web competitive with apps so its ad revenue wouldn’t decline, to the point where it has been creating a &lt;a href="https://www.reddit.com/r/AmputatorBot/comments/ehrq3z/why_did_i_build_amputatorbot/" rel="noopener noreferrer"&gt;“shadow Internet” in the form of AMP&lt;/a&gt;. It has never been altruistic, though it has wisely employed altruists.* And arguably, there’s &lt;a href="https://en.wikipedia.org/wiki/Don%27t_be_evil" rel="noopener noreferrer"&gt;nothing inherently “evil”&lt;/a&gt; about supporting an ecosystem of content with ads. The downside, however, is that the APIs, protocols, and standards Google fostered grew the Web only in one direction: ad-based revenue. &lt;a href="https://stratechery.com/2025/the-agentic-web-and-original-sin/" rel="noopener noreferrer"&gt;The Agentic Web is poised to disrupt the ads-supported ecosystem&lt;/a&gt; because LLMs can deliver facts directly, and AI Agents can pierce through ads and data-collecting tech to harvest content on behalf of users, no human eyes required.&lt;/p&gt;

&lt;p&gt;The question Google—and &lt;strong&gt;you&lt;/strong&gt;—should be asking is, “How do we adapt to a world where people have a magical answer box embedded in their machine and don’t need to visit websites much anymore?”&lt;/p&gt;

&lt;p&gt;This series of posts seeks to address the new challenges facing the Web, its users, and its creators with the introduction of “magical answer boxes,” generated content, and agentic systems. I shall endeavor to share neither optimistic nor pessimistic views but only to drive at the truth of what is happening and what we can do to bring about a thriving ecosystem of creators and consumers. I seek to address the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Money&lt;/strong&gt; Economic models, payments, and protocols for a post-ads economy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Identity&lt;/strong&gt; How we distinguish between ourselves, each other, and our “extended selves,” both personally and programatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reach&lt;/strong&gt; Optimization for reaching audiences using agents and LLMs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; Methods to defend servers and information from unwanted agents and bots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Evolution&lt;/strong&gt;: The creation of new browsers and “browser alternatives”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Web is always a work in progress, and now it is changing more rapidly than ever before. Let’s navigate this shift together.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—&lt;a href="https://nearestnabors.com/" rel="noopener noreferrer"&gt;RL Nabors&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Homework/further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.joanwestenberg.com/from-penny-press-to-protocols-the-structural-shift-ai-forces-on-the-internet/" rel="noopener noreferrer"&gt;From Penny Press to Protocols: The Structural Shift AI Forces on the Internet&lt;/a&gt; picks up where Stratechery left off, drawing parallels with the telegraph’s disruption of the Penny Press and proposing new protocols for content consumption.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://vale.rocks/posts/everything-is-chrome" rel="noopener noreferrer"&gt;Everything Is Chrome&lt;/a&gt; is a deep dive into Chrome’s history, positing that Google has been trying to control the Web through Chrome’s marketplace power.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Originally posted as a &lt;a href="https://bsky.app/profile/nearestnabors.com/post/3lofytcaxuv2v" rel="noopener noreferrer"&gt;thread on BlueSky&lt;/a&gt;, enough people asked for a link to the article version that it seemed like the perfect launch post for this promised series. Thank you to everyone who pre-signed up for this first missive and for encouraging me to share my thoughts and findings on how AI is reshaping our relationship with the Web and each other.&lt;/p&gt;

&lt;p&gt;Special thanks to the following folks for their proofreading and feedback: &lt;a href="https://www.youtube.com/@jherr" rel="noopener noreferrer"&gt;Jack Herrington&lt;/a&gt;, &lt;a href="https://asjes.dev/" rel="noopener noreferrer"&gt;Paul Asjes&lt;/a&gt;, &lt;a href="https://vale.rocks/" rel="noopener noreferrer"&gt;Vale&lt;/a&gt;, &lt;a href="https://bobmonsour.com/" rel="noopener noreferrer"&gt;Bob Monsour&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  About the author
&lt;/h3&gt;

&lt;p&gt;I’ve had the privilege of contributing to projects at Microsoft Edge, Meta’s React team, and AWS Amplify, in addition to working with startups focused on AI, auth, and design systems. As an Invited Expert at the W3C, I helped shape the Web Animation Standard and collaborated with Mozilla on development tools and documentation initiatives. Through these experiences, I’ve learned that while I may have been doing this work for quite some time, the real magic happens in the community. I believe deeply that we—developers, creators, and users—are the true architects of the Web. While standards bodies and large companies influence its direction, the Web ultimately belongs to all of us. Every small contribution we make helps pave the way forward.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The opinions I share in these posts are my own and do not reflect those of my clients or employers, past or present. They reflect only publicly available information.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Thanks for reading &lt;a href="https://agenticweb.nearestnabors.com/" rel="noopener noreferrer"&gt;The Agentic Web! Sign up to receive new posts in your email.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>web</category>
      <category>browsers</category>
    </item>
    <item>
      <title>Scrape raw HTML with AgentQL's REST API</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Mon, 31 Mar 2025 10:26:52 +0000</pubDate>
      <link>https://dev.to/agentql/scrape-raw-html-with-agentqls-rest-api-4e0</link>
      <guid>https://dev.to/agentql/scrape-raw-html-with-agentqls-rest-api-4e0</guid>
      <description>&lt;p&gt;Sometimes you need to extract data from HTML but you don't have a URL to pass to AgentQL's REST API. Fret not: now our REST API endpoint supports querying directly from raw HTML!&lt;/p&gt;

&lt;p&gt;With this functionality, you can scrape data from pages even if you're working behind a firewall, fetching pages with a custom crawler, or integrating with internal tools. Pass the HTML as a string and your AgentQL query, and AgentQL will return structured data in JSON.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/vfzN2rV_A98"&gt;
  &lt;/iframe&gt;
.&lt;/p&gt;
&lt;h2&gt;
  
  
  You asked for it: scraping web pages without a URL
&lt;/h2&gt;

&lt;p&gt;You asked if it was possible to scrape data without Playwright. You told us you were already fetching HTML using custom crawlers. We heard you! This new capability is perfect for querying data from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Private and internal network pages&lt;/li&gt;
&lt;li&gt;Previously crawled pages and HTML dumps&lt;/li&gt;
&lt;li&gt;Archived HTML files and snapshots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can even be used to scrape difficult-to-reach and heavily anti-botted pages. You can navigate to the page using a stealth crawler or your own browser, save the page's HTML or copy it as a string, and follow the steps below!&lt;/p&gt;
&lt;h2&gt;
  
  
  How to extract data from an HTML string
&lt;/h2&gt;

&lt;p&gt;You can pass HTML directly in your API request like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="s1"&gt;'https://api.agentql.com/v1/query-data'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'X-API-Key: &amp;lt;YOUR-API-KEY&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "html": "&amp;lt;!DOCTYPE html&amp;gt;&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;&amp;lt;h1&amp;gt;Main Page&amp;lt;/h1&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;",
  "query": "{ heading }"
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AgentQL will process the HTML and return structured JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"heading"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Main Page"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Got a large, unwieldy chunk of HTML? Or a local file(s) you want to send without the copy-pasting all the HTML every time? Most HTML is going to run into JSON formatting errors if you pass it through raw, anyway. Try this out:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="s1"&gt;'https://api.agentql.com/v1/query-data'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'X-API-Key: &amp;lt;YOUR-API-KEY&amp;gt;'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;jq &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="nt"&gt;--arg&lt;/span&gt; html &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;blog.html&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 &lt;span class="s1"&gt;'{query: "{ heading }", html: $html}'&lt;/span&gt;
&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This combines reading the file with &lt;code&gt;cat&lt;/code&gt; alongside &lt;a href="https://jqlang.org/" rel="noopener noreferrer"&gt;jq&lt;/a&gt;'s power to properly format HTML for a JSON context (escaping double quotes, etc).&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started extracting data with HTML and AgentQL
&lt;/h2&gt;

&lt;p&gt;This feature is available now—no opt-in or special flag required. Learn more in our &lt;a href="https://docs.agentql.com/scraping/getting-data-from-html-api" rel="noopener noreferrer"&gt;guide to getting data from HTML with AgentQL&lt;/a&gt; or the &lt;a href="https://docs.agentql.com/rest-api/api-reference" rel="noopener noreferrer"&gt;REST API Reference&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any questions, join our &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, and we will help you out. We love hearing from you! Find us on &lt;a href="https://x.com/AgentQL" rel="noopener noreferrer"&gt;X&lt;/a&gt;, or &lt;a href="https://bsky.app/profile/agentql.com" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;, too!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—The TinyFish team building AgentQL&lt;/em&gt;&lt;/p&gt;

</description>
      <category>scraping</category>
      <category>data</category>
    </item>
    <item>
      <title>AgentQL Enters the Agentic World with Langchain and LlamaIndex</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Sun, 16 Mar 2025 05:05:40 +0000</pubDate>
      <link>https://dev.to/agentql/agentql-enters-the-agentic-world-with-langchain-and-llamaindex-135h</link>
      <guid>https://dev.to/agentql/agentql-enters-the-agentic-world-with-langchain-and-llamaindex-135h</guid>
      <description>&lt;p&gt;AgentQL now integrates with &lt;strong&gt;Langchain and LlamaIndex&lt;/strong&gt;, connecting AI agents and &lt;strong&gt;retrieval-augmented generation (RAG) models&lt;/strong&gt; to the web. AgentQL extracts &lt;strong&gt;real-time, structured data&lt;/strong&gt; from web pages and allows agents to interact with links, forms, and other web UI.&lt;/p&gt;

&lt;p&gt;AgentQL’s tools enable Langchain and LlamaIndex agents to &lt;strong&gt;navigate the web, extract data, and take action. For structured retrieval,&lt;/strong&gt; AgentQL functions as a &lt;strong&gt;document loader/web reader&lt;/strong&gt;, making live data available for AI-powered search and decision-making. Whether you are building &lt;strong&gt;autonomous AI agents&lt;/strong&gt; or &lt;strong&gt;dynamic retrieval systems&lt;/strong&gt;, these integrations turn the entire web into a &lt;strong&gt;data source&lt;/strong&gt; for AI applications.&lt;/p&gt;

&lt;p&gt;With this launch, AgentQL fully steps into the &lt;strong&gt;agentic world&lt;/strong&gt;—where AI systems can not only retrieve information but also act on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  AgentQL Tools for Langchain Agents and Workflows
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.langchain.com/" rel="noopener noreferrer"&gt;Langchain&lt;/a&gt; is a framework for building AI-powered agents and workflow automation. You can use &lt;strong&gt;AgentQL as a tool inside Langchain agents&lt;/strong&gt; to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extract structured data from web pages in real time&lt;/li&gt;
&lt;li&gt;Click, navigate, and interact with websites using a Playwright-powered browser&lt;/li&gt;
&lt;li&gt;Use the web as a dynamic knowledge source for AI-powered research&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Read the &lt;a href="http://docs.agentql.com/integrations/langchain" rel="noopener noreferrer"&gt;full integration guide&lt;/a&gt;&lt;/strong&gt; and check out our &lt;strong&gt;examples&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/tinyfish-io/agentql-integrations/tree/release-1.0.1/langchain/examples/job_scraper" rel="noopener noreferrer"&gt;Job Scraper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tinyfish-io/agentql-integrations/tree/release-1.0.1/langchain/examples/price_deal_finder" rel="noopener noreferrer"&gt;Price Deal Finder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tinyfish-io/agentql-integrations/tree/release-1.0.1/langchain/examples/recipe_bot" rel="noopener noreferrer"&gt;Recipe Bot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AgentQL as a WebReader for LlamaIndex and RAG Pipelines
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.llamaindex.ai/" rel="noopener noreferrer"&gt;LlamaIndex&lt;/a&gt; is a framework for &lt;strong&gt;retrieval-augmented generation (RAG)&lt;/strong&gt;—helping LLMs query structured data. You can use &lt;strong&gt;AgentQL as a WebReader&lt;/strong&gt; inside LlamaIndex to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Index live web pages and search them as structured documents&lt;/li&gt;
&lt;li&gt;Retrieve fresh market data, research papers, and news in real time&lt;/li&gt;
&lt;li&gt;Power AI search with always-updated information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Read the &lt;a href="https://docs.agentql.com/integrations/llamaindex" rel="noopener noreferrer"&gt;full integration guide&lt;/a&gt;!&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Building Today
&lt;/h2&gt;

&lt;p&gt;AgentQL now integrates seamlessly with Langchain agents and LlamaIndex retrieval workflows. AI applications can reach beyond foundation models by fetching, interacting with, and processing live web pages and their contents.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Langchain guide: &lt;a href="http://docs.agentql.com/integrations/langchain" rel="noopener noreferrer"&gt;docs.agentql.com/integrations/langchain&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LlamaIndex guide: &lt;a href="http://docs.agentql.com/integrations/llamaindex" rel="noopener noreferrer"&gt;docs.agentql.com/integrations/llamaindex&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We can't wait to see what you build! Give us a shout out on &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, &lt;a href="https://x.com/AgentQL" rel="noopener noreferrer"&gt;X&lt;/a&gt;, or &lt;a href="https://bsky.app/profile/agentql.com" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—The TinyFish team building AgentQL&lt;/em&gt;&lt;/p&gt;

</description>
      <category>langchain</category>
      <category>llamaindex</category>
      <category>rag</category>
      <category>agents</category>
    </item>
    <item>
      <title>AgentStack + AgentQL: Give your Agents access to the Internet</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Thu, 13 Mar 2025 20:33:20 +0000</pubDate>
      <link>https://dev.to/agentql/agentstack-agentql-give-your-agents-access-to-the-internet-129j</link>
      <guid>https://dev.to/agentql/agentstack-agentql-give-your-agents-access-to-the-internet-129j</guid>
      <description>&lt;p&gt;AgentQL now integrates with &lt;strong&gt;AgentStack&lt;/strong&gt;, enabling developers to rapidly scaffold AI agents that can extract and interact with live web data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.agentstack.sh/introduction" rel="noopener noreferrer"&gt;AgentStack&lt;/a&gt; is a developer tool designed to quickly set up agent projects, offering a suite of CLI utilities for efficient code generation. With the AgentQL integration, you can enhance your agents with real-time web data extraction, all within a streamlined development process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can You Do With AgentQL + AgentStack?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment Analysis on Live Data&lt;/strong&gt;: Build agents that fetch the latest product reviews and analyze customer sentiment in real-time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Research Assistants&lt;/strong&gt;: Develop agents that gather and summarize current information from the web, keeping you updated effortlessly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market Monitoring Tools&lt;/strong&gt;: Create agents that track competitor websites for pricing and product updates, delivering insights directly to your dashboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Make an agent with AgentStack and equip it with AgentQL so it can access the web:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set up AgentStack&lt;/strong&gt; using this &lt;a href="https://docs.agentstack.sh/installation" rel="noopener noreferrer"&gt;installation guide&lt;/a&gt; to set up your development environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add AgentQL to your Agent's stack&lt;/strong&gt; by following our &lt;a href="https://docs.agentql.com/integrations/agentstack" rel="noopener noreferrer"&gt;integration documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate Agents and Tasks&lt;/strong&gt;: Utilize AgentStack's CLI commands to create agents and define tasks that leverage AgentQL's capabilities.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Get started with these examples
&lt;/h2&gt;

&lt;p&gt;Explore these examples to see the integration in action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sentiment Analyzer&lt;/strong&gt;: This agent collects and analyzes sentiment from live web data. &lt;a href="https://github.com/AgentOps-AI/AgentStack/tree/main/examples/sentiment_analyser" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research Assistant&lt;/strong&gt;: This agent is designed to perform automated web research and provide concise summaries. &lt;a href="https://github.com/AgentOps-AI/AgentStack/tree/main/examples/research_assistant" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market Monitor:&lt;/strong&gt; This agent tracks prices and gets you the best deals. &lt;a href="https://github.com/AgentOps-AI/AgentStack/tree/main/examples/market_monitoring" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Today
&lt;/h2&gt;

&lt;p&gt;The AgentQL and AgentStack integration is live now. Visit the &lt;a href="https://docs.agentql.com/integrations/agentstack" rel="noopener noreferrer"&gt;integration guide&lt;/a&gt; to get started.&lt;/p&gt;

&lt;p&gt;We can't wait to see what you build! Give us a shout out on &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, &lt;a href="https://x.com/AgentQL" rel="noopener noreferrer"&gt;X&lt;/a&gt;, or &lt;a href="https://bsky.app/profile/agentql.com" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—The TinyFish team building AgentQL&lt;/em&gt;&lt;/p&gt;

</description>
      <category>integrations</category>
      <category>cli</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>AgentQL MCP Server: Structured Web Data for Claude, Cursor, Windsurf, and more</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Thu, 13 Mar 2025 04:32:50 +0000</pubDate>
      <link>https://dev.to/agentql/agentql-mcp-server-structured-web-data-for-claude-cursor-windsurf-and-more-1ogh</link>
      <guid>https://dev.to/agentql/agentql-mcp-server-structured-web-data-for-claude-cursor-windsurf-and-more-1ogh</guid>
      <description>&lt;p&gt;AgentQL now supports &lt;a href="https://modelcontextprotocol.io/introduction" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt;, making it easier than ever to integrate &lt;strong&gt;live, structured web data&lt;/strong&gt; into tools that support MCP—like &lt;strong&gt;Claude, Cursor, and Windsurf.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;MCP is an open standard that allows AI assistants to use external tools. With the &lt;strong&gt;AgentQL MCP Server&lt;/strong&gt;, your AI models can now &lt;strong&gt;extract live data from web pages&lt;/strong&gt;—transforming unstructured HTML into &lt;strong&gt;structured, usable data.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/ufEY1nRY5CA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Every web page: an endpoint
&lt;/h2&gt;

&lt;p&gt;Before today, &lt;strong&gt;most AI models were limited to static knowledge or aging web scrapes,&lt;/strong&gt; and much content on the web is provided without an API to access. Now, with &lt;strong&gt;AgentQL + MCP&lt;/strong&gt;, your assistant can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extract data&lt;/strong&gt; from unstructured HTML websites

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extract just the content&lt;/strong&gt; from websites without ads or UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pull live YouTube search results,&lt;/strong&gt; filtering out ads&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Business Intelligence&lt;/strong&gt; from recent news and markets

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Get pricing data&lt;/strong&gt; from different marketplaces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Collect financial report&lt;/strong&gt; information from public web pages&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Research with fresh data&lt;/strong&gt; from the web

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Include recent news from outlet sites&lt;/strong&gt; in the context of your conversation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieve data&lt;/strong&gt; from online articles&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;All in real-time.&lt;/strong&gt; No scraping scripts. No extra APIs. No vector storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Set Up AgentQL MCP Server
&lt;/h2&gt;

&lt;p&gt;To get started, install the AgentQL MCP package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; agentql-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.agentql.com/integrations/mcp#configure-claude" rel="noopener noreferrer"&gt;Configure Claude with AgentQL MCP Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.agentql.com/integrations/mcp#configure-cursor" rel="noopener noreferrer"&gt;Configure Cursor with AgentQL MCP Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.agentql.com/integrations/mcp#configure-windsurf" rel="noopener noreferrer"&gt;Configure Windsurf with AgentQL MCP Server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try out AgentQL MCP Server today
&lt;/h2&gt;

&lt;p&gt;Try running some of the following commands:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get the social links from &lt;a href="https://agentql.com" rel="noopener noreferrer"&gt;agentql.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Return the top five video titles and their links from &lt;a href="https://www.youtube.com/results?search_query=agentql" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;a href="https://www.youtube.com/results?search_query=agentql" rel="noopener noreferrer"&gt;https://www.youtube.com/results?search_query=agentql&lt;/a&gt; in a list in markdown&lt;/li&gt;
&lt;li&gt;Return the top international news articles from &lt;a href="https://ground.news/" rel="noopener noreferrer"&gt;ground.news&lt;/a&gt; into a CSV&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And, in our opinion AgentQL’s “killer usecase”—using Claude as a cookbook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Get this recipe &lt;span class="k"&gt;for &lt;/span&gt;me: https://www.justonecookbook.com/pressure-cooker-japanese-curry/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your AI models can &lt;strong&gt;retrieve structured web data in real-time&lt;/strong&gt;—without needing a prebuilt API or manual scraping.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open to collaborations
&lt;/h2&gt;

&lt;p&gt;The AgentQL MCP Server is opensource, and we value the community’s feedback and contributions. We work hard to make tools that let your agents reach beyond their foundation model’s knowledge and leverage the whole world wide web. If you’ve got ideas or challenges, we want to hear them and solve them with you.&lt;/p&gt;

&lt;p&gt;We can't wait to see what you build! Give us a shout out on &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, &lt;a href="https://x.com/AgentQL" rel="noopener noreferrer"&gt;X&lt;/a&gt;, or &lt;a href="https://bsky.app/profile/agentql.com" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—The TinyFish team building AgentQL&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>claude</category>
      <category>cursor</category>
      <category>windsurf</category>
    </item>
    <item>
      <title>Dify + AgentQL: Build AI Apps with Live Web Data, No Code Needed</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Tue, 11 Mar 2025 22:38:17 +0000</pubDate>
      <link>https://dev.to/agentql/dify-agentql-build-ai-apps-with-live-web-data-no-code-needed-5b4e</link>
      <guid>https://dev.to/agentql/dify-agentql-build-ai-apps-with-live-web-data-no-code-needed-5b4e</guid>
      <description>&lt;p&gt;AgentQL now integrates seamlessly with &lt;strong&gt;Dify&lt;/strong&gt;, making it easier than ever to build &lt;strong&gt;AI applications that access and process real-time web data.&lt;/strong&gt; &lt;a href="https://dify.ai/" rel="noopener noreferrer"&gt;Dify&lt;/a&gt; provides a &lt;strong&gt;user-friendly, low-code platform&lt;/strong&gt; for designing and deploying AI applications—&lt;strong&gt;no complex backend setup required.&lt;/strong&gt; Now, with AgentQL’s &lt;strong&gt;Extract Web Data&lt;/strong&gt; tool, your AI apps can &lt;strong&gt;retrieve live information from any webpage in real time.&lt;/strong&gt;&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/2702dbf4846e4d7ca287e0f3bbca50aa"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  What Can You Build with AgentQL + Dify?
&lt;/h2&gt;

&lt;p&gt;Check out live demos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://udify.app/chat/mbB7EiAGWseLxULt" rel="noopener noreferrer"&gt;&lt;strong&gt;Price Deal Finder&lt;/strong&gt;&lt;/a&gt; Compare product prices across websites &lt;strong&gt;in real time&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://udify.app/chat/8JX1U1vAH0qOzngu" rel="noopener noreferrer"&gt;&lt;strong&gt;Research Assistant&lt;/strong&gt;&lt;/a&gt; Pull fresh data from the web to &lt;strong&gt;answer research questions&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://udify.app/chat/h2DMNaoGfOtyq1Ui" rel="noopener noreferrer"&gt;&lt;strong&gt;News Aggregator&lt;/strong&gt;&lt;/a&gt; Extract and structure news or job postings from &lt;strong&gt;any website&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Use AgentQL in Dify
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using AgentQL in an Agent
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a new app&lt;/strong&gt; in Dify and select "Agent."&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Tools&lt;/strong&gt;, click &lt;strong&gt;+ Add&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for "AgentQL."&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Extract Web Data&lt;/strong&gt; under AgentQL.&lt;/li&gt;
&lt;li&gt;Prompt the agent to extract web data using either:

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;AgentQL query&lt;/strong&gt; (&lt;a href="https://docs.agentql.com/agentql-query" rel="noopener noreferrer"&gt;learn more&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;natural language prompt&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Using AgentQL in a Workflow
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a new app&lt;/strong&gt; in Dify and choose "Chatflow" or "Workflow."&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add Block&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Tools,&lt;/strong&gt; search for "AgentQL".&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Extract Web Data&lt;/strong&gt; under AgentQL.
Configure input variables in the tool’s UI, then &lt;strong&gt;run the pipeline&lt;/strong&gt; to extract web page data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For detailed setup instructions, check out the &lt;a href="https://docs.agentql.com/integrations/dify" rel="noopener noreferrer"&gt;&lt;strong&gt;Dify integration guide&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Today
&lt;/h2&gt;

&lt;p&gt;The AgentQL + Dify integration is &lt;strong&gt;live now&lt;/strong&gt;. Build AI-powered applications that interact with &lt;strong&gt;real-time web data&lt;/strong&gt;—without touching a single API. Visit the &lt;a href="https://docs.agentql.com/integrations/dify" rel="noopener noreferrer"&gt;integration guide&lt;/a&gt; to start building your AI applications with live web data.&lt;/p&gt;

&lt;p&gt;We can't wait to see what you build! Give us a shout out on &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, &lt;a href="https://x.com/AgentQL" rel="noopener noreferrer"&gt;X&lt;/a&gt;, or &lt;a href="https://bsky.app/profile/agentql.com" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—The TinyFish team building AgentQL&lt;/em&gt;&lt;/p&gt;

</description>
      <category>integrations</category>
      <category>dify</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>Zapier + AgentQL: No-Code Web Data for Smarter Workflows</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Mon, 10 Mar 2025 22:08:42 +0000</pubDate>
      <link>https://dev.to/agentql/zapier-agentql-no-code-web-data-for-smarter-workflows-m9b</link>
      <guid>https://dev.to/agentql/zapier-agentql-no-code-web-data-for-smarter-workflows-m9b</guid>
      <description>&lt;p&gt;Our first &lt;strong&gt;Integration Week&lt;/strong&gt; drop is here: AgentQL is now available in &lt;strong&gt;Zapier!&lt;/strong&gt; It's never been easier to bring fresh web data into your no-code workflow automations.&lt;/p&gt;

&lt;p&gt;If you use &lt;strong&gt;Google Sheets, Notion, Slack, Airtable, or any of the 8,000+ apps Zapier connects to&lt;/strong&gt;, you can now pull in &lt;strong&gt;live, structured data&lt;/strong&gt; from any webpage—&lt;strong&gt;no coding required&lt;/strong&gt;. Check out &lt;a href="https://zapier.com/apps/agentql/integrations" rel="noopener noreferrer"&gt;our templates in Zapier&lt;/a&gt; and see what you can build today.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can You Do With AgentQL + Zapier?
&lt;/h2&gt;

&lt;p&gt;This integration brings &lt;strong&gt;the power of AgentQL to the automation-first world&lt;/strong&gt;, helping teams save time and eliminate manual web research and data entry. AgentQL extracts data from the web into a format you can plug into other Zaps. You could do any of the following and more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://zapier.com/webintent/create-zap?template=255607713" rel="noopener noreferrer"&gt;&lt;strong&gt;Aggregate news headlines&lt;/strong&gt; to Google sheets&lt;/a&gt; or &lt;a href="https://zapier.com/webintent/create-zap?template=255607939" rel="noopener noreferrer"&gt;Excel spreadsheets&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zapier.com/shared/eedce1279264c4516035c73a55ce1c96b1bd7591" rel="noopener noreferrer"&gt;&lt;strong&gt;Monitor competitor prices&lt;/strong&gt; and update spreadsheets automatically&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://zapier.com/shared/3e14f1454155dc6845bc6d1f5e1ecb0a14c1c6ad" rel="noopener noreferrer"&gt;&lt;strong&gt;Pull news headlines&lt;/strong&gt; and send them to Slack for your team&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track product availability&lt;/strong&gt; and get notified when stock changes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extract job postings&lt;/strong&gt; and add them to an Airtable for easy tracking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/wfm2zzCEvME"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;No scraping scripts. No complex setup. Just &lt;strong&gt;instant access to web data in your favorite tools&lt;/strong&gt; in a few steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Zap&lt;/strong&gt; in &lt;a href="https://zapier.com/apps/agentql/integrations" rel="noopener noreferrer"&gt;Zapier&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Select AgentQL's "Extract Data" action.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use your AgentQL API key&lt;/strong&gt; (from the &lt;a href="https://dev.agentql.com/" rel="noopener noreferrer"&gt;dev portal&lt;/a&gt;) to connect AgentQL to Zapier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enter the URL &amp;amp; query&lt;/strong&gt; to extract structured data—learn more about &lt;a href="https://docs.agentql.com/agentql-query/query-intro" rel="noopener noreferrer"&gt;how to write an AgentQL query in this guide&lt;/a&gt; or try the "suggest a query" &lt;a href="https://playground.agentql.com/" rel="noopener noreferrer"&gt;feature in the Playground&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Send that data anywhere&lt;/strong&gt;—email, Google Sheets, Notion, Slack, Discord, and more.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try AgentQL and Zapier in your workflows today
&lt;/h2&gt;

&lt;p&gt;The integration is live now. Head to &lt;a href="https://docs.agentql.com/integrations/zapier" rel="noopener noreferrer"&gt;our Zapier integration page&lt;/a&gt; to get started. Try out our templates for &lt;a href="https://zapier.com/webintent/create-zap?template=255607713" rel="noopener noreferrer"&gt;aggregating posts from sites into Google sheets&lt;/a&gt; or &lt;a href="https://zapier.com/webintent/create-zap?template=255607939" rel="noopener noreferrer"&gt;Excel spreadsheets&lt;/a&gt;. You can even &lt;a href="https://zapier.com/webintent/create-zap?template=255607719" rel="noopener noreferrer"&gt;create your own browser extension to grab data as you browse&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;We can't wait to see what you build! Give us a shout out on &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;Discord&lt;/a&gt;, &lt;a href="https://x.com/AgentQL" rel="noopener noreferrer"&gt;X&lt;/a&gt;, or &lt;a href="https://bsky.app/profile/agentql.com" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—The TinyFish team building AgentQL&lt;/em&gt;&lt;/p&gt;

</description>
      <category>integrations</category>
      <category>zapier</category>
      <category>automation</category>
    </item>
    <item>
      <title>Something is coming.</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Sat, 08 Mar 2025 04:32:40 +0000</pubDate>
      <link>https://dev.to/agentql/something-is-coming-4ec0</link>
      <guid>https://dev.to/agentql/something-is-coming-4ec0</guid>
      <description>&lt;p&gt;Next week, we’re launching &lt;strong&gt;five new ways&lt;/strong&gt; to bring AgentQL into the tools you already love to use.&lt;/p&gt;

&lt;p&gt;We’ve been watching you—how you build, where you automate, and what you need to make your life easier.&lt;/p&gt;

&lt;p&gt;So we built you something special.&lt;/p&gt;

&lt;p&gt;Something that makes it easier than ever to integrate live web data into your workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Five days, five integrations (and a few surprises).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First reveal drops Monday.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Are you ready?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Follow along next week as we reveal each drop on &lt;a href="https://x.com/AgentQL" rel="noopener noreferrer"&gt;X&lt;/a&gt;, &lt;a href="https://bsky.app/profile/agentql.com" rel="noopener noreferrer"&gt;Bluesky&lt;/a&gt;, and &lt;a href="https://www.linkedin.com/company/tinyfish-ai/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Join the conversation in our &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; and tell us what you think.&lt;/li&gt;
&lt;li&gt;Be the first to try it—every launch will include examples and documentation to get started fast.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stay tuned.&lt;/p&gt;

&lt;p&gt;—The TinyFish team building AgentQL&lt;/p&gt;

</description>
      <category>integrations</category>
      <category>agents</category>
      <category>automation</category>
    </item>
    <item>
      <title>Automated web application testing with AI and Playwright</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Fri, 28 Feb 2025 22:23:46 +0000</pubDate>
      <link>https://dev.to/nearestnabors/automated-web-application-testing-with-ai-and-playwright-20j5</link>
      <guid>https://dev.to/nearestnabors/automated-web-application-testing-with-ai-and-playwright-20j5</guid>
      <description>&lt;p&gt;&lt;em&gt;Co-authored with &lt;a href="https://x.com/poledesfetes" rel="noopener noreferrer"&gt;our friends at Heal.dev&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;End-to-end tests are one of the most valuable testing strategies in any codebase. They are the ultimate integration tests that ensure the application's critical paths are thoroughly tested. With them, testing teams ensure the high quality releases and reliable user experiences while reducing the need for human testers to perform repetitive tasks and manual testing.&lt;/p&gt;

&lt;p&gt;However, these are often overlooked when building web applications, with good reasons! The most common justifications for not using end-to-end testing are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cost of implementations&lt;/strong&gt;: Even if modern testing processes are easier to use than ever, they still use traditional testing methods. Users still need to spend significant time and manual effort choosing selectors on a page, and variable testing time can lead to slow iteration cycles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost of maintenance&lt;/strong&gt;: End-to-end tests are often coupled with the implementation of the application's user interface, meaning they require a maintenance when modifications are made that impact appearance and user behavior, like UI updates or new features and capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flakiness&lt;/strong&gt;: Because a website's performance is impacted by a wide range of parameters, from CPU scheduling to network stability, end-to-end tests tend to be flaky. Web applications behave slightly differently from one run to another, leading to a significant loss of time when executing such tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tutorial explores AI-powered testing to build more stable tests, leading to greater testing efficiency, shorter testing cycles, and faster release cycles. To do so, you will use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://playwright.dev/" rel="noopener noreferrer"&gt;Playwright&lt;/a&gt; is a browser automation tool and testing library by Microsoft. Its &lt;a href="https://playwright.dev/docs/api/class-locator" rel="noopener noreferrer"&gt;robust locator API&lt;/a&gt; significantly reduces flakiness when interacting with an element.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.agentql.com/" rel="noopener noreferrer"&gt;AgentQL&lt;/a&gt; has AI-powered features that turn any web page into an API you can interact with using Natural Language queries. Instead of targeting elements on the page imperatively using CSS selectors like &lt;code&gt;.submit_button12lsi&lt;/code&gt; or XPath , you describe what they are semantically, like "submit_button". These self-healing tests dramatically reduce maintenance as they no longer break when the page's layout or content changes.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/api/test.html" rel="noopener noreferrer"&gt;Node's built-in test runner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Node's native support for TypeScript (still experimental)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means the &lt;code&gt;package.json&lt;/code&gt; will be particularly small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agentql-tutorial"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"module"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node --env-file=.env --test --experimental-strip-types test/**.ts"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MIT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"@playwright/test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.49.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"agentql"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.6.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"playwright"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.49.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Using Node.js test runner with Playwright and TypeScript
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Setting up tests with Playwright and Node.js
&lt;/h3&gt;

&lt;p&gt;Start with a test for the &lt;a href="https://demo.playwright.dev/todomvc/#/" rel="noopener noreferrer"&gt;TODOMVC application&lt;/a&gt; hosted by the Playwright team that will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add elements to the To-do List&lt;/li&gt;
&lt;li&gt;Confirm that the elements are present&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkvofidwk29xm8xrgn4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjkvofidwk29xm8xrgn4u.png" alt="The Todo app landing page" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole test file is &lt;a href="https://github.com/heal-dev/agentql-tutorial/blob/main/test/without-agentql.ts" rel="noopener noreferrer"&gt;available here&lt;/a&gt;, or you can follow along below&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting up the test context
&lt;/h3&gt;

&lt;p&gt;You need to provide a Playwright &lt;code&gt;Page&lt;/code&gt; for each test to run your tests. That way, if you create multiple tests, they will stay independent from each other:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;after&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;afterEach&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;test&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;chromium&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;playwright&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;playwright&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@playwright/test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TestContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;SuiteContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;WeakMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TestContext&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;SuiteContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;chromium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;afterEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Notice that two imports are made with &lt;code&gt;import type&lt;/code&gt; instead of just &lt;code&gt;import&lt;/code&gt;. This ensures Node.js knows what imports to remove when transforming code from TypeScript to JavaScript. For instance, &lt;code&gt;Page&lt;/code&gt; is not exported by the &lt;code&gt;playwright&lt;/code&gt; module, but its type is! So, such import needs to be removed before running the code; otherwise, it will crash with an import error.&lt;/p&gt;

&lt;p&gt;Now take a look at the hooks (&lt;code&gt;before&lt;/code&gt;, &lt;code&gt;after&lt;/code&gt;, &lt;code&gt;beforeEach&lt;/code&gt;, &lt;code&gt;afterEach&lt;/code&gt;) in the code:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;chromium&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The &lt;code&gt;before&lt;/code&gt; hook is executed once before each test, and the &lt;code&gt;after&lt;/code&gt; hook is executed once after all the tests. This is the perfect place to create and destroy resources needed for the test session!&lt;/p&gt;

&lt;p&gt;Start the browser instance you will use for testing: close it in the &lt;code&gt;after&lt;/code&gt; hook to ensure it is permanently closed. If closing the browser depends on tests in the suite, it might not happen, as the tests might crash and prevent the &lt;code&gt;browser.close()&lt;/code&gt; method from being called.&lt;/p&gt;

&lt;p&gt;Additional hooks run before and after each test. In the &lt;code&gt;beforeEach,&lt;/code&gt; create a &lt;code&gt;Page&lt;/code&gt; for each test. In the Node.js test runner, each test has a single &lt;code&gt;TestContext&lt;/code&gt; object. You can use this object to link resources related to the test here:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;WeakMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;TestContext&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nx"&gt;SuiteContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;browser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newPage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;afterEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This creates a new &lt;code&gt;page&lt;/code&gt; before each test and links it with the current test using a &lt;a href="https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Global_Objects/WeakMap" rel="noopener noreferrer"&gt;&lt;code&gt;WeakMap&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note: you could also have used the Playwright test runner directly, as it would have handled these fixtures!&lt;/p&gt;
&lt;h3&gt;
  
  
  Write the test
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should allow to add a TODO item&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://demo.playwright.dev/todomvc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByPlaceholder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;What needs to be done?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Create 1st todo.&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use AgentQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Make sure the list only has one todo item.&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByTestId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;todo-title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use AgentQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Create 2nd todo.&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use Heal.dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Make sure the list now has two todo items.&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByTestId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;todo-title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveText&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use AgentQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use Heal.dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The first two lines of the tests are here to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get the &lt;code&gt;Page&lt;/code&gt; object&lt;/li&gt;
&lt;li&gt;Navigate to the URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then, use a locator to find the input for new To-do List items:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByPlaceholder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;What needs to be done?&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This locator represents the component on the page. Playwright will handle all interactions with it for you!&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use AgentQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This tells Playwright to type &lt;code&gt;Use AgentQL&lt;/code&gt; in the input field and to press ENTER to submit the task.&lt;/p&gt;

&lt;p&gt;Now check that the task has been properly added to the list:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByTestId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;todo-title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use AgentQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This asks the Playwright assertion library to check that within the elements on the page with the &lt;code&gt;id&lt;/code&gt; &lt;code&gt;todo-title&lt;/code&gt;, one has the text "Use AgentQL," meaning that the item has been added to the list.&lt;/p&gt;

&lt;p&gt;Add another item, "Use Heal.dev," and check if it is present in the list, too:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use Heal.dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByTestId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;todo-title&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toHaveText&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use AgentQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use Heal.dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Running the tests
&lt;/h3&gt;

&lt;p&gt;Run the test with the following in your terminal:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;--experimental-strip-types&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;/without-agentql.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You don't need the &lt;code&gt;--test&lt;/code&gt; flag when running a single test file. Node.js will run these standalone files as tests automatically!&lt;/p&gt;

&lt;p&gt;Running these tests with &lt;code&gt;--experimental-strip-types&lt;/code&gt; allows you to run &lt;code&gt;.ts&lt;/code&gt; files without &lt;code&gt;node-ts&lt;/code&gt; or any translation!&lt;/p&gt;
&lt;h2&gt;
  
  
  Self-healing tests with AgentQL's smart locators
&lt;/h2&gt;

&lt;p&gt;You just wrote a test for the To-do List application! But what happens if the placeholder of the task input changes? Or if the &lt;code&gt;testId&lt;/code&gt; used for the elements in the list is modified? &lt;strong&gt;The test will break!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Of course, you can always maintain the test as part of your development cycle and manually change the locators, but what if you could use AI to handle that?&lt;/p&gt;

&lt;p&gt;Using AI to identify the target elements is a great way to stabilize these tests. AgentQL uses machine learning models that enable you to test using the &lt;em&gt;meaning&lt;/em&gt; of elements on the page rather than their implementation details.&lt;/p&gt;
&lt;h3&gt;
  
  
  Adding AgentQL's AI-powered testing tools to the test
&lt;/h3&gt;

&lt;p&gt;You can follow along or find the complete file &lt;a href="https://github.com/heal-dev/agentql-tutorial/blob/main/test/with-agentql.ts" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First, import AgentQL into your test:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;PageExt&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;agentql&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;AgentQL&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;agentql&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;And add another &lt;code&gt;beforeEach&lt;/code&gt; hook to wrap &lt;code&gt;Page&lt;/code&gt; with AgentQL:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pageExt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;AgentQL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wrap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pageExt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This adds the following methods to the page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.agentql.com/javascript-sdk/api-references/agentql-page#getbyprompt" rel="noopener noreferrer"&gt;&lt;code&gt;getByPrompt&lt;/code&gt;&lt;/a&gt; returns an HTML element from the page.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.agentql.com/javascript-sdk/api-references/agentql-page#queryData" rel="noopener noreferrer"&gt;&lt;code&gt;queryData&lt;/code&gt;&lt;/a&gt; returns data from the page.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These powerful methods can invoke AI to locate elements and data on the page by focusing on what the elements expose as features or data instead of their implementation.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;getByPrompt('Entry to add todo items')&lt;/code&gt; replaces &lt;code&gt;getByPlaceholder('What needs to be done?')&lt;/code&gt; in the test:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;should allow to add a TODO item&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;TEST_TO_PAGE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;testContext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://demo.playwright.dev/todomvc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByPrompt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Entry to add todo items&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Create 1st todo.&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use AgentQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;todoItemsQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`{
    todo_items[]
  }`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Make sure the list only has one todo item.&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;todo_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;itemsBefore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queryData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todoItemsQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deepStrictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itemsBefore&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use AgentQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="c1"&gt;// Create 2nd todo.&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use Heal.dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;newTodo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;press&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Enter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Make sure the list only has one todo item.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;todo_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;itemsAfter&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queryData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todoItemsQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;Assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deepStrictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;itemsAfter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use AgentQL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Use Heal.dev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This means that as long as there is an input to add a task to the list, AgentQL will provide a locator for it, even if its placeholder changes.&lt;/p&gt;

&lt;p&gt;This also works for extracting data from the page:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;todoItemsQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`{
  todo_items[]
}`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;todo_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;itemsBefore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queryData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;todoItemsQuery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This AgentQL query returns the elements on the page that match the description &lt;code&gt;todo_items&lt;/code&gt; without impacting how the page is implemented.&lt;/p&gt;

&lt;p&gt;Both methods are self-healing and resilient to page changes, making your test more robust!&lt;/p&gt;
&lt;h3&gt;
  
  
  Running the test
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;--test&lt;/span&gt; &lt;span class="nt"&gt;--experimental-strip-types&lt;/span&gt; &lt;span class="nt"&gt;--env-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;.env &lt;span class="nb"&gt;test&lt;/span&gt;/&lt;span class="k"&gt;**&lt;/span&gt;.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Note: Use the &lt;code&gt;--env-file&lt;/code&gt; flag to target the file containing &lt;code&gt;AGENTQL_API_KEY=&amp;lt;MY_API_KEY&amp;gt;&lt;/code&gt;&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/63412d688b7940fc915d9806f49838ef"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;



&lt;h2&gt;
  
  
  What’s next?
&lt;/h2&gt;

&lt;p&gt;This example mitigates some of the top challenges of end-to-end testing: the cost of maintenance and flakiness. But there are still things your testing team can do to keep these tests running over time for more complex applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Update relevant tests as part of your feature development process
&lt;/h3&gt;

&lt;p&gt;Using AgentQL's smart locators that target elements by their on-page context rather than hardcoded selectors makes tests more stable over time. But this only works as long as user interactions on the page stay the same. For example, the next version of this To-do List could require users to add a time estimate to the entry. You would still need to update the relevant tests to address new user stories like this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build a testing infrastructure
&lt;/h3&gt;

&lt;p&gt;Hosting end-to-end tests locally is difficult. Browsers require a certain amount of CPU and memory (and GPUs on some websites). Also, scheduling browser-based tests can be challenging. You must ensure the network state is stable to load the target website and assets and even to connect to AgentQL servers!&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrate complex testing workflows
&lt;/h3&gt;

&lt;p&gt;Many testing building blocks are painful to build right. For example, testing sending and receiving emails, designing clever ways to test randomness, and writing assertions. How do you automate “check that a modal is open” in a stable way? That remains tricky!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of End-to-End Testing is AI-Powered Testing Tools
&lt;/h2&gt;

&lt;p&gt;Next generation reliable testing tools will embrace self-healing testing, relieving testing efforts by reducing maintenance overhead and ensuring tests remain stable as applications evolve. &lt;strong&gt;Heal.dev&lt;/strong&gt; is an test automation platform that leverages AgentQL to make this a reality by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing reliable end-to-end tests&lt;/li&gt;
&lt;li&gt;Maintaining your tests with AI-driven insights&lt;/li&gt;
&lt;li&gt;Managing the entire test infrastructure for you&lt;/li&gt;
&lt;li&gt;Adding implicit assertions to catch defects before they reach users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By combining AI-powered tools like &lt;strong&gt;AgentQL&lt;/strong&gt; with modern testing platforms, we’re entering an era where stability, maintainability, and efficiency are no longer trade-offs. With the right approach, you can build tests that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adapt to UI changes without constant updates&lt;/li&gt;
&lt;li&gt;Reduce flakiness by targeting functionality rather than fragile selectors&lt;/li&gt;
&lt;li&gt;Scale effortlessly with AI-assisted assertions and infrastructure management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But stability is just the beginning.&lt;/p&gt;

&lt;p&gt;True test automation isn’t just about catching bugs—it’s about enabling teams to move faster confidently. By integrating AI-driven solutions, developers can shift their focus from fixing flaky tests to shipping high-quality software at scale.&lt;/p&gt;

&lt;p&gt;If unreliable tests are slowing you down, it’s time to stop fighting your test suite—and start &lt;strong&gt;healing&lt;/strong&gt; it. &lt;a href="https://heal.dev" rel="noopener noreferrer"&gt;Check out Heal.dev&lt;/a&gt; and experience the future of test automation today.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>automation</category>
    </item>
    <item>
      <title>Introducing Scheduled Scraping Workflows</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Mon, 02 Dec 2024 17:00:00 +0000</pubDate>
      <link>https://dev.to/agentql/introducing-scheduled-scraping-workflows-1l2l</link>
      <guid>https://dev.to/agentql/introducing-scheduled-scraping-workflows-1l2l</guid>
      <description>&lt;p&gt;AgentQL now supports scheduled scraping jobs! 🎉&lt;/p&gt;

&lt;p&gt;You told us scraping the same sites over and over was a hassle—especially when paired with manual scheduling tools. We heard you loud and clear. We created an experimental scheduling feature to give you a simpler, more intuitive way to automate recurring jobs.&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/d35de76bbba247478b9f153eb9eeb36b"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;We built this experimental feature for developers who regularly scrape the same websites for updated information. Instead of juggling custom scripts and cron jobs, you can now set up and automate these tasks directly from the AgentQL Dev Portal. And here’s the best part: you can download the scraped data as JSON, so it’s ready to drop into your workflows.&lt;/p&gt;

&lt;p&gt;If your work involves tracking updates on dynamic sites—like news headlines, product prices, or public datasets—this feature is your new best friend. Think of it as your always-on assistant for regular data collection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started scheduling
&lt;/h2&gt;

&lt;p&gt;Head over to the new &lt;a href="https://dev.agentql.com/scheduling" rel="noopener noreferrer"&gt;scheduling page&lt;/a&gt; on our Dev Portal and use the &lt;strong&gt;Add New Workflow&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;Set the URL(s) for the pages that you'd like to extract data from and the &lt;a href="https://dev.to/agentql-query"&gt;AgentQL query&lt;/a&gt; you'd like to run, and specify when you'd like it to run.&lt;/p&gt;

&lt;p&gt;The full &lt;a href="https://docs.agentql.com/scraping/scheduling" rel="noopener noreferrer"&gt;Step-by-Step Guide to scheduling scraping jobs&lt;/a&gt; is available in our documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Experimental limitations
&lt;/h3&gt;

&lt;p&gt;Because this feature is still experimental, we're limiting the number of scraping jobs you can schedule to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 workflows per user&lt;/li&gt;
&lt;li&gt;5 urls per workflow&lt;/li&gt;
&lt;li&gt;10 runs per workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need more scraping jobs, please reach out to us!&lt;/p&gt;




&lt;p&gt;We’re excited to see how you use Scheduled Scraping to streamline your workflows. This is just the start—try it out, and let us know how we can make it even better on &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;our community Discord&lt;/a&gt;. Your input will shape what comes next!&lt;/p&gt;

&lt;p&gt;Happy scheduling! 🐟&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—The Tiny Fish Team Building AgentQL&lt;/em&gt;&lt;/p&gt;

</description>
      <category>scraping</category>
      <category>webscraping</category>
      <category>scrapers</category>
      <category>automation</category>
    </item>
    <item>
      <title>AgentQL Launch Week Recap—make the web AI-ready</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Mon, 18 Nov 2024 21:01:12 +0000</pubDate>
      <link>https://dev.to/nearestnabors/agentql-launch-week-recap-make-the-web-ai-ready-86b</link>
      <guid>https://dev.to/nearestnabors/agentql-launch-week-recap-make-the-web-ai-ready-86b</guid>
      <description>&lt;p&gt;Last week, we rolled out five exciting updates to make &lt;strong&gt;AgentQL&lt;/strong&gt; &lt;a href="https://www.agentql.com/blog/stealth-mode" rel="noopener noreferrer"&gt;faster&lt;/a&gt;, &lt;a href="https://www.agentql.com/blog/stealth-mode" rel="noopener noreferrer"&gt;stealthier&lt;/a&gt;, and easier to use than ever before with a &lt;a href="https://www.agentql.com/blog/javascript-sdk" rel="noopener noreferrer"&gt;JavaScript SDK&lt;/a&gt;, &lt;a href="https://www.agentql.com/blog/data-rest-api" rel="noopener noreferrer"&gt;REST API endpoint&lt;/a&gt;, and &lt;a href="https://www.agentql.com/blog/natural-language-query-generation" rel="noopener noreferrer"&gt;query generator&lt;/a&gt;. Whether you’re building AI agents, scraping data, or launching websites, these new features were built to help you unlock data and interact with the web like never before.&lt;/p&gt;

&lt;h2&gt;
  
  
  One week, one step closer to making the web AI-ready
&lt;/h2&gt;

&lt;p&gt;Here’s a quick recap of everything we launched during &lt;strong&gt;AgentQL Launch Week&lt;/strong&gt;—with links to explore each feature in detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  REST API—AgentQL Everywhere
&lt;/h3&gt;

&lt;p&gt;This endpoint gives you the power to retrieve data from any public web page via HTTP request with only a URL and an AgentQL query, unlocking hundreds of workflows. We showed off the &lt;strong&gt;AgentQL REST API&lt;/strong&gt; with a Zapier integration—try it for yourself with this &lt;a href="https://zapier.com/shared/3a2bcdfd2b9b596e7176c34bae125bb526e7a390" rel="noopener noreferrer"&gt;Zapier template&lt;/a&gt; (just add your &lt;a href="https://dev.agentql.com/" rel="noopener noreferrer"&gt;free API key&lt;/a&gt;).&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/d0e4717352d446cf9a297c009feae753"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Learn more
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.agentql.com/blog/data-rest-api" rel="noopener noreferrer"&gt;REST API Launch Post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.agentql.com/rest-api/api-reference" rel="noopener noreferrer"&gt;REST API reference docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.agentql.com/scraping/scraping-data-api" rel="noopener noreferrer"&gt;Guide to scraping data from live web pages with the API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  JavaScript SDK—AgentQL for Fullstack Developers
&lt;/h3&gt;

&lt;p&gt;Our &lt;a href="https://docs.agentql.com/python-sdk/installation" rel="noopener noreferrer"&gt;Python SDK&lt;/a&gt; has been popular with the data engineering crowd for awhile now, but from collaborations with companies like &lt;a href="https://www.heal.dev/" rel="noopener noreferrer"&gt;Heal.dev&lt;/a&gt; and feedback from our community, we learned that the AgentQL’s powerful parsing and automation capabilities would be welcome in Node.js environments. Fullstack teams can now integrate AgentQL into their testing, scraping, and automation workflows effortlessly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.agentql.com/blog/javascript-sdk" rel="noopener noreferrer"&gt;JavaScript SDK Launch Post&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Get started scraping and automating with the AgentQL JavaScript SDK &lt;a href="https://docs.agentql.com/quick-start?lang=js&amp;amp;type=async" rel="noopener noreferrer"&gt;in five minutes&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.agentql.com/javascript-sdk/installation" rel="noopener noreferrer"&gt;Install the JavaScript SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Check out the &lt;a href="https://docs.agentql.com/javascript-sdk/api-references/agentql" rel="noopener noreferrer"&gt;API Reference&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Get up and running quickly with our &lt;a href="https://docs.agentql.com/examples#javascript-example-scripts" rel="noopener noreferrer"&gt;collection of JavaScript Examples on GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/a8e96679d90e4d649150bb418af46807"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Query Generation—AI-Powered Query Creation
&lt;/h3&gt;

&lt;p&gt;With &lt;strong&gt;Query Generation&lt;/strong&gt;, the &lt;a href="https://www.agentql.com/playground" rel="noopener noreferrer"&gt;AgentQL Playground&lt;/a&gt; can write queries for you. Just describe what you’re looking for in natural language, and AgentQL generates a fully functional query. Our founder Keith Zhai had &lt;a href="https://x.com/KeithZhai/status/1857282697804251531" rel="noopener noreferrer"&gt;much to share on X&lt;/a&gt; about how this feature unlocks not just engineers but researchers, journalists, and analysts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The implications for business and journalism are profound. For years, the bottleneck wasn’t a lack of data—it was a lack of accessible tools to make sense of it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can learn more in the original &lt;a href="https://www.agentql.com/blog/natural-language-query-generation" rel="noopener noreferrer"&gt;Query Generation Launch Post&lt;/a&gt; or &lt;a href="https://arc.net/l/quote/jrbzfvrf" rel="noopener noreferrer"&gt;try it out on the Playground&lt;/a&gt;.&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/ab03f57dc2f847e386e09c7707f3ba7c"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Fast Mode—Fast by Default
&lt;/h3&gt;

&lt;p&gt;Speed met precision with &lt;strong&gt;Fast Mode&lt;/strong&gt;, now the default for all AgentQL queries. This lighter-weight mode delivers snappy results without sacrificing quality, making it perfect for high-volume scraping, monitoring, and quick prototyping.&lt;/p&gt;

&lt;p&gt;Learn more in the &lt;a href="https://www.agentql.com/blog/fast-mode" rel="noopener noreferrer"&gt;Fast Mode Launch Post&lt;/a&gt; or check out this &lt;a href="https://docs.agentql.com/speed/fast-mode" rel="noopener noreferrer"&gt;handy guide for how to switch to Fast Mode&lt;/a&gt; for faster execution times. (​​If you need extra precision for complex or data-intensive dynamic websites, you can still &lt;a href="https://docs.agentql.com/accuracy/standard-mode" rel="noopener noreferrer"&gt;enable Standard Mode&lt;/a&gt; to prioritize accuracy over speed!)&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/0f7439d3fe7742258aa4aaa56b383a93"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h3&gt;
  
  
  Stealth Mode—Enhanced Bot Detection Evasion
&lt;/h3&gt;

&lt;p&gt;We upgraded &lt;strong&gt;Stealth Mode&lt;/strong&gt; to minimize bot detection when scraping or automating actions on third-party websites. Check out &lt;a href="https://www.agentql.com/blog/stealth-mode" rel="noopener noreferrer"&gt;the launch post&lt;/a&gt;, this handy guide to &lt;a href="https://agentql-docs-o6tdnhwpa-tiny-fish.vercel.app/avoiding-bot-detection/stealth-mode-for-headless-browser" rel="noopener noreferrer"&gt;Avoiding Bot Detection with Stealth Mode&lt;/a&gt;, or implement it today with our &lt;a href="https://github.com/tinyfish-io/agentql/tree/main/examples/python/stealth_mode" rel="noopener noreferrer"&gt;Stealth Mode Example Script&lt;/a&gt; (now in &lt;a href="https://github.com/tinyfish-io/agentql/tree/main/examples/js/stealth-mode" rel="noopener noreferrer"&gt;JavaScript&lt;/a&gt;, too!)&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next? You tell us.
&lt;/h2&gt;

&lt;p&gt;We can’t wait to see how you’ll use these new features, and we’re already thinking about what’s next for AgentQL. Your feedback is critical to shaping our roadmap, so if you haven’t already, we’d love for you to take a moment to &lt;a href="https://www.surveymonkey.com/r/JWQGQG8" rel="noopener noreferrer"&gt;fill out our Community Survey&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you for joining us for Launch Week! We hope these new features empower you to build, automate, and explore with AgentQL. If you have questions, ideas, or want to chat about all things AgentQL, join us &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;on our community Discord&lt;/a&gt;. Let’s build the future together.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—The Tiny Fish Team Building AgentQL&lt;/em&gt;&lt;/p&gt;

</description>
      <category>scraping</category>
      <category>agenticai</category>
      <category>ai</category>
      <category>scrapingapi</category>
    </item>
    <item>
      <title>Get data from any page: AgentQL’s Rest API Endpoint—Launch week day 5</title>
      <dc:creator>Rachel-Lee Nabors</dc:creator>
      <pubDate>Fri, 15 Nov 2024 14:36:11 +0000</pubDate>
      <link>https://dev.to/agentql/extract-data-from-any-public-facing-web-page-with-just-an-http-request-agentqls-rest-api-12fj</link>
      <guid>https://dev.to/agentql/extract-data-from-any-public-facing-web-page-with-just-an-http-request-agentqls-rest-api-12fj</guid>
      <description>&lt;p&gt;We’ve made it to the final day of Launch Week, and we’re wrapping up with our biggest product offering yet: the AgentQL REST API!&lt;/p&gt;

&lt;p&gt;This simple API turns any page into an endpoint for content. With only a URL and a query string, you can query web pages and retrieve the same precise, structured data you have come to expect from our &lt;a href="https://docs.agentql.com/python-sdk/installation" rel="noopener noreferrer"&gt;SDKs&lt;/a&gt; and &lt;a href="https://playground.agentql.com/?_gl=1*h7s2s4*_ga*MTIzMTY4NjEzMC4xNzI0MDE3NjUw*_ga_NW31VMM8D1*MTczMTYzNjM0MS4xNC4xLjE3MzE2MzY5NDUuMC4wLjA." rel="noopener noreferrer"&gt;Playground&lt;/a&gt;—even from dynamic content or complex websites. The possibilities are endless, from scheduling scraping jobs to building data pipelines, or even empowering AI agents to interact with the web in all new ways.&lt;/p&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/d0e4717352d446cf9a297c009feae753"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;p&gt;Like the demo? Get the &lt;a href="https://zapier.com/shared/3a2bcdfd2b9b596e7176c34bae125bb526e7a390" rel="noopener noreferrer"&gt;Zapier template&lt;/a&gt; and add your &lt;a href="https://dev.agentql.com/" rel="noopener noreferrer"&gt;free API key&lt;/a&gt;!&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the AgentQL REST API?
&lt;/h2&gt;

&lt;p&gt;The AgentQL REST API allows you to send queries via HTTP to retrieve structured data from any publicly available website with a single request. This flexibility makes it a powerful tool for developers, automation experts, and AI agent providers working with dynamic data applications.&lt;/p&gt;

&lt;p&gt;Use AgentQL with any programming language or tool that supports HTTP. By integrating with tools like Zapier or embedding it in backend systems, AgentQL’s REST API opens up new possibilities for automating large-scale data acquisition and training data collection. It’s an ideal solution for users who need the precision of AgentQL’s smart locators without the SDK setup—just plug in your query and get your data!&lt;/p&gt;

&lt;h2&gt;
  
  
  Unlock the Internet’s Data
&lt;/h2&gt;

&lt;p&gt;There’s so much information available on the web that’s been dammed up in HTML soup. We get it. Not every organization can build an API to share their information. That’s why AgentQL was designed to do the heavy lifting for both publishers and consumers!&lt;/p&gt;

&lt;p&gt;This REST API is for anyone looking to add fast, precise, structured data collection to their workflows. It’s handy for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI Agents:&lt;/strong&gt; The REST API is a perfect match for autonomous AI agents that need to pull in real-world data dynamically. With AgentQL’s REST endpoint, agents can retrieve and interact with live data, making them more adaptable and versatile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Scraping &amp;amp; Monitoring Applications:&lt;/strong&gt; If your use case involves tracking product prices, following market trends, monitoring real estate listings, or scraping job boards, the REST API lets you automate it from one endpoint.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developers &amp;amp; Data Engineers:&lt;/strong&gt; Integrate AgentQL into your backend or data processing pipelines for efficient web scraping, analytics, and content retrieval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automation Experts &amp;amp; No-Code Users:&lt;/strong&gt; Set up automated data flows in platforms like Zapier without needing extensive coding knowledge.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Get Started with the AgentQL REST API
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Get your API key:&lt;/strong&gt; Every request requires an X-API-Key header. &lt;a href="https://dev.agentql.com/" rel="noopener noreferrer"&gt;Generate your free API key here—no credit card is required!&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Define Your Request:&lt;/strong&gt; Pass the URL you want to fetch data from and an &lt;a href="https://docs.agentql.com/agentql-query" rel="noopener noreferrer"&gt;AgentQL query&lt;/a&gt;.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://scrapeme.live/shop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{ products[] { product_name product_price } }"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Set your headers:&lt;/strong&gt; Before making the API request, include the necessary headers for authentication and content type. These headers authorize the request and specify the data format being sent.&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;X-API-Key&lt;/code&gt;: use your AgentQL API key for authentication.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Content-Type&lt;/code&gt;: use &lt;code&gt;application/json&lt;/code&gt; to indicate that the request body is in JSON format, allowing the server to interpret the data correctly.&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Send the Request:&lt;/strong&gt; Use your preferred HTTP client (like curl, Postman, or an HTTP library in Python or your preferred language) to make a &lt;code&gt;POST&lt;/code&gt; request to the AgentQL REST API endpoint.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.agentql.com/v1/query-data"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-API-Key: &lt;/span&gt;&lt;span class="nv"&gt;$AGENTQL_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "url": "https://scrapeme.live/?s=fish&amp;amp;post_type=product",
    "query": "{ products[] { product_name product_price } }"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Make sure to replace &lt;code&gt;$AGENTQL_API_KEY&lt;/code&gt; with your actual &lt;a href="http://dev.agentql.com" rel="noopener noreferrer"&gt;API key&lt;/a&gt;!)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Get Results:&lt;/strong&gt; The API response will return data as structured JSON, ready to be used directly in applications, AI agents, or analytics workflows.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"products"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"product_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Qwilfish"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"product_price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"£77.00"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"product_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Huntail"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"product_price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"£52.00"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"request_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ecab9d2c-0212-4b70-a5bc-0c821fb30ae3"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Use Cases for the REST API
&lt;/h2&gt;

&lt;p&gt;The REST API unlocks a wide array of possibilities for developers and agent builders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automated scraping activities:&lt;/strong&gt; Add fetching data from any web page to your automation tasks, whether it's dynamic content or JavaScript-based content—AgentQL can handle it. Extract products, product details, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large-scale data acquisition:&lt;/strong&gt; For training data collection, nothing beats structured, real-time data, fresh from the Internet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Data Pipelines:&lt;/strong&gt; Feed up-to-date data into your backend processing or data analytics systems. This is perfect for e-commerce monitoring, news aggregation, or lead generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic AI Integrations:&lt;/strong&gt; AI agents can now pull dynamic data on-demand, making decisions based on up-to-date information. Whether your agent monitors trends, analyzes competitor data, or interacts with external content, the REST API equips it with live data capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zapier Integrations for No-Code Automation:&lt;/strong&gt; Use the REST API with Zapier to trigger data extraction workflows and automate repetitive tasks without writing code.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ready to get real-time data from the web?
&lt;/h2&gt;

&lt;p&gt;Get started making some AgentQL REST API calls today!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.agentql.com/rest-api/api-reference" rel="noopener noreferrer"&gt;API Reference docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.agentql.com/scraping/scraping-data-api" rel="noopener noreferrer"&gt;Guide to scraping data from live web pages with the API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://zapier.com/shared/3a2bcdfd2b9b596e7176c34bae125bb526e7a390" rel="noopener noreferrer"&gt;Zapier template&lt;/a&gt; (just add your &lt;a href="https://dev.agentql.com/" rel="noopener noreferrer"&gt;free API key&lt;/a&gt;!)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  That’s a wrap for Launch Week!
&lt;/h2&gt;

&lt;p&gt;This Launch Week we shared a new JavaScript SDK, Fast Mode, Stealth Mode, Query Generation from Natural Language and now this. We hope the REST API becomes an invaluable part of your toolkit, whether you’re a developer, automation expert, or building the next generation of agentic AI. We'd love to see what you build and are here to help &lt;a href="https://discord.gg/agentql" rel="noopener noreferrer"&gt;on our community Discord&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thank you for being part of AgentQL Launch Week! We're working hard to make sure AgentQL is your favorite tool for automation and data retrieval. Please let us know what you think—&lt;a href="https://www.surveymonkey.com/r/JWQGQG8" rel="noopener noreferrer"&gt;take our survey&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Happy coding and automating!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;—The Tiny Fish Team Building AgentQL&lt;/em&gt;&lt;/p&gt;

</description>
      <category>scraping</category>
      <category>api</category>
      <category>scraper</category>
      <category>dataextraction</category>
    </item>
  </channel>
</rss>
