Medium Scraper - articles, authors, tags, search, no login avatar

Medium Scraper - articles, authors, tags, search, no login

Pricing

Pay per event

Go to Apify Store
Medium Scraper - articles, authors, tags, search, no login

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

Data Gleaner

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

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-learning every 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.

FieldTypeWhat it does
startUrlslist of textAny 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.
articleUrlslist of textArticle URLs (medium.com, publication subdomains and custom domains all work). Profile, publication and tag URLs placed here are routed to the right source too.
authorslist of text@handle, bare handle or profile URL. Newest articles first.
maxArticlesPerAuthornumberCap per author. Default 20.
tagslist of textTags such as python or startup.
maxArticlesPerTagnumberCap per tag. Default 20.
tagSortchoicenewest (default) or top.
publicationslist of textPublication slug, URL or domain, e.g. better-programming or netflixtechblog.com.
maxArticlesPerPublicationnumberCap per publication. Default 20.
searchQuerytextKeywords to search stories for.
maxArticlesPerSearchnumberCap for the search. Default 20.
maxArticlesnumberOptional cap on articles across the whole run, so one number bounds the cost of a mixed input. Empty means no total cap.
includeContenttrue / falseAdd contentText and contentMarkdown. Default on.
includeResponsestrue / falseAlso return responses (comments) as separate items. Default off.
maxResponsesPerArticlenumberCap per article. Default 10.
requestDelaySecondsnumberPause between requests, default 0.6 s (randomised up to 1.5x).
proxyConfigurationobjectOptional 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.

FieldMeaning
id, url, title, subtitleArticle ID, link, title and the preview subtitle.
authorid, name, handle, url and followers of the writer.
publication, publicationSlug, publicationUrlName, slug and URL of the publication, or null when the article is not in one.
publishedAt, updatedAtISO 8601 UTC. updatedAt is the last publish of the article.
readingTimeMinutes, claps, responsesCountNumbers.
tagsTag names.
isPaywalledtrue for member-only stories.
previewImagePreview image link.
contentText, contentMarkdownFull text (with includeContent). The leading title, subtitle and any kicker line above the title are removed, so the body does not repeat them.
contentIsPartial, contentNoteFor member-only stories: Medium only shows a preview without a subscription. We return that public preview and set contentIsPartial: true.
sourceType, sourceWhich input produced the item.
scrapedAtUTC 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 requestDelaySeconds or enable a proxy if that happens.

Use with Python

# pip install apify-client
import os
from apify_client import ApifyClient
client = 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-client
import { 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 to datagleaner/medium-scraper and 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 the tools parameter, the agent can still find the Actor with the search-actors tool and run it with call-actor. In Claude Code:

      claude mcp add --transport http apify "https://mcp.apify.com?tools=datagleaner/medium-scraper"
    

    Then run /mcp to 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 environment
import json
from langchain_apify import ApifyActorsTool
tool = 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.