Medium Scraper — Articles, Authors, Tags & Search avatar

Medium Scraper — Articles, Authors, Tags & Search

Pricing

Pay per event

Go to Apify Store
Medium Scraper — Articles, Authors, Tags & Search

Medium Scraper — Articles, Authors, Tags & Search

Scrape Medium articles by tag, keyword, author, publication or link: claps, responses, reading time, tags and author. Full text, comments and profiles as options. Walk any tag by date. No login. Export JSON, CSV, Excel.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Nice Dev

Nice Dev

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

📰 What is Medium Scraper?

Medium Scraper extracts articles from Medium: title, author, publication, claps, responses, reading time, tags, publication date and, as an option, the full text in markdown. It also lists authors, publications and tags (from a search, a followers list or a profile) and the responses of each article. It works as a Medium API alternative: run it on a schedule, call it from your code, or plug it into Make, Zapier or n8n.

Type a tag (python), a keyword, an author or a publication, or paste any Medium link, click Start, and download the results in JSON, CSV or Excel. No login, nothing to set up, and it is fast: about 100 articles in 6 seconds.

📋 What data can you extract from Medium?

One row per article, response, author, publication or tag (the type column says which), 93 fields:

CategoryWhat you get
📰 Articletitle, subtitle, link, preview image, tags, topics, language — 10 MCP Servers That Do Things I Didn't Know MCP Could Do
👏 Engagementclaps, people who clapped, responses, claps per 1,000 followers, the most highlighted passage, up to 25 clappers
✍️ Authorname, username, followers, bio, X handle, membership — Arham Ali, 263 followers
🗞️ Publicationname, link, followers, own domain, editors
🕒 Datesfirst publication, last update, "fresh" flag (less than 48 hours old) — what the date filters read
📝 Full text (option)the article as markdown, plain text or HTML, its headings, links, images and code languages
💬 Responses (option)each comment as a row: text, claps, author, date
📊 Author and publication profiles (option)last story date, stories in the last 30 / 90 days, median claps and responses, best story, top tags, share of member-only stories
📇 Bio contacts (option)e-mail addresses and phone numbers written in an author's bio or a publication's description

Every field, with an example, is listed in the Output section below.

✅ Why use Medium Scraper?

  • 🚀 Fast: about 100 articles in 6 seconds, with their claps, responses and author.
  • 🧭 Every way into Medium in one Actor: tags, keywords, authors, publications, followers, article links, or any Medium link pasted as it is. Mix them in one run.
  • 📅 Any tag, any month: walk a tag's archive back to 2000, jump straight to the months you ask for, or take Medium's own rankings (most read of each month, hot, top of the week / month / year / all time).
  • 👥 People and publications too: search authors, publications or tags by keyword, or list the followers of an author and the accounts they follow.
  • 🔔 Monitoring built in: tick New articles only, schedule the Actor, and each run returns (and charges) only the articles it has never delivered before.
  • 🧩 Pay for what you use: the full text, responses, profiles, comparisons and contacts are options, off by default.
  • 🔌 API, scheduling, monitoring, integrations (Make, Zapier, n8n, Google Sheets…), proxy rotation and JSON/CSV/Excel export via the Apify platform.

🚀 How to scrape Medium

  1. Create a free Apify account.
  2. Open Medium Scraper and type one or more Tags (e.g. artificial-intelligence), a Search keyword, Authors or Publications.
  3. Or paste any Medium links into Medium links: a tag page, a search, a profile, a publication or a single article.
  4. Set Max results (total) (100 by default, 0 = no limit) — and Max results per source when you give several sources — then click Start.
  5. Download the dataset in JSON, CSV, Excel or via API.

💰 How much does it cost to scrape Medium?

This Actor uses pay per event pricing: a price per result saved (an article, or an author, publication or tag row of a search or a followers list), plus a small fee per run start. The full text, responses, author and publication profiles, the comparison with the author's usual claps and the bio contacts are options, off by default, each charged by its own event: leave them unticked to pay for the articles alone. See the Pricing tab for every amount. Articles that a filter drops are not saved and not charged. Platform usage (compute, proxy) is included in the price.

⚙️ Input

{
"tags": ["artificial-intelligence"],
"maxItems": 200
}

A tag month by month, most read first, only recent articles, only the ones not delivered before:

{
"tags": ["python", "data-science"],
"tagSort": "mostRead",
"postedAfter": "2026-01-01",
"maxItemsPerQuery": 100,
"onlyNew": true,
"stateKey": "python-monthly"
}

Authors, publications and a search of people, with the full text and author profiles:

{
"authors": ["karpathy"],
"publications": ["netflix-techblog"],
"query": "web scraping",
"searchType": "people",
"includeContent": true,
"includeAuthorProfiles": true,
"maxItems": 300
}

Or with your own links:

{
"startUrls": [
{ "url": "https://medium.com/tag/python/archive/2024/03" },
{ "url": "https://medium.com/@karpathy" },
{ "url": "https://medium.com/p/a64152b37c35" }
],
"maxItems": 500
}
FieldNotes
startUrlsAny Medium link: a tag (https://medium.com/tag/python), a search (https://medium.com/search?q=rust), a profile (https://medium.com/@karpathy; the followers and following pages of a profile list the people, like the fields below), a publication (https://medium.com/netflix-techblog) or an article. An archive link of a tag or a publication (a year, a month or a day: https://medium.com/tag/python/archive/2024/03, https://medium.com/netflix-techblog/archive/2024/06/19) reads only the stories published in that period, crossed with postedAfter / postedBefore (nothing in common: no request, one warning). A date that does not exist (a 13th month, a 31st of April) is refused at input.
query, searchQueriesKeywords searched on Medium (web scraping); searchQueries adds more, one search each. Medium gives up to about 1,000 results per keyword.
searchTypeWhat the keywords look for: articles, people (author rows), publications or tags.
tagsTag slugs or names (python, data-science, Machine Learning). C++, C#, .NET and F# are read as the tags cpp, csharp, dotnet and fsharp.
tagSortlatest (the whole archive, newest first), mostRead (the most read of each month, 20 per month), or Medium's rankings hot, topWeek, topMonth, topYear, topAllTime (about 100 per tag).
authorsUsernames (karpathy, @karpathy) or profile links: all their stories, newest first.
publicationsPublication slugs (netflix-techblog) or own domains (levelup.gitconnected.com): their whole archive, newest first.
followersOf, followingOfUsernames (karpathy): one author row per follower, or per account they follow.
articleUrlsDirect article links (https://medium.com/p/a64152b37c35): one row per article.
maxItems, maxItemsPerQuery, maxFollowersPerUserResults for the whole run (0 = unlimited), per source (tag, keyword, author, publication, link), and per user of a followers list. Responses and the profile rows of the options are not counted in maxItems.
includeContent, includeHtmlPaid option: the full text as markdown and plain text (and HTML), with its headings, links and images. Member-only stories give Medium's public preview only, not charged as text.
includeResponses, maxResponsesPerArticlePaid option: the responses of each article as rows of their own, up to 25 per article by default.
includeAuthorProfiles, includePublicationProfilesPaid options: one profile row per author / publication found, with the figures of their latest 25 stories.
compareWithAuthorPaid option: the author's median claps and how each article compares to it.
includeBioContactsPaid option: e-mails and phone numbers written in a bio or a description, charged only when one is found.
postedAfter, postedBeforePublication date range: 2026-09-01, or a period before now (7 days, 2 weeks, 1 month, 24 hours).
excludeKeywordsDrop the rows whose title, subtitle or tags contain one of these words (crypto), case ignored: articles, and also author, publication and tag rows (their name, and a publication's tags). Responses are never dropped by it.
minClaps, minFollowersKeep articles with at least this many claps, and author / publication / tag rows with at least this many followers.
memberOnlyall, free (open stories only) or memberOnly (paywalled stories only).
languageLanguage as detected by Medium: a two-letter code (en, es, fr) also keeps its variants (zh keeps zh-hant); a code with a script (zh-hant) keeps exactly that one.
onlyNew, stateKey, resetStateMonitoring: only the articles never delivered under this memory key (python-daily); resetState forgets the memory.
AdvancedproxyConfiguration (Apify proxy by default, included in the price; the residential proxy is not available), maxConcurrency, maxRequestsPerMinute, minRequestIntervalMs, maxRequestRetries, debugLog.

📦 Output

One article row from a real run (shortened: the empty columns and the options are left out):

{
"type": "article",
"id": "c778df176349",
"url": "https://python.plainenglish.io/10-mcp-servers-that-do-things-i-didnt-know-mcp-could-do-c778df176349",
"title": "10 MCP Servers That Do Things I Didn’t Know MCP Could Do",
"subtitle": "I found some MCP servers that can give AI agents surprisingly powerful new abilities.",
"authorName": "Arham Ali",
"authorUsername": "iarhamali2005",
"authorUrl": "https://medium.com/@iarhamali2005",
"authorFollowers": 263,
"publicationName": "Python in Plain English",
"publicationUrl": "https://python.plainenglish.io",
"publishedAt": "2026-10-06T05:46:51.514Z",
"claps": 444,
"clappers": 113,
"clapsPerClapper": 3.93,
"responses": 11,
"readingTimeMinutes": 5.81,
"wordCount": 1487,
"isMemberOnly": true,
"language": "en",
"tags": ["programming", "artificial-intelligence", "mcp-server", "python", "data-science"],
"imageUrl": "https://miro.medium.com/v2/resize:fit:1400/1*65ekls5irty-vnYA601vAw.jpeg",
"clapsPer1kFollowers": 1688.21,
"isFresh": false,
"topClappers": ["szabolcshetey", "dascha958", "ai-coding"],
"source": "tag:python",
"rank": 1,
"scrapedAt": "2026-10-21T15:25:14.596Z"
}

You can download the dataset in various formats such as JSON, HTML, CSV or Excel.

All 93 fields

FieldsWhat you get
type, id, urlarticle, response, author, publication or tag; the Medium id (a tag's slug); its page on Medium
title, subtitlethe article's title as its page shows it (whole, even when Medium's API cuts a long one at 100 characters) and subtitle = the card extract Medium shows in lists (about 140 characters, ending with … when Medium shortens it); the name of an author, publication or tag
authorName, authorUsername, authorId, authorUrl, authorFollowers, authorBio, authorTwitter, authorIsMember, authorImageUrlAuthor of an article or response: Arham Ali, iarhamali2005, 263 followers, bio, X handle, Medium member or not, photo
publicationName, publicationSlug, publicationId, publicationUrl, publicationFollowers, publicationDomainPublication the article is in (null for a personal story): Python in Plain English, its followers and own domain
publishedAt, updatedAt, isFreshDates: first publication and last update (ISO 8601 UTC); isFresh = less than 48 hours old, claps still coming in
claps, clappers, clapsPerClapper, responses, clapsPer1kFollowersEngagement: 444 claps by 113 people (3.93 each), 11 responses, claps per 1,000 author followers
highlight, topClappers, allowResponsesthe passage readers highlighted most, up to 25 usernames of people who clapped, responses open or closed
readingTimeMinutes, wordCount, isMemberOnly, language, tags, topics5.81 minutes, 1487 words, paywalled or not, en, tag slugs, Medium topics
imageUrl, imageAlt, canonicalUrl, isSeries, license, isShortform, isPinned, isLimitedState, seoTitle, seoDescriptionpreview image and its text, original URL when first published elsewhere, series, license, short-form, pinned on the profile, Medium's limited-distribution flag, search-engine title and description
markdown, text, html, contentIsPreviewFull text (option): markdown, plain text, simple HTML; contentIsPreview = Medium only shows the member-only preview
links, images, codeLanguages, headings, paragraphCount, imageCount, codeBlockCountlinks and images of the text, languages of its code blocks, its section headings, and counts (with the full text)
authorMedianClaps, vsAuthorMedianComparison (option): the author's median claps over their latest 25 stories, and this article's claps against it (2.4 = 2.4×)
inResponseToId, rootArticleIdResponse rows: the article or response answered, and the article of the thread
followers, following, bio, websites, customDomainAuthor / publication / tag rows: followers, people followed, bio or description, links written in it, own domain
membershipTier, isBookAuthor, hasNewsletter, memberSince, pronouns, isSuspended, followingPublicationsAuthor rows: membership (MEMBER, FRIEND), book author, newsletter, member since, pronouns, suspended account, publications followed
lastPostAt, postsLast30Days, postsLast90Days, medianClaps, medianResponses, topTags, bestPostTitle, bestPostUrl, bestPostClaps, memberOnlyShareProfiles (option): newest story, stories in the last 30 / 90 days, median claps and responses, most used tags, best story of the latest 25, share of member-only stories
editors, topAuthorsPublication rows: editors, most frequent authors of the latest 25 stories
postCount, relatedTagsTag rows: stories published under the tag, tags Medium shows as related
emails, phonesBio contacts (option): e-mail addresses and phone numbers written in a bio or description
source, rank, scrapedAtwhere the row comes from (tag:python, tag:python:2024-03 for a month link, search:web scraping, author:karpathy, publication:netflix-techblog, followers:karpathy), its position in that source (1 = first), ISO timestamp of the run

💡 Tips

How to get more results

Set maxItems to 0. A tag read with latest goes back through its whole archive; with postedAfter / postedBefore the Actor jumps straight to those months. Medium's rankings (hot, topWeek…) stop at about 100 articles per tag and a search at about 1,000 per keyword: to go further, add more tags or keywords, or walk a tag month by month with mostRead.

How to reduce costs

The price is per result, so the levers are maxItems, maxItemsPerQuery, the filters (a filtered-out article is not charged) and onlyNew for recurring runs (you never pay twice for the same article). Each option is charged on its own: tick only the ones you need.

Several sources in one run

Tags, keywords, authors, publications, followers lists and links can all be given at once: each is a source of its own. An article found by several sources is saved — and charged — once. Set maxItemsPerQuery to give every source its own cap: without it the first sources can use up the whole maxItems budget. The same tag given twice, in tags and as a link, is one source. A tag with an archive link (…/tag/python/archive/2024/03) is a source of its own, next to the whole tag and with its own cap; the rows say which in the source column (tag:python:2024-03).

Monitoring: only the new articles

Tick New articles only (onlyNew) and schedule the Actor. The first run returns everything; each later run skips the articles already delivered: they are not saved and not charged. The memory lives in a named key-value store of your account (medium-articles-scraper-seen, up to 150,000 articles per key) and is only updated with articles that really reached the dataset, so a failed run never hides anything. Give each schedule its own stateKey (two schedules sharing a key would hide each other's articles), and tick resetState once to start over. A tag read with latest, an author and a publication are read newest first and stop once they meet a long run of articles you already have.

Filter by publication date

postedAfter and postedBefore take a date (2026-09-01, the whole day is included, UTC, for both: with postedBefore the articles of 1 September are kept) or a period before now (7 days, 2 weeks, 1 month; via the API also 24 hours or a full ISO date-time). The filter reads publishedAt; an article without a publication date is dropped as soon as a date bound is set. Filtered-out articles are not saved and do not count in maxItems; the run summary tells how many were filtered. A tag read with latest jumps to the months asked, and an author's or a publication's archive stops at the first page that is entirely too old.

🔌 Integrations and API

Call the Actor via the Apify API, the JavaScript or Python clients, or connect it with integrations and webhooks (Make, Zapier, n8n, Google Sheets, Slack, Airtable…). The dataset can be fetched as JSON or CSV from any tool.

🤖 Use with AI agents (MCP)

AI agents (Claude, ChatGPT, Cursor…) can find and run this Actor through the Apify MCP server, billed to their Apify account like any run. It returns one row per Medium article (or author, publication, tag, response). Actor id: nice_dev/medium-articles-scraper; MCP server with this Actor only: https://mcp.apify.com/?tools=fetch-actor-details,nice_dev/medium-articles-scraper.

Smallest input, for a cheap first call:

{
"tags": ["python"],
"maxItems": 10
}

Key output fields: url, title, authorName, publicationName, publishedAt, claps, responses, tags, and markdown (with includeContent).

Cost: a price per result plus a small fee per run start, options apart, see the pricing section above. Cap each call with maxItems and, through the API, with the run option maxTotalChargeUsd.

❓ FAQ

The Actor only reads what Medium shows publicly to any anonymous visitor. It logs in to nothing, and the paywall is never passed: a member-only story gives its public preview only. Results can contain personal data (names, bios, links and contacts that authors publish themselves), which is protected by GDPR: do not store it without a legitimate reason. You are responsible for using the data in compliance with Medium's Terms of Service and applicable law. This Actor is not affiliated with Medium.

Does it need a login or a proxy?

No login. The proxy is included in the price: leave the default setting (the residential proxy is not available). A request the site turns away is tried again on a new proxy session, up to 5 times (Max request retries), after a pause of 5 seconds, doubled at each retry up to 20 seconds.

Can I get the full text of member-only stories?

No. For a member-only story Medium shows anonymous visitors a preview only: with Include article text, that preview is what you get, contentIsPreview is true, and the text option is not charged for it. Open stories come in full.

Is the data safe to open in Excel or to show on a web page?

Titles, texts, bios and responses are the authors' own words, copied as they are. A text can begin with -, +, = or @ (a list, a handle, a title such as +10 tips): Excel and Google Sheets may read such a cell of a CSV file as a formula or as a number. The Actor leaves the text as it is, so that the JSON and the API give the real value: when you open a CSV, import these columns as text. The html column is built by the Actor from the article's paragraphs; on a web page, escape every field like any text written by a stranger.

Known limitations

  • Medium's rankings (hot, topWeek, topMonth, topYear, topAllTime) give about 100 articles per tag, mostRead 20 per month, and a search about 1,000 results per keyword.
  • topClappers holds at most 25 people: Medium shows no more.
  • The figures of the profile rows (median claps, stories in the last 30 / 90 days, best story, top tags) are computed on the author's or publication's latest 25 stories.
  • onlyNew remembers article ids, not their content: an article whose claps changed is not returned again.
  • Two runs sharing the same stateKey at the same time may both return the same new article.

A run that reaches its timeout stops itself about 45 seconds before it: no new page is asked, what it read is saved and, with onlyNew, remembered, and the run ends Succeeded with "Stopped before the run's timeout". Resurrect it to go on from there, or give the next run a longer timeout (Run options).

A run the platform stops without warning (out of memory)

  • Resurrect it: it goes on from where it stood at most a minute before the stop. What it had read since is read again, and the rows already saved are skipped: none is delivered or charged twice, and maxItems still counts them.
  • With onlyNew, the memory is saved after each write (at most once every 2 seconds): resurrect the stopped run and the articles it had saved meanwhile join the memory; leave it stopped for good, and the next run may return the articles of its last 2 seconds once more.

Something doesn't work?

The last line of the log counts the results saved, filtered out and no longer on Medium (a tag, author or article that does not exist), and the requests that failed after every retry. Those requests and the missing pages are listed, with the reason, in the FAILED_REQUESTS record of the run's key-value store. A run that saved nothing and had failed requests fails, and its last message gives the cause.

If Medium changes, you are told instead of paying for blank rows. If the first 20 articles read all lack their title or publication date, the run saves nothing more, stops and fails, and its last message names the missing field: at most those first articles are charged. An article that postedAfter / postedBefore drops because it has no date at all counts among those 20. A run of fewer articles (a scheduled onlyNew run that finds a few new ones, a small Max results (total)) is checked at its end, from 5 articles: its articles are already saved, and the run fails with the missing field instead of ending green.

🛟 Support

Open an issue in the Issues tab with a link to your run: the run log and the FAILED_REQUESTS record of the key-value store show exactly which URLs failed and why.