[Sponsor] Turn websites into AI markdown with Firecrawl's API

Convert entire Websites from
HTML to Markdown

The converter produces accurate outputs. This allows the conversion of entire websites — useful for website migrations and other tasks.

For this to work, many egde-cases have to be considered:

Heading

The converter can handle Headings from level <h1> to <h6> even with other elements inside.

<h2>Heading</h2>
## Heading
<h4>
	<strong>Important</strong>
	Heading
</h4>
#### **Important** Heading

Bold & Italic

Emphasis and strong formatting is supported – even intraword.

<p>
	<strong>Bold</strong>
	and
	<em>Italic</em>
</p>
**Bold** and *Italic*

Bold & Italic with Nesting

Unnecessary nesting could generate too many * or _ delimiters. The converter reduces unnecessary nesting.

<b><b>Incredibly</b> <b>Bold</b></b>
**Incredibly Bold**

Unordered List

Nested Lists (with the correct indentation) are also supported.

<ul>
	<li>Simple List</li>
	<li>
		<p>Someone once said:</p>
		<blockquote>
			My famous quote
		</blockquote>
		<span>by someone</span>
	</li>
</ul>
- Simple List
- Someone once said:
  
  > My famous quote
  
  by someone

Ordered List

The start attribute is also respected for ordered lists.

<ol start="9">
	<li>Nine</li>
	<li>Ten</li>
	<li>
		Eleven
		<ul>
			<li>Nested</li>
		</ul>
	</li>
</ol>
09. Nine
10. Ten
11. Eleven
    
    - Nested

Blockquote

A blockquote can also contain other elements. And blockquotes can event be nested inside each other.

<blockquote>
	<h2>Heading</h2>

	<ol>
		<li>List</li>
		<li>List</li>
	</ol>

	<blockquote>
		<p>Another Quote</p>
		<p>by someone</p>
	</blockquote>
</blockquote>
> ## Heading
> 
> 1. List
> 2. List
> 
> > Another Quote
> > 
> > by someone

Inline Code

The converter correctly treats the backtick character.

<p>
	Output a message: <br/>
	<code>console.log("hello")</code>
</p>
Output a message:  
`console.log("hello")`
<code>with `` backticks</code>
```with `` backticks```
<code>`variable`</code>
`` `variable` ``

Code Block

<pre class="language-js"><code>
console.log("hello")

</code></pre>
```js

console.log("hello")

```
<pre class="language-go"><code>
<span class="token function">func</span>

</code></pre>
```go

func

```
<pre><code>
This ``
totally ``` works!

</code></pre>
````

This ``
totally ``` works!

````

Link

The converter supports relative and absolute links. Other elements inside are also supported.

<a href="/index.html">
	<strong>Home</strong>
</a>
[**Home**](/index.html)
<a
	href="/about"
	title="title text"
	>
	About 
</a>
[About](/about "title text")

Multiline Link

A markdown link can stretch onto multiple lines. For this a blank line has to be escaped.

<a href="/post">
	<p>Line 1</p>
	<p>Line 2</p>
	<p>Line 3</p>
</a>
[Line 1
\
Line 2
\
Line 3](/post)
<a href="/post">
	Line 1 <br/>
	Line 2 <br/>
	Line 3 <br/>
</a>
[Line 1
\
Line 2
\
Line 3](/post)

Escaping where necessary

Some characters would (accidentally) be recognized as markdown. The converter escapes these with a backlash — but only if necessary.

<h2># Heading #</h2>
## # Heading \#
<p># Heading</p>
<p>#hashtag</p>
\# Heading

#hashtag
<p>- List Item</p>
<p>Just a — dash</p>
\- List Item

Just a — dash

Swapping Nodes

It is invalid to have block-elements inside inline-elements. The converter then swaps the nodes.

<h2>
	<a href="/">Headline</a>
</h2>
## [Headline](/)
<a href="/">
	<h2>Headline</h2>
</a>
## [Headline](/)