# URL to Markdown – Clean LLM-Ready Web Page Converter (`maged120/url-to-markdown-pro`) Actor

URL to Markdown converter for LLMs and RAG: turn any web page into clean Markdown or reader text, or pull its SEO metadata (title, description, Open Graph, hreflang) and schema.org structured data. Export to CSV, JSON, Excel or API.

- **URL**: https://apify.com/maged120/url-to-markdown-pro.md
- **Developed by:** [Maged](https://apify.com/maged120) (community)
- **Categories:** Automation, AI
- **Features:** Limited permissions
- **Stats:** 6 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Web Page to Markdown Pro do?

**Web Page to Markdown Pro** turns web pages into clean text for LLMs, knowledge bases and note-taking apps. It has two modes:

- **Markdown**: converts the whole page to Markdown, optionally with the page title, without menus and footers, and with or without links
- **Reader**: keeps only the article itself, like a browser's reader view, as plain text, HTML or Markdown, with the title, headings and word count

This Actor runs on the [Apify platform](https://apify.com), so you can call it from the API, schedule it, or connect it to your tools.

### Why use Web Page to Markdown Pro?

- **LLM-ready output**: clean Markdown or plain text that feeds well into GPT, Claude or Gemini
- **Two levels of cleanup**: the full page as Markdown, or just the article text
- **Batch conversion**: convert hundreds of pages in one run
- **Article stats**: reader mode returns word count and headings, handy for content audits

### How to use Web Page to Markdown Pro

1. Open the Actor and click **Try for free**
2. Pick a **Mode**
3. Markdown mode: add pages to **URLs to scrape**. Reader mode: add pages to **Page URLs** and pick the output format
4. Click **Start**; results appear in the Output tab
5. Download as JSON, CSV or Excel, or read them through the Apify API

### Input

Markdown mode:

```json
{
  "mode": "markdown",
  "urls": [
    { "url": "https://docs.python.org/3/tutorial/", "title": true, "clean": true, "links": true }
  ]
}
```

Reader mode:

```json
{
  "mode": "reader",
  "target_urls": ["https://jamesclear.com/five-step-creative-process"],
  "output_format": "markdown"
}
```

| Field | Type | Mode | Description |
|---|---|---|---|
| `mode` | string | both | `markdown` (default) or `reader` |
| `urls` | array | markdown | Items like `{"url": "...", "title": true, "clean": true, "links": true}` |
| `target_urls` | array | reader | Page URLs; setting it switches to reader mode automatically |
| `output_format` | string | reader | `plain` (default), `html` or `markdown` |
| `target_url` | string | reader | Single page (legacy field, still supported) |

### More modes: page metadata and structured data

Set **Mode** to switch. Plain URL strings work in both modes.

#### Metadata

One row per page with its SEO and social tags: `title` and `titleLength`, `description` and `descriptionLength`, `canonical`, `robots`, `language`, `charset`, `favicon`, Open Graph (`ogTitle`, `ogDescription`, `ogImage`, `ogType`, `ogSiteName`), Twitter card fields, `hreflang` alternates, the page's `h1` headings and every meta tag in `allMetaTags`.

```json
{
    "mode": "metadata",
    "urls": ["https://www.bbc.com", "https://www.wikipedia.org"]
}
```

#### Structured data

Every schema.org JSON-LD item on the page, one row per item, with ready columns (`schemaType`, `name`, `price`, `currency`, `availability`, `ratingValue`, `reviewCount`, `brand`, `sku`, `datePublished`) and the full object in `data`. Filter to the types you want with **Only these types** (for example `Product`, `Recipe`, `Event`).

```json
{
    "mode": "structuredData",
    "urls": ["https://en.wikipedia.org/wiki/Python_(programming_language)"],
    "onlyTypes": ["Article"]
}
```

Pages that can't be loaded, or that have no structured data, are listed in the run's status message and are not charged.

### Output

Markdown mode:

```json
{
  "url": "https://docs.python.org/3/tutorial/",
  "markdown": "# The Python Tutorial

Python is an easy to learn, powerful programming language...",
  "status": "success",
  "error": null
}
```

Reader mode:

```json
{
  "url": "https://jamesclear.com/five-step-creative-process",
  "title": "The Creative Process: For a More Creative Brain, Follow These 5 Steps",
  "content": "# For a More Creative Brain Follow These 5 Steps

...",
  "format": "markdown",
  "wordCount": 1352,
  "headings": ["For a More Creative Brain Follow These 5 Steps", "A Problem in Need of a Creative Solution"],
  "error": null,
  "scrapedAt": "2026-10-22T16:00:00+00:00"
}
```

**Coming from Web Article Extractor (reader-mode)?** Use the same input here; `target_url`, `target_urls` and `output_format` switch this Actor to reader mode and return the same rows.

### How many results will I get?

You're charged per result, so the cost follows the number of rows below. Your plan's rates are on the **Pricing** tab.

| Input | Results |
|---|---|
| 100 pages | 100 rows |
| 1,000 pages | 1,000 rows |

Each converted page is one row.

### FAQ

**Does it render JavaScript?**
No. Both modes read the page's HTML, which covers articles, docs and most websites. Pages that build their content entirely in the browser may come back short.

**Is this Actor maintained?**
Yes. Report bugs or feature requests in the Issues tab.

**Need help or have questions?**
Open an issue in the Issues tab or reach out on Discord: **maged03211**

***

⭐ **Found this Actor useful?** A quick review on the Store helps other users find it and keeps it maintained.

### Related tools

- [Website URL Crawler – every link of a site, sitemap URLs and broken links](https://apify.com/maged120/get-urls-pro)
- [SEO Checker – on-page SEO score and issues](https://apify.com/maged120/seobility-seo-checker)
- [Contact Extractor – emails, phones and social links from websites](https://apify.com/maged120/extract-contacts)

# Actor input Schema

## `mode` (type: `string`):

Markdown converts the whole page. Reader keeps just the article text, like a browser reader view, as plain text, HTML or Markdown. Metadata returns one row per page with its SEO and social tags. Structured data returns one row per schema.org item found on the page.

## `urls` (type: `array`):

Pages to convert. Each item: {"url": "...", "title": true, "clean": true, "links": true} (title adds the page title, clean strips menus and footers, links keeps hyperlinks). In reader mode, plain URL strings work too. In metadata and structured data modes, plain URL strings work too.

## `target_urls` (type: `array`):

Pages to extract in reader mode. Setting this switches to reader mode automatically.

## `output_format` (type: `string`):

Format of the article text in reader mode.

## `target_url` (type: `string`):

One page for reader mode. Kept for existing integrations; use "Page URLs" instead.

## `onlyTypes` (type: `array`):

Optional. Keep only these types, e.g. Product, FAQPage, Event. Leave empty for all.

## `includeFullData` (type: `boolean`):

Turn off to get only the summary columns (name, price, rating…).

## `proxyConfiguration` (type: `object`):

Structured data mode only. Optional. Some shops block datacenter IPs; use residential if pages fail.

## Actor input object example

```json
{
  "mode": "markdown",
  "urls": [
    {
      "url": "https://apify.com/maged120",
      "title": true,
      "clean": true,
      "links": true
    },
    {
      "url": "https://github.com/Puliczek/CVE-2022-0337-PoC-Google-Chrome-Microsoft-Edge-Opera",
      "title": false,
      "clean": false,
      "links": true
    }
  ],
  "output_format": "plain",
  "includeFullData": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "urls": [
        {
            "url": "https://apify.com/maged120",
            "title": true,
            "clean": true,
            "links": true
        },
        {
            "url": "https://github.com/Puliczek/CVE-2022-0337-PoC-Google-Chrome-Microsoft-Edge-Opera",
            "title": false,
            "clean": false,
            "links": true
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maged120/url-to-markdown-pro").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "urls": [
        {
            "url": "https://apify.com/maged120",
            "title": True,
            "clean": True,
            "links": True,
        },
        {
            "url": "https://github.com/Puliczek/CVE-2022-0337-PoC-Google-Chrome-Microsoft-Edge-Opera",
            "title": False,
            "clean": False,
            "links": True,
        },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("maged120/url-to-markdown-pro").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "urls": [
    {
      "url": "https://apify.com/maged120",
      "title": true,
      "clean": true,
      "links": true
    },
    {
      "url": "https://github.com/Puliczek/CVE-2022-0337-PoC-Google-Chrome-Microsoft-Edge-Opera",
      "title": false,
      "clean": false,
      "links": true
    }
  ]
}' |
apify call maged120/url-to-markdown-pro --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maged120/url-to-markdown-pro"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6XD8UxxggX4VPep9M/builds/gFQxITDtKhrIxtWzR/openapi.json
