Medium Articles Scraper

Scrape public Medium article metadata from RSS feeds by tag, author, publication, or feed URL.

Data fields

FieldTypeDescription
itemTypestringValue exported as itemType.
inputstringValue exported as input.
inputTypestringValue exported as inputType.
feedUrlstring | nullValue exported as feedUrl.
feedTitlestring | nullValue exported as feedTitle.
articleIdstring | nullValue exported as articleId.
guidstring | nullValue exported as guid.
urlstring | nullValue exported as url.

Input preview

startUrlsMedium feed or page URLs
tagsTags
authorsAuthors
publicationsPublications
maxItemsMaximum article rows
maxItemsPerSourceMaximum articles per source

API and agents

This actor can be run through Apify API, datasets, webhooks, schedules, and the official Apify MCP server.

Ready-to-run examples

Open a saved Apify example, adjust the input, and run the actor in your own Apify account.

View all examples

How this actor works

See example inputs, outputs, API usage, and practical limits before running this actor on Apify.

Open Apify page

Collect public Medium article metadata by tag, author, publication, or supported Medium feed URL. The Actor focuses on reliable public metadata and does not require a Medium account.

Use it for content research, AI/RAG dataset preparation, editorial monitoring, trend analysis, and competitive intelligence workflows that need recent public Medium article metadata with predictable CSV, JSON, Excel, API, and webhook exports.

At a glance

  • Primary job: Scrape recent public Medium RSS article metadata and snippets.
  • Input: Medium tags, author handles, publication slugs, or Medium /feed/... URLs.
  • Output: One charged dataset row per article plus free diagnostic rows for unsupported or failed sources.
  • Best for: Content marketers, editorial researchers, AI dataset builders, trend analysts, and monitoring workflows.

Common workflows

  • Topic research: Track recent Medium posts for tags such as artificial-intelligence or data-science.
  • Author monitoring: Collect recent public posts from a Medium creator handle such as @ev.
  • Publication monitoring: Watch a Medium publication feed such as the-generator.
  • AI/RAG datasets: Export public titles, URLs, tags, snippets, dates, and image URLs for downstream enrichment.
  • Automation: Schedule repeat runs, compare datasets over time, or trigger webhooks when new article URLs appear.

Input recipes

  • Small tag smoke test: tags: ["artificial-intelligence"], maxItems: 10.
  • Author monitoring: authors: ["@ev"], maxItems: 10.
  • Publication feed: publications: ["the-generator"], maxItems: 10.
  • Multi-topic comparison: tags: ["artificial-intelligence", "data-science"], maxItemsPerSource: 10, maxItems: 20.
  • Direct feed URL: startUrls: [{ "url": "https://medium.com/feed/tag/data-science" }].

What data can you extract?

Field Description
itemType article for result rows or error for source diagnostics.
input, inputType, feedUrl, feedTitle Source input, normalized type, resolved feed URL, and source title.
articleId, guid, url, canonicalUrl Article identifiers and links derived from the RSS feed.
title, subtitle, authorName, publicationName Public article metadata when exposed by RSS.
publishedAt, updatedAt, rawPublishedAt, rawUpdatedAt Parsed and raw RSS date values.
tags, tagsNormalized RSS categories and normalized tag slugs.
snippetHtml, snippetText, imageUrl Feed description/content fragment, plain text, and first image URL when available.
readingTime, readingTimeMethod Estimated reading time from feed text.
isMemberOnly Best-effort public indicator when detectable; otherwise null.
sourceInputs, scrapedAt, status, errorCode, errorMessage Traceability and diagnostics for partial failures.

Example input

{
  "tags": ["artificial-intelligence"],
  "authors": ["@ev"],
  "publications": ["the-generator"],
  "maxItems": 25,
  "maxItemsPerSource": 10,
  "includeSnippetHtml": true
}

Example output

{
  "itemType": "article",
  "input": "artificial-intelligence",
  "inputType": "tag",
  "feedUrl": "https://medium.com/feed/tag/artificial-intelligence",
  "feedTitle": "Medium - Artificial Intelligence",
  "articleId": "abc123def456",
  "guid": "https://medium.com/p/abc123def456",
  "url": "https://medium.com/example/story-abc123def456",
  "canonicalUrl": "https://medium.com/example/story-abc123def456",
  "title": "Example Medium story",
  "authorName": "Example Author",
  "publicationName": "Medium - Artificial Intelligence",
  "publishedAt": "2026-07-16T08:00:00.000Z",
  "tags": ["Artificial Intelligence"],
  "tagsNormalized": ["artificial-intelligence"],
  "snippetText": "Short public feed snippet...",
  "imageUrl": "https://miro.medium.com/example.png",
  "readingTime": 1,
  "readingTimeMethod": "estimated_from_feed_words",
  "isMemberOnly": null,
  "source": "medium-rss",
  "sourceInputs": ["artificial-intelligence"],
  "scrapedAt": "2026-07-16T10:00:00.000Z",
  "status": "ok",
  "errorCode": null
}

Tips for best results

  • Use feed-shaped inputs: Direct https://medium.com/feed/... URLs are most reliable.
  • Prefer specific sources: Split broad monitoring into focused tag, author, or publication feeds.
  • Start small: Use maxItems: 10 while checking output quality and spend.
  • Expect feed limits: Medium RSS feeds usually expose recent items, not unlimited history.

API usage

Node.js:

import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("fetch_cat/medium-articles-scraper").call({
  tags: ["artificial-intelligence"],
  maxItems: 10
});
console.log(run.defaultDatasetId);

Python:

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/medium-articles-scraper").call(run_input={
    "authors": ["@ev"],
    "maxItems": 10,
})
print(run["defaultDatasetId"])

cURL:

curl -X POST "https://api.apify.com/v2/acts/fetch_cat~medium-articles-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"publications":["the-generator"],"maxItems":10}'

MCP and AI agents

Use this Actor from MCP-compatible tools through the official Apify MCP Server.

claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/medium-articles-scraper"
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=fetch_cat/medium-articles-scraper"
    }
  }
}

Example prompt: "Run Medium Articles Scraper for the artificial-intelligence tag and summarize the latest titles and tags."

Limits and caveats

  • Metadata-first V1: Full article bodies, claps, responses, and native search ranking are not scraped in this version.
  • No account data: The Actor does not use Medium cookies, logins, private drafts, recommendations, stats, or member-only bypasses.
  • Diagnostics: Unsupported direct HTML URLs produce clear diagnostic rows instead of silent empty success.
  • Freshness: RSS feeds expose recent public items and can change between runs.

Legality and responsible use

Process only public data that you are allowed to access. Follow Medium's terms, Apify's terms, and applicable laws.

Support

Open an issue from the Actor page if a run fails or output looks wrong. Include the run ID or run URL, input JSON, expected output, actual output, and one reproducible public URL such as https://medium.com/feed/tag/artificial-intelligence.

Common questions

Questions and answers reused from the canonical actor README.

Can I export results?

Yes. Apify datasets support JSON, CSV, Excel, XML, RSS, and API access.

Why are some fields empty?

Medium RSS feeds do not expose every field for every item. The Actor leaves unavailable fields empty instead of guessing.

Why did I get an error row for a Medium URL?

V1 supports public Medium feeds plus tag, author, and publication inputs. Unsupported direct article/page URLs are reported as diagnostics so runs do not end in silent empty output.