# Medium Scraper - Articles, Authors, Tags & Search (`automly/medium-scraper`) Actor

Scrape Medium articles by tag, keyword, author, publication or link: title, subtitle, author with followers and bio, publication, dates, reading time, claps, responses, tags, member-only flag, image and full text as markdown.

- **URL**: https://apify.com/automly/medium-scraper.md
- **Developed by:** [Automly](https://apify.com/automly) (community)
- **Categories:** Social media
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.70 / 1,000 articles

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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

## Medium Scraper - Articles, Authors, Tags & Search

### What is Medium Scraper?

**Medium Scraper** is a tool that lets you **scrape articles from Medium by tag, keyword, author, publication or link**: title, subtitle, author with followers and bio, publication, publish and update dates, reading time, word count, claps, responses, tags, the member-only flag, the preview image and, when you want it, **the article's text as plain text and markdown**. Type a tag or a search, or paste any Medium link, click **Start**, and download the articles as Excel, CSV or JSON.

- ⚡ **Fast:** 1,000 articles from one tag in under 2 minutes, and about 950 articles with their full text from four inputs in under 40 seconds (our tests)
- 📚 **Deep:** whole tag archives, every story an author or publication has published, and up to 1,000 results per search
- 📝 **Article text as markdown:** headings, links, lists, quotes, code blocks and images kept
- 🔓 **No login:** no Medium account needed
- 💸 **Free to try:** the $5 of free usage every Apify account gets each month covers about 5,000 articles

### What can Medium Scraper do?

- **Scrape Medium articles by tag**, like `python`, `machine-learning` or `startup`, newest first
- **Search Medium** for any keyword and get the matching stories, most relevant first
- **Scrape every article by a Medium author**, from `medium.com/@username` or `username.medium.com`
- **Scrape a Medium publication**, like `medium.com/swlh` or a publication on its own domain like `levelup.gitconnected.com`
- **Scrape single Medium articles** from their links, on medium.com, writer subdomains or publication domains
- **Export Medium articles to markdown** for archives, newsletters, research or AI datasets
- **Find member-only (paywalled) stories**: every article says whether it is member-only
- **Track claps and responses** over time for your own stories or a competitor's
- **Collect author and publication profiles** with follower counts, bios and links
- Export to Excel, CSV, JSON, HTML or XML, or send the data to Google Sheets, Make, Zapier and more

### What data can you extract from Medium?

| | | |
|---|---|---|
| 📰 Title and subtitle | 🔗 Article link and canonical link | 🖼️ Preview image |
| ✍️ Author: name, username, link | 👥 Author followers and bio | 🏢 Publication: name, link, followers |
| 📅 Published and updated dates | ⏱️ Reading time | 🔢 Word count |
| 👏 Claps and clappers | 💬 Responses | 🏷️ Tags |
| 🔒 Member-only flag | 🌐 Language | 📝 Text and markdown |
| 🧑 Author rows: followers, following, membership, X link | 📚 Publication rows: followers, description, domain, creator | 🧭 The input each row came from |

### How to scrape Medium

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open **Medium Scraper**.
3. Enter tags, search keywords, authors or publications, or paste Medium links, one per line.
4. Set **Max articles per input**, and turn on **Include article text** if you need the text and markdown.
5. Click **Start**, then download the articles as Excel, CSV, JSON or HTML.

### How much does it cost to scrape Medium articles?

You pay only for the rows you get: one price per article, and another per author or publication row when you turn on **Add author rows** or **Add publication rows**. Article text costs nothing extra.

| Apify plan | Articles per 1,000 | Authors per 1,000 | Publications per 1,000 |
|---|---|---|---|
| Free | **$1.00** | **$2.00** | **$2.00** |
| Starter (Bronze) | **$0.90** | **$1.80** | **$1.80** |
| Scale (Silver) | **$0.80** | **$1.60** | **$1.60** |
| Business (Gold) and higher | **$0.70** | **$1.40** | **$1.40** |

Platform usage is included in these prices, so there is nothing else to pay.

Example: 1,000 articles from the `python` tag, with their text, cost $1.00 on the Free plan and $0.70 on Business.

Every Apify account gets **$5 of free usage each month**, enough for about 5,000 articles at Free-plan prices. See the **Pricing** tab for details.

### ⬇️ Input

| Setting | What it does |
|---|---|
| **Tags** | Medium tags, like `python` or `Data Science`. Each tag is read newest first, back through its archive |
| **Search keywords** | Words to search Medium stories for, like `web scraping` |
| **Authors** | Usernames (`@kozyrkov` or `kozyrkov`) or profile links |
| **Publications** | A publication's Medium name (`swlh`), its own domain (`levelup.gitconnected.com`) or link |
| **Medium links** | Any mix of tag, search, profile, publication and article links |
| **Max articles per input** | How many articles to save for each tag, search, author, publication or link (default 100). Set 0 for all of them |
| **Include article text** | Adds each article's text as plain text and markdown |
| **Add author rows** | Adds one row per author with followers, following, bio, avatar and links |
| **Add publication rows** | Adds one row per publication with followers, description, logo and domain |
| **Published after** | Keeps only articles published on or after a date |

The 200 newest articles on two tags:

```json
{
  "tags": ["python", "machine-learning"],
  "maxArticles": 100
}
```

Everything an author has published, with the text:

```json
{
  "authors": ["@kozyrkov"],
  "maxArticles": 0,
  "includeText": true
}
```

Search results and a publication's stories since September 1, with author rows:

```json
{
  "searchQueries": ["remote work"],
  "publications": ["levelup.gitconnected.com"],
  "publishedAfter": "2026-09-01",
  "includeAuthors": true
}
```

### ⬆️ Output

Every article is one row. With **Add author rows** or **Add publication rows** on, each author and publication found also gets one row; the `type` field says which. A member-only article with its text on:

```json
{
  "type": "article",
  "id": "7c3910b4ca9a",
  "url": "https://kozyrkov.medium.com/statistics-for-people-in-a-hurry-7c3910b4ca9a",
  "title": "Statistics for people in a hurry",
  "subtitle": "All of statistics in under 10 minutes. If you prefer an 🎧audio🎧 version, there’s one here too.",
  "imageUrl": "https://miro.medium.com/v2/resize:fit:1200/0*Z56A_UHpgRDtwxgl.jpg",
  "author": {
    "id": "2fccb851bb5e",
    "name": "Cassie Kozyrkov",
    "username": "kozyrkov",
    "url": "https://medium.com/@kozyrkov",
    "followers": 179359,
    "bio": "CEO, Kozyr. Former Chief Decision Scientist, Google. ❤️ Stats, ML/AI, data, puns, art, theatre, decision science. All views are my own. decision.substack.com",
    "imageUrl": "https://miro.medium.com/v2/resize:fill:176:176/1*XlVStdn200ll4k3u_VOvGg.png"
  },
  "publication": null,
  "publishedAt": "2025-04-08T09:42:38Z",
  "updatedAt": "2025-04-08T09:42:38Z",
  "readingTimeMinutes": 8,
  "wordCount": 1926,
  "claps": 1732,
  "clappers": 278,
  "responses": 27,
  "tags": ["statistics", "decision-making", "artificial-intelligence", "data-science", "leadership"],
  "memberOnly": true,
  "language": "en",
  "canonicalUrl": "https://kozyrkov.medium.com/statistics-for-people-in-a-hurry-7c3910b4ca9a",
  "textIsPreview": true,
  "text": "Statistical Thinking\n\nStatistics for people in a hurry\n\nIf you prefer an 🎧audio🎧 version, here’s one read for you by the author.\n\nEver wished someone would just...",
  "markdown": "### Statistical Thinking\n\n## Statistics for people in a hurry\n\n***If you prefer an 🎧audio🎧 version, [here’s one](https://bit.ly/dipod_statistics) read for you by the author.***\n\nEver wished someone wo...",
  "source": "https://kozyrkov.medium.com/statistics-for-people-in-a-hurry-7c3910b4ca9a",
  "scrapedAt": "2026-10-02T09:35:19Z"
}
```

A publication row:

```json
{
  "type": "publication",
  "id": "5517fd7b58a6",
  "url": "https://levelup.gitconnected.com",
  "title": "Level Up Coding",
  "subtitle": "Coding tutorials and news. The developer homepage gitconnected.com && skilled.dev && levelup.dev",
  "imageUrl": "https://miro.medium.com/v2/resize:fill:176:176/1*5D9oYBd58pyjMkV_5-zXXQ.jpeg",
  "slug": "gitconnected",
  "domain": "levelup.gitconnected.com",
  "followers": 363032,
  "creatorUsername": "treyhuffine"
}
```

An author row has `title` (the name), `subtitle` (the bio), `imageUrl`, `username`, `followers`, `following`, `isMember`, `isBookAuthor`, `twitterUrl` and `customDomain`.

The **Overview** tab lists every row. **Article details** shows authors, dates, claps and tags, **Article text** the markdown, and **Authors & publications** the profile rows. The run report names any tag, author, publication or article that does not exist.

### Member-only stories

Medium lets anyone read the beginning of a member-only story for free. With **Include article text** on, that free preview is what you get for member-only stories, and `textIsPreview` is `true`; public stories come with their whole text and `textIsPreview` is `false`. Every article has `memberOnly`, so you can filter member-only stories in or out. The scraper never reads more than a visitor who is not logged in can see.

### How can I use Medium data?

- **Content research:** see which topics, titles and formats get the most claps and responses in your niche
- **Competitor and creator tracking:** follow writers and publications, their posting rhythm and engagement
- **Influencer and guest-author discovery:** find active writers on a topic with their follower counts and links
- **Newsletters and digests:** collect the newest articles on your tags every day with **Published after**
- **Datasets for analysis and AI:** article text as clean markdown with dates, tags and authors
- **Publication analytics:** measure a publication's output and engagement over time

### Scrape more articles, blogs and posts

| Actor | What it gets |
|---|---|
| [Google News Scraper API - Full Text, Monitoring & RSS](https://apify.com/automly/google-news-scraper-api) | Google News articles by keyword with publisher links, full text and only new articles on every run |
| [News API - Multi-Source Headlines & Articles](https://apify.com/automly/news-api) | Headlines and articles from BBC, CNN, NPR, NYT, The Guardian, Google News and Hacker News |
| [Hacker News Trends API](https://apify.com/automly/hacker-news-trends-api) | Hacker News stories and discussions filtered by keyword, points, comments and date |
| [Reddit Scraper - Posts, Comments, Users, Subreddits & Search](https://apify.com/automly/reddit-ultimate-scraper) | Reddit posts, comments, subreddits, user profiles and keyword search results |
| [LinkedIn Post Search Scraper (No Login)](https://apify.com/automly/linkedin-post-search-scraper) | Public LinkedIn posts by keyword: text, author, date, likes and comment count |

### ❓FAQ

#### How much does it cost to scrape Medium?

$1.00 per 1,000 articles on the Free plan and less on paid plans, with platform usage included and article text at no extra cost; author and publication rows have their own price. See the cost section above for every plan and price. **Max articles per input** keeps the cost of a run under control, and you can also set a maximum cost per run.

#### How many articles can I get?

Tags, authors and publications are read to the end: a tag's archive goes back for years, and authors and publications give every story they have published. A Medium search shows at most 1,000 stories per keyword; add related keywords (`web scraping`, `web scraping python`, `scrapy`) to collect more. An article that turns up in several of your inputs is saved once.

#### Can I get the full text of member-only articles?

No. You get everything about a member-only story that is public (title, subtitle, author, dates, claps, responses, tags) and, with text on, the free preview Medium shows to everyone. Public stories come with their whole text.

#### Can I scrape the newest articles every day?

Yes. Schedule the scraper with your tags, authors or publications and set **Published after** to a recent date; it stops reading each list as soon as it reaches older articles, so a daily run stays small and cheap.

#### Do I need a Medium account?

No. You don't need a Medium account, membership, cookies or an API key: the scraper collects the public information anyone can see without signing in.

#### What happens with a deleted article or a wrong link?

The run goes on with the other inputs, and the run report lists the tags, authors, publications and articles that do not exist. A link that is not a Medium tag, search, profile, publication or article is named in the log with the reason. Short `link.medium.com` links are not supported: open them and paste the full link.

#### Can I connect Medium Scraper to other tools or AI agents?

Yes. Start runs and download results with the Apify API or the Python and JavaScript clients, send results to Make, Zapier, n8n, Google Sheets or Slack with Apify integrations and webhooks, or let AI assistants and agents run it through the Apify MCP server at [mcp.apify.com](https://mcp.apify.com). For instant answers inside your app, its real-time API returns articles directly for `/articles?tag=python` (also `search=`, `author=`, `publication=` and `url=`), without starting a run.

#### Is it legal to scrape Medium?

This scraper only collects information that authors and publications chose to publish openly on Medium, and never more of a member-only story than any visitor can read. Author names, bios and links can still be personal data, which may be protected by laws such as GDPR, so only scrape for a legitimate reason, respect the authors' copyright when you reuse their writing, and ask a lawyer if you are unsure. You can read more in [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/)

Medium Scraper is an independent tool. It is not affiliated with, endorsed by or sponsored by Medium.

#### Something isn't working?

Open the **Issues** tab and tell us your input and what you expected, or which field you need. We read every one and usually reply within a day.

### ⭐ Your feedback

Have an idea or found a problem? Tell us in the **Issues** tab. If Medium Scraper saved you time, a short review on the **Reviews** tab helps other people find it.

# Actor input Schema

## `tags` (type: `array`):

Enter Medium tags (topics), one per line: python, machine-learning, Data Science. Every tag is read newest first, back through its whole archive.

## `searchQueries` (type: `array`):

Enter words to search Medium stories for, one search per line, like web scraping or remote work. Medium shows up to 1,000 stories per search, most relevant first.

## `authors` (type: `array`):

Enter Medium usernames (@kozyrkov or kozyrkov) or profile links. Every story the author has published, newest first.

## `publications` (type: `array`):

Enter Medium publications by name (swlh), by their own domain (levelup.gitconnected.com) or by link. Every story in the publication, newest first.

## `startUrls` (type: `array`):

Or paste any Medium links, one per line: tag pages (medium.com/tag/python), search pages (medium.com/search?q=ai), profiles (medium.com/@kozyrkov or kozyrkov.medium.com), publications (medium.com/swlh or their own domain) and single articles, including articles on publication and personal domains.

## `maxArticles` (type: `integer`):

Set how many articles to save for each tag, search, author, publication or link. 0 saves all of them.

## `includeText` (type: `boolean`):

Add each article's text as plain text and as markdown (headings, links, lists, code and images kept). For member-only stories only the free preview that anyone can read is included, and textIsPreview is true.

## `includeAuthors` (type: `boolean`):

Also save one row per author found: name, bio, followers, following, avatar, membership and X (Twitter) link. Charged as an author row.

## `includePublications` (type: `boolean`):

Also save one row per publication found: name, description, followers, logo, domain and creator. Charged as a publication row.

## `publishedAfter` (type: `string`):

Keep only articles first published on or after this date. Tags, authors and publications stop reading once they reach older articles, so a daily run reads only what is new.

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

The default works for Medium.

## Actor input object example

```json
{
  "tags": [
    "programming"
  ],
  "maxArticles": 20,
  "includeText": false,
  "includeAuthors": false,
  "includePublications": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `articles` (type: `string`):

No description

## `text` (type: `string`):

No description

## `profiles` (type: `string`):

No description

## `results` (type: `string`):

No description

## `report` (type: `string`):

No description

# 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 = {
    "tags": [
        "programming"
    ],
    "maxArticles": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("automly/medium-scraper").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 = {
    "tags": ["programming"],
    "maxArticles": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("automly/medium-scraper").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 '{
  "tags": [
    "programming"
  ],
  "maxArticles": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call automly/medium-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automly/medium-scraper"
        }
    }
}
```

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/vAGq8cijMOQ7Xt1Ev/builds/8ANyx2wKRhQstzWHH/openapi.json
