Medium Articles Scraper
Pricing
from $2.00 / 1,000 articles
Medium Articles Scraper
Scrape Medium articles by tag, author, publication, search query or post URL. Get title, author, publication, claps, responses, reading time, tags and publish dates, plus optional full text of free posts. No login or cookies.
Pricing
from $2.00 / 1,000 articles
Rating
5.0
(1)
Developer
Heba Abdalaziz
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
What does it do?
Medium Articles Scraper collects articles from Medium by tag, author, publication, search query or single article URL. For every article you get the title, subtitle, author, publication, claps, responses, reading time, tags, publish and update dates, and whether it is member-only. Optionally it also downloads the full text of free articles.
It does not bypass Medium's paywall. Member-only articles are returned with their metadata and public preview (subtitle) only, never with full text.
Why use it?
- Content research: find the most-clapped posts on a topic this week, this year or of all time.
- Author and publication monitoring: track what a writer or a publication publishes, and how it performs.
- Datasets for NLP and AI: collect clean full text of free articles with word counts.
- Market and trend analysis: see which tags and topics get the most engagement.
- No login, no browser, no Medium account needed. Fast: about 600 articles in 25 seconds.
How to use it
- Open the Actor and go to the Input tab.
- Add what you want to scrape: paste Medium links into Medium URLs, or type tags, author usernames, publication slugs or search keywords into the matching lists.
- Choose the Tag feed sort (newest, top this week/year/all time, or all of them merged).
- Set Max articles per source and switch on Include full text if you need article bodies.
- Click Start, then download the results as JSON, CSV, Excel or HTML from the Output tab, or read them through the Apify API.
Input
| Field | Type | Default | Description |
|---|---|---|---|
startUrls | array of URLs | [] | Any Medium links: medium.com/tag/python (also /archive, /top/week, /top/year, /top/all-time), medium.com/@name, name.medium.com, medium.com/<publication>, custom publication domains such as levelup.gitconnected.com, medium.com/search?q=..., and single article URLs. Use full links starting with https://. |
tags | array of strings | [] (prefill ["python"]) | Tag slugs or names, e.g. python, machine-learning, Data Science (spaces, _ and . become -). Tag links also work, with or without https://. |
authors | array of strings | [] | Usernames, with or without @ (e.g. karpathy, @sumit.ai). Profile links also work here, with or without https://. |
publications | array of strings | [] | Publication slugs (data-science), <name>.medium.com subdomains or custom domains (levelup.gitconnected.com), with or without https://. |
searchQueries | array of strings | [] | Keywords, like Medium's search box. |
tagFeedMode | string | NEW | NEW, TOP_WEEK, TOP_YEAR, TOP_ALL_TIME, or ALL (top week, top year, top all time, then newest; duplicates removed). A mode in a pasted tag URL wins. |
maxArticlesPerSource | integer | 100 (prefill 10) | Maximum articles saved per tag, author, publication, search or URL. |
includeFullText | boolean | false | Add fullText and wordCount for free (non-member-only) articles. |
At least one source (URL, tag, author, publication or search query) is required.
{"startUrls": [{ "url": "https://medium.com/tag/machine-learning/top/year" },{ "url": "https://karpathy.medium.com/" }],"tags": ["python"],"publications": ["levelup.gitconnected.com"],"searchQueries": ["rust async"],"tagFeedMode": "NEW","maxArticlesPerSource": 100,"includeFullText": true}
Output
One row per article. Real rows from a run (full text shortened here):
[{"id": "5b515c9e4cca","url": "https://www.towardsdeeplearning.com/a-single-claude-md-file-went-viral-the-reason-is-embarrassingly-simple-5b515c9e4cca","title": "A Single CLAUDE.md File Went Viral. The Reason Is Embarrassingly Simple.","subtitle": "91,000 stars on GitHub. No code. Four rules from Andrej Karpathy that every coding agent should have been following from day one.","authorName": "Sumit Pandey","authorUsername": "sumit.ai","authorId": "73d7984df4b2","publicationName": "Towards Deep Learning","publicationSlug": "towards-deep-learning","claps": 7285,"responses": 120,"readingTimeMinutes": 4.35,"tags": ["artificial-intelligence", "deep-learning", "ai", "machine-learning", "claude-code"],"publishedAt": "2026-05-08T08:32:29Z","updatedAt": "2026-05-08T08:32:29Z","isMemberOnly": true,"source": "https://medium.com/tag/machine-learning/top/year","sourceType": "tag","scrapedAt": "2026-10-10T11:46:06Z"},{"id": "a64152b37c35","url": "https://karpathy.medium.com/software-2-0-a64152b37c35","title": "Software 2.0","subtitle": "I sometimes see people refer to neural networks as just “another tool in your machine learning toolbox”. They have some pros and cons, they…","authorName": "Andrej Karpathy","authorUsername": "karpathy","authorId": "ac9d9a35533e","publicationName": null,"publicationSlug": null,"claps": 61029,"responses": 194,"readingTimeMinutes": 8.8,"tags": ["machine-learning", "artificial-intelligence", "programming", "software-development", "future"],"publishedAt": "2017-11-11T22:18:53Z","updatedAt": "2021-03-13T18:18:43Z","isMemberOnly": false,"source": "https://karpathy.medium.com/","sourceType": "author","scrapedAt": "2026-10-10T11:46:05Z","fullText": "I sometimes see people refer to neural networks as just “another tool in your machine learning toolbox”. They have some pros and cons, they work here or there, …","wordCount": 2127}]
Inputs that returned nothing (unknown tag, author or publication, empty search, unsupported URL) or failed are listed with a reason in the FAILED_INPUTS record of the run's key-value store.
Data fields
| Field | Type | Description |
|---|---|---|
id | string | Medium post id |
url | string | Article URL |
title | string | Title |
subtitle | string | Subtitle or public preview text |
authorName | string | Author display name |
authorUsername | string | Author username |
authorId | string | Author user id |
publicationName | string or null | Publication name (null for self-published posts) |
publicationSlug | string or null | Publication slug |
claps | integer | Total claps |
responses | integer | Number of responses (comments) |
readingTimeMinutes | number | Medium's reading time estimate |
tags | array of strings | Tag slugs |
publishedAt | string | First publish time, ISO 8601 UTC |
updatedAt | string | Latest publish/update time, ISO 8601 UTC |
isMemberOnly | boolean | true for member-only (paywalled) articles |
source | string | The input this row came from |
sourceType | string | tag, author, publication, search or post |
fullText | string | Article body, paragraphs separated by blank lines. Only with includeFullText, only for free articles |
wordCount | integer | Number of words in fullText (present with fullText) |
scrapedAt | string | Scrape time, ISO 8601 UTC |
How much does it cost?
This Actor is pay-per-result:
| Event | Planned price |
|---|---|
| Article saved to the dataset | $0.002 per article ($2 per 1,000) |
Full text downloaded (only with includeFullText, only free articles) | $0.002 per article ($2 per 1,000) |
Examples: 1,000 articles without full text cost about $2. 1,000 articles with full text, of which 400 are free, cost about $2 + $0.80 = $2.80. Member-only articles never incur the full-text charge. Nothing is charged for inputs that return no articles, and duplicate articles (for example the same post found by two tags) are saved and charged only once.
You can cap your spend with the Maximum cost per run run option; the Actor stops cleanly when the limit is reached.
Tips
- Top lists are short. Medium shows about 100 articles per top list (week, year, all time).
ALLreads the three top lists first and then the newest feed, removing duplicates, untilmaxArticlesPerSourcearticles are saved for the tag. - The newest feed goes deep.
NEWkeeps paging back in time, so setmaxArticlesPerSourceto the number you need. - Custom domains work. Paste the publication's own domain (e.g.
levelup.gitconnected.com) or any article URL on it. - Subdomains like
name.medium.comare tried as an author first, then as a publication. - Keep full text off when you only need titles and engagement numbers: runs are faster and cheaper.
FAQ
Can it get the full text of member-only articles?
No. The Actor never bypasses Medium's paywall. Member-only articles return metadata plus the public preview (subtitle) and isMemberOnly: true.
Why did my author or tag return nothing?
Check the spelling. Unknown authors, tags and publications are listed in FAILED_INPUTS with the reason, and the run still succeeds. The run only fails when Medium could not be reached for any input.
Does it need a Medium account or cookies? No. It reads public data only.
Is it legal to scrape Medium? The Actor collects only publicly available article data. Scraping public data is generally lawful, but you are responsible for how you use it: respect Medium's Terms of Service, copyright on article texts (do not republish full texts without permission) and applicable laws.
Does the output contain personal data? Rows include authors' public names and usernames as published on Medium. If you process this data, make sure you have a legitimate purpose and comply with privacy laws such as the GDPR.
Support
Found a bug or need another field or input type? Open an issue in the Issues tab of this Actor and we will look into it.