Medium Scraper - articles, authors, tags, search, no login
Pricing
Pay per event
Medium Scraper - articles, authors, tags, search, no login
Scrape public Medium articles by URL, author, tag, publication or search: full text and Markdown, claps, tags, author followers, paywall flag, responses. No login, no browser, $3 per 1,000 articles.
Pricing
Pay per event
Rating
0.0
(0)
Developer
Data Gleaner
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
Share
Medium Scraper: Medium articles by author, tag, publication or search
Medium scraper for public Medium articles: give it article URLs, authors, tags, publications or a search query and get full text, Markdown, claps, tags and author followers as JSON. It also flags member-only stories and can collect the responses (comments) under each article. No Medium account, no cookies, no browser.
It costs $2 per 1,000 articles ($0.002 each). The leading Medium scraper on the Apify Store reads RSS feeds only, so it returns at most 10 items per feed and has no claps, responses, reading time or paywall flag. This Actor pages through Medium's own article data, so you get all of those fields and can go as deep as the cap you set.
What you can do with it
- Content and competitor research. Pull every article a publication or author has posted, ranked by claps, with tags and reading time.
- Trend tracking. Run a tag such as
machine-learningevery day on the newest order and see what is being written about. - Lead and creator lists. Find the authors who write about a topic, with their follower counts and profile links.
- AI and RAG datasets. Article text is delivered both as plain text and as Markdown with headings, links, lists, code blocks and image links preserved.
- Reader sentiment. Turn on responses to collect the comments under an article.
Input
Nothing is required. A run started with empty input scrapes a 5-article example of top articles tagged python.
| Field | Type | What it does |
|---|---|---|
startUrls | list of text | Any Medium URL: article, @profile, publication, tag page, or a custom domain. Each is scraped by what it points at, using the per-source caps below. |
articleUrls | list of text | Article URLs (medium.com, publication subdomains and custom domains all work). Profile, publication and tag URLs placed here are routed to the right source too. |
authors | list of text | @handle, bare handle or profile URL. Newest articles first. |
maxArticlesPerAuthor | number | Cap per author. Default 20. |
tags | list of text | Tags such as python or startup. |
maxArticlesPerTag | number | Cap per tag. Default 20. |
tagSort | choice | newest (default) or top. |
publications | list of text | Publication slug, URL or domain, e.g. better-programming or netflixtechblog.com. |
maxArticlesPerPublication | number | Cap per publication. Default 20. |
searchQuery | text | Keywords to search stories for. |
maxArticlesPerSearch | number | Cap for the search. Default 20. |
maxArticles | number | Optional cap on articles across the whole run, so one number bounds the cost of a mixed input. Empty means no total cap. |
includeContent | true / false | Add contentText and contentMarkdown. Default on. |
includeResponses | true / false | Also return responses (comments) as separate items. Default off. |
maxResponsesPerArticle | number | Cap per article. Default 10. |
requestDelaySeconds | number | Pause between requests, default 0.6 s (randomised up to 1.5x). |
proxyConfiguration | object | Optional Apify Proxy. Default is no proxy. |
{"authors": ["@netflixtechblog", "https://medium.com/@kentcdodds"],"maxArticlesPerAuthor": 15,"tags": ["python", "startup"],"maxArticlesPerTag": 20,"tagSort": "top","includeContent": true,"includeResponses": false}
Articles found more than once in a run (for example in two tags) are returned once. Entries that are not Medium URLs, handles or publications are skipped and named in the run's status message, as are articles that are not found or not public.
Output
One dataset item per article, plus one per response when responses are on. Items are told apart by type. Export as JSON, CSV, Excel or via the API.
| Field | Meaning |
|---|---|
id, url, title, subtitle | Article ID, link, title and the preview subtitle. |
author | id, name, handle, url and followers of the writer. |
publication, publicationSlug, publicationUrl | Name, slug and URL of the publication, or null when the article is not in one. |
publishedAt, updatedAt | ISO 8601 UTC. updatedAt is the last publish of the article. |
readingTimeMinutes, claps, responsesCount | Numbers. |
tags | Tag names. |
isPaywalled | true for member-only stories. |
previewImage | Preview image link. |
contentText, contentMarkdown | Full text (with includeContent). The leading title, subtitle and any kicker line above the title are removed, so the body does not repeat them. |
contentIsPartial, contentNote | For member-only stories: Medium only shows a preview without a subscription. We return that public preview and set contentIsPartial: true. |
sourceType, source | Which input produced the item. |
scrapedAt | UTC time of collection. |
Response items (type: "response"): id, url, articleId, articleUrl, articleTitle, author, publishedAt, claps, repliesCount, contentText, contentMarkdown, sourceType, source, scrapedAt.
{"type": "article","id": "516d5a29b252","url": "https://netflixtechblog.com/trading-a-cloud-identity-for-your-own-workload-attestation-on-managed-compute-516d5a29b252","title": "Trading a Cloud Identity for Your Own: Workload Attestation on Managed Compute","subtitle": "By Dhruv Pratap","author": {"name": "Netflix Technology Blog", "handle": "netflixtechblog", "url": "https://medium.com/@netflixtechblog", "followers": 484146},"publication": "Netflix TechBlog","publishedAt": "2026-09-25T16:01:02+00:00","updatedAt": "2026-09-25T16:01:02+00:00","readingTimeMinutes": 8.1,"claps": 127,"responsesCount": 2,"tags": ["Apache Spark", "Aws Emr", "Security", "Identity", "Cloud"],"isPaywalled": false,"previewImage": "https://miro.medium.com/v2/resize:fit:1400/1*eIWpHw7J_6qZCuaffD0lQQ.png","contentText": "Introduction\n\nOrganizations that have been around for a while ...","contentMarkdown": "### Introduction\n\nOrganizations that have been around for a while ...","contentIsPartial": false,"sourceType": "tag","source": "python","scrapedAt": "2026-10-08T16:22:21+00:00"}
Pricing
Pay per event: $0.002 per article ($2 per 1,000) and $0.0005 per response ($0.50 per 1,000). You pay only for items you receive, nothing for failed requests or retries, and the run stops by itself when your maximum total charge is reached. Platform usage is included.
Worked example: 20 authors at 50 articles each is 1,000 articles, so $2.00. Adding the first 10 responses under each of those articles gives up to 10,000 responses, another $5.00, so $7.00 in total.
Limits
- Member-only stories return the public preview only, flagged by
contentIsPartial. The Actor does not log in and cannot read paywalled text. - Depth of feeds. Author, publication and tag feeds are paged by Medium; very old articles may not be reachable through a tag. For a full archive, use the author or publication feed.
- Search returns Medium's relevance order.
- Fallback. If Medium refuses the main endpoint, the Actor switches to the public RSS feed for authors, tags and medium.com publications (not publications on their own domain). That returns only the 10 newest stories, without claps, response counts or follower counts, and the log says so.
- Medium can change or throttle its public endpoints at any time. The Actor slows down and retries, but a run may return less than requested if Medium limits it. Raise
requestDelaySecondsor enable a proxy if that happens.
Use with Python
# pip install apify-clientimport osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("datagleaner/medium-scraper").call(run_input={"tags": ["machine-learning"], "tagSort": "top", "maxArticlesPerTag": 10})for item in client.dataset(run.default_dataset_id).iterate_items():print(item["title"], item["claps"], item["url"])
Ten articles cost $0.02 at $0.002 each.
Use with JavaScript / Node.js
// npm install apify-clientimport { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('datagleaner/medium-scraper').call({tags: ['machine-learning'],tagSort: 'top',maxArticlesPerTag: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();for (const item of items) console.log(item.title, item.claps, item.url);
Use it from n8n, Make, Zapier or an AI agent
Actor ID: datagleaner/medium-scraper
Minimal input:
{"tags": ["machine-learning"], "tagSort": "top", "maxArticlesPerTag": 10}
Each tool below runs this Actor with your own Apify API token.
-
n8n: add the Apify node (
@apify/n8n-nodes-apify). On n8n Cloud you install it from the community node registry. Choose Run an Actor and get dataset, set Actor todatagleaner/medium-scraperand paste the input above. -
Make: use the Apify app's Run an Actor module, then Get Dataset Items to read the results. Watch Actor Runs can trigger a scenario when a run finishes.
-
Zapier: use the Apify action Run Actor, then the search Fetch dataset items. The trigger Finished Actor run starts a Zap when a run ends.
-
AI agents (MCP): connect to
https://mcp.apify.com?tools=datagleaner/medium-scraper. Without thetoolsparameter, the agent can still find the Actor with thesearch-actorstool and run it withcall-actor. In Claude Code:claude mcp add --transport http apify "https://mcp.apify.com?tools=datagleaner/medium-scraper"Then run
/mcpto sign in to Apify in your browser. Then ask in plain words, for example: "Get the 30 top Medium articles tagged llm and the 20 newest from the netflixtechblog.com publication, then list the authors with the most followers and summarise what the five most-clapped articles are about." -
LangChain (Python):
# pip install langchain-apify, then set APIFY_TOKEN in your environmentimport jsonfrom langchain_apify import ApifyActorsTooltool = ApifyActorsTool("datagleaner/medium-scraper")result = tool.invoke({"run_input": json.loads('{"tags": ["machine-learning"], "tagSort": "top", "maxArticlesPerTag": 10}')})
FAQ
How do I scrape Medium articles? Add article URLs, author handles, tags, publications or a search query to the input and start the Actor. Each article comes back as one JSON item, which you can export as JSON, CSV or Excel, or read through the API.
Is there a Medium API for reading articles? This Actor works as one: call it from the Apify API, the Python or JavaScript client or an MCP client, and get articles with full text, claps, tags and author data as JSON.
Can I scrape Medium articles with Python? Yes. See "Use with Python" above: install apify-client, pass the input, and iterate the dataset.
Does it scrape member-only stories behind the Medium paywall? Only what Medium shows to a logged-out visitor. The Actor does not log in; member-only stories return the public preview with isPaywalled: true and contentIsPartial: true.
Can I get the comments under an article? Yes: turn on includeResponses. Responses arrive as items with type: "response", linked to their article by articleId, at $0.0005 each.
Responsible use
This Actor collects only publicly visible data. Respect Medium's terms and keep the request rate low (the default pacing is deliberately polite). Articles are the authors' copyrighted work: the data is for analysis and research, not a licence to republish it. Author names and handles are personal data: you are responsible for having a lawful basis and meeting your obligations under GDPR, CCPA and any other law that applies to your use, including retention and deletion requests. This is not legal advice.