<?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: hybridforgelab</title>
    <description>The latest articles on DEV Community by hybridforgelab (@hybridforgelab).</description>
    <link>https://dev.to/hybridforgelab</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%2F4208806%2Fe6991a97-2832-4402-9f2e-575c3e6392b5.png</url>
      <title>DEV Community: hybridforgelab</title>
      <link>https://dev.to/hybridforgelab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hybridforgelab"/>
    <language>en</language>
    <item>
      <title>Turn any web page into clean Markdown for your LLM, without ignoring robots.txt</title>
      <dc:creator>hybridforgelab</dc:creator>
      <pubDate>Tue, 27 Oct 2026 12:16:35 +0000</pubDate>
      <link>https://dev.to/hybridforgelab/turn-any-web-page-into-clean-markdown-for-your-llm-without-ignoring-robotstxt-4pgm</link>
      <guid>https://dev.to/hybridforgelab/turn-any-web-page-into-clean-markdown-for-your-llm-without-ignoring-robotstxt-4pgm</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: we're Hybrid Forge Lab and we built Distill, the API in this post. There's a free plan and a no-signup demo, so you can check everything below yourself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you feed web pages to an LLM, most of what you send isn't content. Navigation, footers, cookie banners, inline scripts, tracking pixels and sidebars all cost tokens and add noise to your embeddings.&lt;/p&gt;

&lt;p&gt;A real example: the Python tutorial page on &lt;a href="https://docs.python.org/3/tutorial/datastructures.html" rel="noopener noreferrer"&gt;Data Structures&lt;/a&gt; is &lt;strong&gt;111,008 bytes&lt;/strong&gt; of HTML. The main content as Markdown is &lt;strong&gt;28,453 characters&lt;/strong&gt;, about &lt;strong&gt;7,100 tokens&lt;/strong&gt;, and keeps the headings, the code blocks and the 31 links.&lt;/p&gt;

&lt;p&gt;That's roughly a quarter of the size, and none of what's gone is anything your model needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Distill does
&lt;/h2&gt;

&lt;p&gt;You send a URL, or HTML you already have. You get back:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the page's main content as &lt;strong&gt;Markdown&lt;/strong&gt;: headings, lists, GFM tables, fenced code blocks with their language;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;metadata&lt;/strong&gt;: title, author, published date, language and site name;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;counts&lt;/strong&gt;: words, characters and an approximate token count;&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;links&lt;/strong&gt; list, with relative URLs already made absolute.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the GitHub Blog's "What is Git?" post, as returned by the production API today (trimmed):&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;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ok"&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;"What is Git? Our beginner’s guide to version control"&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;"Kedasha Kerr"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"published_date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2024-05-27"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en-US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"site_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;"The GitHub Blog"&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;"What is Git? Our beginner’s guide to version control&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s2"&gt;Let’s get you started on your Git journey…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"truncated"&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;"took_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;1825&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;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;Through RapidAPI, with your key:&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;-G&lt;/span&gt; &lt;span class="s2"&gt;"https://distill-html-to-markdown-api.p.rapidapi.com/v1/markdown"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--data-urlencode&lt;/span&gt; &lt;span class="s2"&gt;"url=https://en.wikipedia.org/wiki/Markdown"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nv"&gt;include_links&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nv"&gt;max_chars&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-RapidAPI-Key: YOUR_RAPIDAPI_KEY"&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-RapidAPI-Host: distill-html-to-markdown-api.p.rapidapi.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The options you'll actually use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;max_chars&lt;/code&gt; cuts at a paragraph or word boundary, closes any open code fence and sets &lt;code&gt;truncated: true&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include_links&lt;/code&gt; (default on) and &lt;code&gt;include_images&lt;/code&gt; (default off);&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;include_tables&lt;/code&gt; (default on) keeps tables as GFM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Already have the HTML, for example from your own crawler or a headless browser? &lt;code&gt;POST&lt;/code&gt; it with a &lt;code&gt;base_url&lt;/code&gt;, and the relative links come back resolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small RAG ingest loop in Node.js
&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;url&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://distill-html-to-markdown-api.p.rapidapi.com/v1/markdown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;search&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;URLSearchParams&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;url&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://docs.python.org/3/library/json.html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;include_links&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;false&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;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;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;headers&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="s2"&gt;X-RapidAPI-Key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RAPIDAPI_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X-RapidAPI-Host&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="s2"&gt;distill-html-to-markdown-api.p.rapidapi.com&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;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="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;`Distill &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="c1"&gt;// 401, 422, 429…&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;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="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ok&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;warn&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;status&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;detail&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// robots_txt, blocked…&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nx"&gt;chunks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&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;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;## &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;s&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="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;url&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;final_url&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;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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Statuses, not exceptions
&lt;/h2&gt;

&lt;p&gt;A page you can't use isn't an error in your code: it's an answer. Distill always returns HTTP 200 with a &lt;code&gt;status&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;status&lt;/th&gt;
&lt;th&gt;what happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ok&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Markdown extracted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;no_content&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the page loaded, but there's no main content (often a JavaScript-built page)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;robots_txt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;robots.txt disallows the path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;opted_out&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the page says &lt;code&gt;noai&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;blocked&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the site's bot protection said no&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;not_html&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PDF, image, JSON…&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;http_error&lt;/code&gt; / &lt;code&gt;unreachable&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;the site errored or couldn't be reached&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;HTTP errors are kept for your mistakes (422 for a bad URL) and for limits (429).&lt;/p&gt;

&lt;h2&gt;
  
  
  What we refuse to do
&lt;/h2&gt;

&lt;p&gt;This is the part we care about most. Scraping for AI has a bad reputation, mostly earned.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;robots.txt is checked on every redirect hop&lt;/strong&gt;, and if it answers 5xx we treat the path as disallowed (RFC 9309).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-crawler groups are honoured too.&lt;/strong&gt; If a site blocks &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;ClaudeBot&lt;/code&gt;, &lt;code&gt;CCBot&lt;/code&gt;, &lt;code&gt;Google-Extended&lt;/code&gt; or a dozen others, we don't fetch it either.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;noai&lt;/code&gt; opt-outs&lt;/strong&gt; in &lt;code&gt;X-Robots-Tag&lt;/code&gt; or &lt;code&gt;&amp;lt;meta name="robots"&amp;gt;&lt;/code&gt; are respected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We identify ourselves&lt;/strong&gt; as &lt;code&gt;DistillBot/1.0&lt;/code&gt; with a &lt;a href="https://distill.hybridforgelab.com/bot.html" rel="noopener noreferrer"&gt;bot page&lt;/a&gt;. We never pretend to be a browser, and we never retry a bot wall from somewhere else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;At most 10 fresh fetches per minute per site&lt;/strong&gt;, across all customers. Results are cached for an hour, so popular pages don't get hammered.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Limits, honestly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript isn't run.&lt;/strong&gt; Pages that build their content in the browser come back as &lt;code&gt;no_content&lt;/code&gt;. If you already render them, &lt;code&gt;POST&lt;/code&gt; the HTML.&lt;/li&gt;
&lt;li&gt;Pages are read up to 5 MB, with a 20-second total budget per request.&lt;/li&gt;
&lt;li&gt;Extraction is heuristic (we build on &lt;a href="https://github.com/adbar/trafilatura" rel="noopener noreferrer"&gt;trafilatura&lt;/a&gt;), so some layouts come out imperfect.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No signup:&lt;/strong&gt; the demo on &lt;a href="https://distill.hybridforgelab.com/#try" rel="noopener noreferrer"&gt;distill.hybridforgelab.com&lt;/a&gt; runs the real API in your browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free plan:&lt;/strong&gt; Basic is $0 for 15 requests a month, with a hard limit, so it never runs up a bill. Paid plans start at $9 for 10,000 requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs and plans:&lt;/strong&gt; &lt;a href="https://rapidapi.com/hybrid-forge-lab-hybrid-forge-lab-default/api/distill-html-to-markdown-api" rel="noopener noreferrer"&gt;RapidAPI listing&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a page comes out wrong, send us the URL: those reports are how the extraction gets better.&lt;/p&gt;

</description>
      <category>llm</category>
      <category>rag</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
