# Webpage to Markdown API: Clean Markdown from Any Public URL

> Webpage to Markdown API: turn a public URL into clean, LLM-ready Markdown with title and word count. One URL or up to 100 per run. Pay per page.

URL: https://cliqtomedia.com/actors/webpage-to-markdown-api/

Category: AI-ready content & documents · Status: coming soon · Apify profile: https://apify.com/cliqtomedia?fpr=cliqto

Give a link and get the page as clean Markdown in a few seconds. You also get the title, word count and HTTP status. It is made for AI agents and LLM tools.

## How to use it: 3 steps

1. **Follow us on Apify.** The tool is built and waits in the queue for the Apify Store. Apify is the cloud platform where our tools run.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `https://apify.com` in Page URL. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

Turn any public web page URL into clean, LLM-ready Markdown with the page title, word count and HTTP status.



### Good for

- An AI agent or LLM tool needs to read one page as Markdown in one quick call.
- A RAG or summary pipeline needs clean text from a list of known URLs (up to 100 per run).
- A script needs the title, word count and HTTP status of a page together with its text.

### Not a good fit

- Whole-site crawling. The Actor reads only the URLs you give; it does not follow links.
- Pages behind a login, paywall or CAPTCHA. The Actor does not log in and does not bypass them.
- Sites with strong bot protection may answer `403`. You get an `HTTP_ERROR` row, not a bypass.
- Private and internal network addresses (for example `localhost`, `10.x.x.x`) are blocked.

## Price

Prices will be shown after release.

## Questions

### Does it follow links on the page?

No. It reads only the URLs you give. It does not crawl the site.

### Do I pay for pages that fail?

Only a small URL check. Missing, empty or failed pages do not cost the page price.

### Why is the Markdown shorter than the page?

Menus, footers and other extras are removed. You get the main content.

### Can it read sites with bot protection?

Not always. Some answer 403. You then get an error row, not a bypass.

### Do I need a login or an API key for the site?

No. The Actor reads public pages only. You need only your Apify account.

### Does it crawl the whole website?

No. It reads exactly the URLs you give. For many pages of one site, first get the page list (for example with a sitemap tool), then pass the URLs here.

### Is the text always the same as in my browser?

Not always. Sites can show different content by region, cookies or bot checks. The row shows `statusCode` and `fetchedAt`, so you know what the Actor received and when.

### Who is responsible for how I use the pages?

You are. Follow the target site's terms and robots rules.

## Data fields

- `url` (string): URL as given in the input.
- `finalUrl` (string): URL after redirects. null when the page could not be loaded.
- `status` (string): complete: full Markdown; partial: Markdown cut by maxChars or the page probably needs renderJs; not_found: HTTP 404/410 or no readable text; error: could not fetch (see error).
- `statusCode` (integer): HTTP status code of the page.
- `title` (string): Page title.
- `description` (string): Meta description.
- `language` (string): Language from <html lang>, e.g. en.
- `markdown` (string): Main content as Markdown (navigation, headers, footers and cookie banners removed). Starts with '# title' when the page has no H1. null when nothing could be converted.
- `wordCount` (integer): Words in the Markdown.
- `truncated` (boolean): True when the Markdown was cut by maxChars or the internal limit.
- `renderedJs` (boolean): True when the page was rendered in a browser (renderJs).
- `links` (array): Only with includeLinks: absolute links found on the page.
- `fetchedAt` (string): When the page was fetched, ISO 8601.
- `error` (object): Why the row is not complete: code (NOT_FOUND, NEEDS_JS, NO_CONTENT, HTTP_ERROR, TIMEOUT, DNS_ERROR, BLOCKED_URL, INVALID_URL, NOT_HTML, TOO_LARGE, CHARGE_LIMIT, RUN_TIME_LIMIT, SITES_NOT_RESPONDING, …) and message. null when complete.

## Input settings

- `url` (string): One public web page, for example https://apify.com. Pages behind a login or paywall and private or internal addresses are not fetched.
- `urls` (array): Optional list of more pages for the same run (together with Page URL up to 100 different URLs). Each URL becomes its own row.
- `renderJs` (boolean): Open pages in a real browser (Chromium) before converting. Turn on for JavaScript apps whose HTML has no text (rows with error code NEEDS_JS). Slower, uses 1 GB memory and adds a js-render charge for each page the browser opens.
- `includeLinks` (boolean): Add a links array with every absolute link found on the page (up to 5000).
- `maxChars` (integer): Cut the Markdown to this many characters to fit your LLM context (truncated = true, status partial). 0 = no limit (internal cap 500 000). Allowed: 0 or 500–500 000.

## Step by step on Apify

1. Open the Input tab.
2. Keep the prefilled Page URL `https://apify.com` or paste your own page.
3. Leave Render JavaScript off for normal pages.
4. Click Start.
5. Open the Output tab. The Markdown view shows `url`, `title` and `markdown`; the Pages view shows status, HTTP code and word count.

## Use cases

| Task | Input | You get | Key fields | Next step |
|---|---|---|---|---|
| Let an AI agent read a page | `url` | one page | `markdown`, `title`, `wordCount` | Apify MCP server, agent tool call |
| Feed a RAG index from known URLs | `urls` (up to 100) | one row per page | `url`, `markdown`, `fetchedAt` | API, LangChain, LlamaIndex, n8n |
| Fit a page into an LLM context window | `url` + `maxChars` | cut page | `markdown`, `truncated` | prompt template |
| Read a JavaScript app page | `url` + `renderJs` | rendered page | `markdown`, `renderedJs` | same as above |
| Collect links of a page | `url` + `includeLinks` | page with links | `links`, `title` | crawler or link checker |

## Tips

- Turn on JavaScript rendering only for app-like pages. It is slower.
- Set a maximum cost per run. The tool will not start pages it cannot pay for.
- Use our Website to Markdown tool if you need a whole site. This one reads only your links.

## Limits



- A page that does not exist, has no text, needs JavaScript or fails (`not_found`, `error`, `NEEDS_JS`) costs only the URL checked event. You do not pay the page event.
- URLs the run did not start (`CHARGE_LIMIT`, `RUN_TIME_LIMIT`, `SITES_NOT_RESPONDING`) cost nothing.
- An input error (for example, no URL) costs only the Actor start.
- Your maximum cost per run is respected: the Actor does not start a page it cannot pay for and marks the rest `CHARGE_LIMIT`.
- Up to 100 different URLs per run; 5 pages at a time over HTTP, 2 in the browser.
- One page: up to 15 seconds per request, 2 attempts, 10 MB of HTML, 5 redirects.
- A run stops starting new pages after about 4 minutes, so it fits the default 300-second timeout. If for 60 seconds no site gives a real answer (only timeouts, dropped connections, or server errors 5xx/429), the rest are marked `SITES_NOT_RESPONDING` at no charge.
- Typical time: about 1–2 seconds for one page on a warm start, up to about 10 seconds on a cold start; about 11 seconds with `renderJs`; about 70 seconds for 100 pages.

## Sample result

```json
{
  "url": "https://apify.com",
  "finalUrl": "https://apify.com/",
  "status": "complete",
  "statusCode": 200,
  "title": "Apify: Marketplace of ready-to-run tools for AI",
  "description": "Thousands of tools to automate your business. Get real-time web data, track competitors, generate leads, and integrate your apps and AI agents.",
  "language": "en",
  "markdown": "# 88,965 tools for your AI\n\nApify is a marketplace of ready-to-run tools for AI. Get real-time web data, track competitors, generate leads, monitor social media, and integrate your apps and agents.\n\n## Popular Actors\n\n…",
  "wordCount": 1333,
  "truncated": false,
  "renderedJs": false,
  "fetchedAt": "2026-10-15T19:14:50.149Z",
  "error": null
}
```

## Use cases with this tool

- [One piece of content, ten new posts](https://cliqtomedia.com/actors/use-cases/content-repurposing/): Turn videos, podcasts, PDFs and articles into clean text. Make posts, notes and AI drafts from it.

## Similar tools

- [XML Sitemap URLs Extractor](https://cliqtomedia.com/actors/xml-sitemap-urls-extractor/)
- [Website Metadata & Open Graph Scraper](https://cliqtomedia.com/actors/website-metadata-open-graph-scraper/)
- [Website Screenshot & PDF Generator: Full Page & Mobile](https://cliqtomedia.com/actors/website-screenshot-pdf/)
- [RSS & Atom Feed Reader / Monitor](https://cliqtomedia.com/actors/rss-atom-feed-reader-monitor/)
- [WordPress Posts & Pages Scraper](https://cliqtomedia.com/actors/wordpress-posts-pages-scraper/)
- [News Article Extractor: RSS, URLs & Clean Text](https://cliqtomedia.com/actors/news-article-extractor/)
