# Medium Articles Scraper - Medium Posts by Tag & Author (`martin10291/medium-articles-scraper`) Actor

Get the latest Medium articles for any tag, author or publication: title, URL, author, publish date, tags, snippet, cover image, full text and reading time. Keyword and date filters, only-new mode for topic and competitor monitoring. Official public RSS feeds, no login, no API key.

- **URL**: https://apify.com/martin10291/medium-articles-scraper.md
- **Developed by:** [Martin Petrov](https://apify.com/martin10291) (community)
- **Categories:** Social media, Lead generation, AI
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.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.

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 Articles Scraper - Tags, Authors & Publications

Get the **latest Medium articles** for any **tag, author or publication** in one clean table: title, URL, author and username, publish date, tags, snippet, cover image, **full text** and **reading time**. Filter by keywords and date, and turn on **only-new mode** to monitor topics, writers or competitors every day.

The actor reads only Medium's **official public RSS feeds**: no login, no API key, no browser, no blocking. Fast, cheap and stable.

### What you get

- **Article**: title, URL, article ID, publish date, tags, snippet, cover image.
- **Author**: name and Medium username.
- **Full text** (optional) and **word count / reading time** when the feed includes the full article (author and publication feeds usually do).
- **Source**: which tag, author or publication feed the article came from.
- **Only-new mode**: each article is returned and paid for once - perfect for daily alerts.

### Use cases

- **Content marketing and SEO**: track what is published in your niche and find trending angles.
- **Guest posts and outreach**: find active writers in a topic.
- **Competitor and brand monitoring**: follow competitors' Medium blogs and publications.
- **AI and data projects**: fresh articles and full text for RAG, summaries and newsletters.
- **Newsletters and curation**: collect the best new posts for a topic every morning.

### How to use it (step by step)

1. Click **Try for free** (or **Start**).
2. Add **Tags** (e.g. `artificial-intelligence`, `marketing`, `python`), **Authors** (`@username`) and/or **Publications** (`towards-data-science`).
3. Optional: add **Keywords**, **Published within (days)** and turn on **Include full article text**.
4. Click **Start** and download the results as **Excel, CSV, JSON or HTML**, or send them to Google Sheets.

### Daily monitoring (Slack, email, Google Sheets)

1. Turn on **Only new articles since last run** and set a **Monitor ID**, e.g. `ai-news`.
2. Create a **Schedule** in Apify Console (e.g. every 3 hours).
3. Add an integration: **Slack, email, Google Sheets, Zapier, Make or a webhook**.

### Input

| Field | Type | Description |
|---|---|---|
| `tags` | array | Medium tags (latest articles of each tag). |
| `authors` | array | `@username`, `medium.com/@username` or `username.medium.com`. |
| `publications` | array | Publication names or URLs. |
| `feedUrls` | array | Any other Medium RSS URL. |
| `keywords` | array | Keep only matching articles. |
| `postedWithinDays` | integer | Only articles from the last N days (0 = any). |
| `includeFullText` | boolean | Add the full plain text when available. |
| `onlyNewArticles` | boolean | Only articles not seen in earlier runs. |
| `monitorId` | string | Separate memory for different watch lists. |
| `maxItems` | integer | Hard limit on articles saved (and paid for). |

#### Example input

```json
{
  "tags": ["artificial-intelligence", "startup", "marketing"],
  "authors": ["@example-writer"],
  "publications": ["towards-data-science"],
  "keywords": ["agent", "growth"],
  "includeFullText": true,
  "maxItems": 100
}
```

### Output

```json
{
  "articleId": "7951fb64b97e",
  "title": "AI Built My Prototype in Days. Making It a Real App Took 211 Pull Requests",
  "url": "https://example.medium.com/ai-built-my-prototype-7951fb64b97e",
  "author": "Example Writer",
  "authorHandle": "example",
  "publishedAt": "2026-10-31T22:10:00Z",
  "tags": ["ai", "flutter", "software-development", "startup"],
  "snippet": "How a 20-year developer turned a tiresome chore into a real app...",
  "imageUrl": "https://cdn-images-1.medium.com/max/2600/example.png",
  "hasFullText": false,
  "sourceType": "tag",
  "sourceTitle": "Startup on Medium"
}
```

*Values above are illustrative.*

### Use it from your code (API)

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("martin10291/medium-articles-scraper").call(run_input={
    "tags": ["artificial-intelligence"],
    "onlyNewArticles": True,
    "monitorId": "ai",
})
for a in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(a["publishedAt"], a["author"], a["title"], a["url"])
```

### Pricing

**$1.00 per 1,000 articles**, no start fee: cheaper than other Medium scrapers. Articles removed by your filters are free and **Max articles** caps the cost of every run.

### FAQ

**How many articles per tag?**
Medium's RSS feed returns the latest ~10 articles per tag, author or publication. Add more tags, authors and publications for more results, and use only-new mode on a schedule to build a complete archive over time.

**Is this allowed?**
The actor only reads the public RSS feeds Medium publishes for readers and apps. It does not log in or bypass anything. Respect the authors' copyright: link to the original and don't republish full articles.

**Can I get member-only articles?**
No. Only what Medium publishes in its public feeds.

### More Actors by Martin Petrov

- **[YouTube Transcript Bulk Extractor](https://apify.com/martin10291/youtube-transcript-bulk-extractor)**: Transcripts of many YouTube videos at once.
- **[Apple Podcasts Scraper](https://apify.com/martin10291/apple-podcasts-scraper)**: Podcasts, charts, episodes and contacts.
- **[Google Trends Explorer](https://apify.com/martin10291/google-trends-explorer)**: Interest over time, regions and related queries.
- **[Reddit Posts & Comments Extractor](https://apify.com/martin10291/reddit-posts-comments-extractor)**: Posts and full comment threads from any subreddit.

*Last updated: November 1, 2026.*

# Actor input Schema

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

Medium tags, e.g. artificial-intelligence, startup, marketing, python, crypto. Each tag returns its latest articles.

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

Medium usernames (@name) or profile URLs (medium.com/@name or name.medium.com). Returns their latest articles with full text.

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

Publication names or URLs, e.g. towards-data-science, better-programming, or a custom domain publication URL.

## `feedUrls` (type: `array`):

Any other Medium RSS feed URL.

## `keywords` (type: `array`):

Keep only articles whose title, snippet, tags or text contain any of these words. Empty = keep all.

## `postedWithinDays` (type: `integer`):

Only articles from the last N days. 0 = any date.

## `includeFullText` (type: `boolean`):

Adds the full plain text when the feed provides it (author and publication feeds usually do).

## `onlyNewArticles` (type: `boolean`):

For monitoring: each article is returned (and paid for) only once.

## `monitorId` (type: `string`):

Separate memory for different watch lists (used with only-new mode).

## `maxItems` (type: `integer`):

Hard limit on articles saved (and paid for).

## Actor input object example

```json
{
  "tags": [
    "artificial-intelligence",
    "startup"
  ],
  "authors": [],
  "publications": [],
  "feedUrls": [],
  "keywords": [],
  "postedWithinDays": 0,
  "includeFullText": false,
  "onlyNewArticles": false,
  "monitorId": "default",
  "maxItems": 100
}
```

# Actor output Schema

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

Medium articles.

# 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": [
        "artificial-intelligence",
        "startup"
    ],
    "authors": [],
    "publications": [],
    "feedUrls": [],
    "keywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("martin10291/medium-articles-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": [
        "artificial-intelligence",
        "startup",
    ],
    "authors": [],
    "publications": [],
    "feedUrls": [],
    "keywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("martin10291/medium-articles-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": [
    "artificial-intelligence",
    "startup"
  ],
  "authors": [],
  "publications": [],
  "feedUrls": [],
  "keywords": []
}' |
apify call martin10291/medium-articles-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,martin10291/medium-articles-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/iCqLbrTgBd3RRzAKx/builds/sbC2AzFXnjSN2CNqx/openapi.json
