<?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: AnyCrawler</title>
    <description>The latest articles on DEV Community by AnyCrawler (@anycrawler).</description>
    <link>https://dev.to/anycrawler</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4228341%2F854e1b8e-9444-45f0-b4de-04e40a840274.png</url>
      <title>DEV Community: AnyCrawler</title>
      <link>https://dev.to/anycrawler</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/anycrawler"/>
    <language>en</language>
    <item>
      <title>How to Give Your AI Agent Live Web Access (Free URL Markdown API)</title>
      <dc:creator>AnyCrawler</dc:creator>
      <pubDate>Thu, 05 Nov 2026 10:52:22 +0000</pubDate>
      <link>https://dev.to/anycrawler/how-to-give-your-ai-agent-live-web-access-free-url-markdown-api-165c</link>
      <guid>https://dev.to/anycrawler/how-to-give-your-ai-agent-live-web-access-free-url-markdown-api-165c</guid>
      <description>&lt;p&gt;If you are building an AI agent or RAG pipeline and need &lt;strong&gt;live web access&lt;/strong&gt;—a public URL turned into &lt;strong&gt;clean Markdown&lt;/strong&gt; your model can actually use—you do not have to stand up a scraper, headless browser farm, or HTML-cleaning stack first. One free &lt;code&gt;GET&lt;/code&gt; request can return readable page text as Markdown, ready to drop into a tool call or retrieval step.&lt;/p&gt;

&lt;p&gt;This tutorial solves that single need: convert one public URL into Markdown for agents and RAG, with copy-paste examples in curl, Python, and JavaScript. The endpoint we use is AnyCrawler’s free crawl API (no API key). I work on AnyCrawler; that is disclosed again at the end.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: agents need context, not raw HTML
&lt;/h2&gt;

&lt;p&gt;Agent and RAG systems fail in predictable ways when you feed them the open web:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Raw HTML is noisy.&lt;/strong&gt; Scripts, nav chrome, cookie banners, and layout markup burn tokens and confuse the model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Homegrown fetch is fragile.&lt;/strong&gt; One &lt;code&gt;requests.get&lt;/code&gt; (or &lt;code&gt;fetch&lt;/code&gt;) plus BeautifulSoup works for a demo page and breaks on the next docs site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser automation is heavy.&lt;/strong&gt; Playwright or Puppeteer is the right hammer for JS-heavy apps—not for “summarize this public article” in a tool loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What you usually want for a tool or retrieval step is narrower: &lt;strong&gt;one public page → title + description + Markdown body&lt;/strong&gt;, in a stable JSON shape, without signing up just to try it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The minimal solution: free URL → Markdown GET
&lt;/h2&gt;

&lt;p&gt;AnyCrawler exposes a public free endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET https://api.anycrawler.com/free/v1/crawl?url={url}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Constraints worth knowing up front:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No API key&lt;/strong&gt; for this free path&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One public page&lt;/strong&gt; per request&lt;/li&gt;
&lt;li&gt;Response JSON includes &lt;code&gt;results.markdown&lt;/code&gt; (plus title / description / status when available)&lt;/li&gt;
&lt;li&gt;Successful results &lt;strong&gt;may be cached up to 24 hours&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can try the same flow in the browser at the &lt;a href="https://anycrawler.com/free/" rel="noopener noreferrer"&gt;free URL→Markdown playground&lt;/a&gt; before wiring it into code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — Call it with curl
&lt;/h2&gt;

&lt;p&gt;Pick any publicly reachable docs or example URL. Here we use &lt;code&gt;https://example.com&lt;/code&gt;:&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;-sS&lt;/span&gt; &lt;span class="s2"&gt;"https://api.anycrawler.com/free/v1/crawl?url=https://example.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful response looks like:&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;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requested_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://example.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"results"&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;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"markdown"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"This domain is for use in documentation examples..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Example Domain"&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;"status_code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"total_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;519&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-11-05T10:38:26.962Z"&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;For an agent tool, the field that matters most is &lt;code&gt;results.markdown&lt;/code&gt;. Keep &lt;code&gt;status_code&lt;/code&gt; and &lt;code&gt;ok&lt;/code&gt; for error handling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Tiny Python example (&lt;code&gt;requests&lt;/code&gt;)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;FREE_ENDPOINT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.anycrawler.com/free/v1/crawl&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&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="n"&gt;FREE_ENDPOINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;data&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ok&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;crawl failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;markdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;results&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;markdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hook this into a LangChain / LlamaIndex / custom tool the same way: accept a URL string, return Markdown (and optionally title) as the tool result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — JavaScript / Node example (&lt;code&gt;fetch&lt;/code&gt;)
&lt;/h2&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;FREE_ENDPOINT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.anycrawler.com/free/v1/crawl&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;urlToMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pageUrl&lt;/span&gt;&lt;span class="p"&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;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FREE_ENDPOINT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;searchParams&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pageUrl&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&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;data&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`crawl failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;title&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="na"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&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="nf"&gt;urlToMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&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;markdown&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In an agent loop, expose &lt;code&gt;urlToMarkdown&lt;/code&gt; as a single tool with a clear description: “Fetch a public web page and return clean Markdown for reading.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — Drop Markdown into an agent or RAG step
&lt;/h2&gt;

&lt;p&gt;A practical pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User (or planner) supplies a URL.&lt;/li&gt;
&lt;li&gt;Tool calls the free crawl endpoint.&lt;/li&gt;
&lt;li&gt;You pass &lt;code&gt;results.markdown&lt;/code&gt; into the model context—or chunk/embed it for retrieval.&lt;/li&gt;
&lt;li&gt;Optionally prepend &lt;code&gt;title&lt;/code&gt; / &lt;code&gt;description&lt;/code&gt; so citations stay grounded.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Because the body is already Markdown, you avoid a second “strip HTML / readability” stage for many public pages. Keep tool descriptions honest: this is &lt;strong&gt;read one public URL&lt;/strong&gt;, not full-site crawl or authenticated browsing.&lt;/p&gt;

&lt;p&gt;For RAG specifically, treat each crawl as a document source: chunk &lt;code&gt;results.markdown&lt;/code&gt;, store the &lt;code&gt;requested_url&lt;/code&gt; as metadata for citations, and decide whether your index should refresh on every query or reuse embeddings until the free cache window (up to 24h) is no longer acceptable. Cache awareness matters for freshness: if you need a reliable recrawl sooner than that window, move to the authenticated production API (next section).&lt;/p&gt;

&lt;h2&gt;
  
  
  When to graduate to the production crawl API
&lt;/h2&gt;

&lt;p&gt;Stay on the free endpoint while you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prototyping a tool&lt;/li&gt;
&lt;li&gt;Spot-checking whether a page yields useful Markdown&lt;/li&gt;
&lt;li&gt;Running low-volume demos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Move to AnyCrawler’s &lt;strong&gt;authenticated production crawl API&lt;/strong&gt; when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explicit &lt;strong&gt;fetch&lt;/strong&gt; vs &lt;strong&gt;browser render&lt;/strong&gt; modes&lt;/li&gt;
&lt;li&gt;Configurable output fields and usage records&lt;/li&gt;
&lt;li&gt;Higher operational limits and repeatable production workflows&lt;/li&gt;
&lt;li&gt;Control beyond one anonymous GET per public URL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free path is intentionally small. Production is where you add modes, auth, and operational controls—not where you should start if you only need “URL → Markdown” for a first agent tool. Compare both on the &lt;a href="https://anycrawler.com/free/" rel="noopener noreferrer"&gt;free tool page&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short FAQ (related searches)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How do I convert a URL to Markdown for RAG without building a scraper?
&lt;/h3&gt;

&lt;p&gt;Call a crawl API that returns cleaned Markdown in JSON. The free AnyCrawler endpoint above does that for one public URL per request with no API key. For many RAG demos, &lt;code&gt;results.markdown&lt;/code&gt; is enough to chunk and embed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can an AI agent browse the live web with one HTTP call?
&lt;/h3&gt;

&lt;p&gt;Not full interactive browsing—but for “read this public page,” yes: a tool that GETs the crawl endpoint and returns Markdown gives the agent live (or recently cached) page text without shipping a browser inside the agent process. Pair it with search (or a user-supplied URL) so the agent chooses &lt;em&gt;which&lt;/em&gt; page to read, then uses Markdown as the observation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is free URL→Markdown cached?
&lt;/h3&gt;

&lt;p&gt;Yes. Successful free results may be served from cache for up to &lt;strong&gt;24 hours&lt;/strong&gt;. Treat that as fine for prototypes; for stricter freshness or render modes, use the production API.&lt;/p&gt;

&lt;h3&gt;
  
  
  What URLs work?
&lt;/h3&gt;

&lt;p&gt;Submit a complete, publicly reachable &lt;code&gt;http&lt;/code&gt; or &lt;code&gt;https&lt;/code&gt; URL. Pages behind login, private networks, or otherwise inaccessible content are not suitable for the free tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it and build the tool
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Paste a public docs URL into the &lt;a href="https://anycrawler.com/free/" rel="noopener noreferrer"&gt;AnyCrawler free URL→Markdown tool&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Copy the curl / Python / JS snippets above into a minimal agent tool.&lt;/li&gt;
&lt;li&gt;Graduate to the authenticated crawl API when you need fetch/render modes and production limits.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I work on the AnyCrawler team. Feedback and questions: &lt;a href="mailto:marketing@anycrawler.com"&gt;marketing@anycrawler.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>agents</category>
      <category>api</category>
    </item>
  </channel>
</rss>
