# Medium Scraper - Articles by Author, Publication & Tag (`geese_chief/medium-articles-scraper`) Actor

Scrape Medium articles from any author, publication, tag or custom-domain blog: title, author, date, tags, image, full text, word count, reading time. Many sources per run, keyword and date filters. $6 per 1,000 articles. No login, no proxy.

- **URL**: https://apify.com/geese_chief/medium-articles-scraper.md
- **Developed by:** [Ponytail Data](https://apify.com/geese_chief) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.20 / 1,000 articles

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

## Medium Scraper - Articles by Author, Publication & Tag

Scrape **Medium articles** from any author, publication, tag or custom-domain Medium blog. Add as many sources as you like and get clean, deduplicated rows with title, author, date, tags, cover image and text, for **$6 per 1,000 articles**.

- **Authors**: `@karpathy`, `https://medium.com/@karpathy` or `https://karpathy.medium.com`. **Full article text**, word count and reading time.
- **Publications**: `towards-data-science`, any `medium.com/<publication>` URL, or a custom-domain Medium blog.
- **Tags**: `artificial-intelligence`, `"machine learning"`. Returns the newest articles under each tag.
- **Filters**: keywords, published in the last N days. You only pay for articles that pass.
- **Fast and cheap**: uses Medium's own public feeds. No login, no proxy, no browser. Runs in seconds.

### Output

```json
{
  "articleId": "a64152b37c35",
  "title": "Software 2.0",
  "url": "https://karpathy.medium.com/software-2-0-a64152b37c35",
  "author": "Andrej Karpathy",
  "publishedAt": "2017-11-11T22:18:53+00:00",
  "updatedAt": "2021-03-13T18:18:43.264Z",
  "tags": ["programming", "software-development", "artificial-intelligence", "future", "machine-learning"],
  "image": "https://cdn-images-1.medium.com/max/1017/1*CHcu2L0NmAZwCpQgmS1ByA.jpeg",
  "excerpt": "I sometimes see people refer to neural networks as just another tool in your machine learning toolbox...",
  "isFullText": true,
  "wordCount": 2127,
  "readingTimeMinutes": 8,
  "text": "I sometimes see people refer to neural networks as ...",
  "source": "@karpathy",
  "feedTitle": "Stories by Andrej Karpathy on Medium"
}
```

Export to JSON, CSV, Excel or Google Sheets, or send it to Make, Zapier or n8n.

### Use cases

- **Content monitoring**: schedule daily runs on tags or competitors' publications with `publishedWithinDays: 1`.
- **Datasets for LLMs and RAG**: full plain-text articles from the authors you choose.
- **Influencer and writer research**: find who publishes most on a topic, and how often.
- **Newsletters and aggregators**: pull the newest articles on any topic into your pipeline.

### Input

```json
{
  "authors": ["@karpathy"],
  "publications": ["towards-data-science"],
  "tags": ["artificial-intelligence", "python"],
  "keywords": ["llm", "agent"],
  "publishedWithinDays": 7,
  "includeContent": true,
  "includeHtml": false
}
```

### Pricing

**$6 per 1,000 articles** ($0.006 per article), only for articles that match your filters. No monthly rental.

### FAQ

**How many articles per source?** Medium's feeds return the latest ~10 articles per author, publication or tag. For ongoing monitoring, schedule the Actor (for example daily) and every new article is captured.

**Why is the text short for tags and publications?** Medium only publishes a teaser in tag and publication feeds (`isFullText: false`). Author feeds include the full article. To get full text, add the article's author to `authors`.

**Member-only (paywalled) articles?** You get the metadata and whatever Medium makes public. Paywalled text isn't included.

# Actor input Schema

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

Medium usernames (@karpathy), profile URLs (https://medium.com/@karpathy) or subdomains (https://karpathy.medium.com).

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

Publication slugs (towards-data-science), Medium publication URLs, or custom-domain Medium blogs.

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

Medium tags, e.g. artificial-intelligence or "machine learning". Returns the latest articles under each tag.

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

Any Medium RSS feed URL, used as-is.

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

Only keep articles whose title, tags or text contain at least one of these words (case-insensitive).

## `publishedWithinDays` (type: `integer`):

Only keep articles published in the last N days. Leave empty for all.

## `includeContent` (type: `boolean`):

Add the plain-text article body (where Medium includes it in the feed).

## `includeHtml` (type: `boolean`):

Add the raw article HTML.

## Actor input object example

```json
{
  "authors": [
    "@karpathy"
  ],
  "publications": [
    "towards-data-science"
  ],
  "tags": [
    "artificial-intelligence"
  ],
  "includeContent": true,
  "includeHtml": false
}
```

# Actor output Schema

## `results` (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 = {
    "authors": [
        "@karpathy"
    ],
    "publications": [
        "towards-data-science"
    ],
    "tags": [
        "artificial-intelligence"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("geese_chief/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 = {
    "authors": ["@karpathy"],
    "publications": ["towards-data-science"],
    "tags": ["artificial-intelligence"],
}

# Run the Actor and wait for it to finish
run = client.actor("geese_chief/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 '{
  "authors": [
    "@karpathy"
  ],
  "publications": [
    "towards-data-science"
  ],
  "tags": [
    "artificial-intelligence"
  ]
}' |
apify call geese_chief/medium-articles-scraper --silent --output-dataset

```

## MCP server setup

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