Medium Scraper: Articles by Tag, Author, Publication
Pricing
from $2.99 / 1,000 articles
Medium Scraper: Articles by Tag, Author, Publication
Scrape Medium articles by tag, author, publication or article link: title, subtitle, author and followers, publication, date, reading time, claps, responses, tags, member-only flag, image and optional full text of free stories. No login. Pay per article.
Pricing
from $2.99 / 1,000 articles
Rating
0.0
(0)
Developer
The Mine Works
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
11 days ago
Last modified
Categories
Share
From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.
Why choose this actor?
- Four ways in, one row shape. Read Medium by tag, by publication, by author, or by article link, all in the same run. Our proof run collected 1,470 articles in 34 seconds from 3 tags, 2 publications, 3 authors and 4 article links, with 75 requests and not one refused. No Medium account, no cookies, no API key.
- The numbers people actually compare. Every row carries claps, the number of readers who clapped, responses, reading time, word count, the author's follower count, the publication, up to 5 tags, the member-only flag and the preview image. In the proof run 100% of rows had claps, responses, reading time, word count and author followers filled.
- Full text when the story is free, honest when it is not. Switch on
includeFullTextand every free story arrives with its body as clean Markdown (767 of the 1,470 proof rows, the median one about 9,200 characters). Member-only stories keep all their other fields and saymember_only; the actor never pulls text from behind the paywall. You pay the same per row either way, and stories you filter out, duplicates and stories that do not exist are never charged.
Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Profile Scraper, Instagram Followers & Following, Reddit Search Scraper.
Try it in one minute
Paste this input and press Start. It returns the 20 newest stories tagged programming, in about 3 seconds:
{"tags": ["programming"],"maxArticles": 20}
Fill any of the four lists. They can be combined in one run:
- tags: a tag as Medium writes it in links (
programming,machine-learning), a phrase (Machine Learning), a#hashtag, or a tag link (https://medium.com/tag/productivity). - publications: the name in the link (
towardsdev), a medium.com link (https://medium.com/data-science-in-your-pocket) or the publication's own domain (uxdesign.cc,https://levelup.gitconnected.com). - authors:
@username,username, a profile link (https://medium.com/@sadiqueali) orhttps://username.medium.com. - articleUrls: any story link on medium.com, on a publication's own domain or on username.medium.com, a
medium.com/p/<id>link, or the 12 character story id.
Leave all four empty and the run reads the example tag programming, so a first run always returns real rows.
Apify's free plan includes $5 of credit every month, which covers about 990 results at this actor's price.
Copy to your AI assistant
themineworks/medium-scraper on Apify. Collects Medium articles without a login by tag (latest, most read or recommended order, optionally for one year or month), by publication, by author or from article links; one row per article with title, subtitle, link, author name, username, profile link and followers, publication, published and updated time, reading time, word count, claps, clappers, responses, tags, member-only flag, language, image and, on request, the full text of free stories as Markdown. Call ApifyClient("TOKEN").actor("themineworks/medium-scraper").call(run_input={"tags": ["programming"], "maxArticles": 50}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: at least one of tags, publications, authors, articleUrls (arrays of strings). Optional: maxArticles (default 20, 10 to 5000 per tag, publication or author), tagSort (latest, most_read or recommended; default latest), tagPeriod (a year such as 2025 or a month such as 2026-09), includeFullText (default false), skipMemberOnly (default false), publishedAfter (a date or a window such as "7 days"), onlyNewResults (default false). Skip rows that have "_type": "status". Full spec: GET https://api.apify.com/v2/acts/themineworks~medium-scraper/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral
Key features
- Tags in three orders.
latestreads a tag newest first and keeps going back in time (the proof run read 200 stories for each of 3 tags; the 200 newest programming stories spanned about 10 hours).most_readreturns Medium's most read stories of the tag, all time or for a year or month you name.recommendedis the ranked feed on the tag page, about 75 stories. - Publications and authors newest first. Each runs strictly by date from the newest story back, 25 stories per request, up to 5,000 per publication or author. Pinned and featured stories that Medium puts at the top of a homepage do not jumble the order.
- 33 fields per article, from title and subtitle to claps, clappers, responses, reading time, word count, author followers, publication, tags with display names, language, preview image and canonical link.
- Full text as Markdown for free stories: headings, lists, quotes and code blocks kept, the repeated title and images left out, and
full_text_charsso you can sort by length. - Filters that save money:
publishedAfter(a date or a window such as24 hours) stops a dated feed at the boundary, andskipMemberOnlydrops paywalled stories. Filtered stories are never charged. - Only new stories on repeat runs: switch on
onlyNewResultsfor a schedule and each run returns, and charges, only stories no earlier run of yours delivered. In our test the second run of the same input skipped all 40 known stories.
How to use it
Basic: the newest stories of a tag
{"tags": ["artificial-intelligence"],"maxArticles": 200}
Newest first, 20 stories per request, back in time until 200 stories are collected. A story that carries two of your tags is delivered once, under the first tag, and charged once.
Several tags, publications and authors at once, with full text
{"tags": ["programming", "productivity"],"publications": ["uxdesign.cc", "https://levelup.gitconnected.com"],"authors": ["@sadiqueali"],"maxArticles": 100,"includeFullText": true}
Up to 200 entries per run, read four at a time. Every row says where it came from in source_type and source_input.
Specific stories by link
{"articleUrls": ["https://medium.com/data-science-in-your-pocket/strata-vs-llama-cpp-the-best-way-to-run-a-125b-llm-on-your-gaming-pc-7e4afe3c1760","https://towardsdev.com/laravel-collections-in-2026-the-methods-you-are-not-using-that-will-cut-your-code-in-half-aeb5618b649b","https://medium.com/p/f85e2d4dbec0"],"includeFullText": true}
Story links are read 10 per request, before any feed in the same run, so a story you asked for by link is always delivered under that link. A link to a story that no longer exists gets a free status row.
Daily content monitoring for a niche
{"tags": ["product-management", "startup", "saas"],"maxArticles": 300,"publishedAfter": "24 hours","onlyNewResults": true}
Schedule it once a day in Apify. publishedAfter stops each tag when it reaches stories older than a day, and onlyNewResults skips anything an earlier run already gave you, so each morning you pay only for the new stories.
What topped a tag last month
{"tags": ["javascript", "python", "design"],"tagSort": "most_read","tagPeriod": "2026-09","maxArticles": 50}
most_read returns Medium's list of the tag's most read stories for the period, about 20 per tag. In our test September 2026 gave 19 stories for javascript, 19 for python and 20 for design. Use a year (2025) for a yearly list, or leave tagPeriod empty for all time.
Competitor and creator research
{"authors": ["@mehulgupta_7991", "@sadiqueali"],"publications": ["towardsdev"],"maxArticles": 500,"skipMemberOnly": false}
Pull an author's or a publication's full back catalogue, newest first, then sort by claps or responses_count to see which topics land. member_only shows how much of their output sits behind the paywall.
Input parameters
| Parameter | Type | Default | What it does |
|---|---|---|---|
tags | array of strings | none (the example tag programming when all four lists are empty) | Tags as written in Medium links, phrases, #hashtags or tag links. |
publications | array of strings | none | Publication names, medium.com publication links or the publication's own domain. |
authors | array of strings | none | @usernames, usernames, profile links or username.medium.com links. |
articleUrls | array of strings | none | Story links on any Medium host, medium.com/p/ links or 12 character story ids. One row each. |
maxArticles | integer | 20 | Stories per tag, publication or author, 10 to 5,000. |
tagSort | string | latest | latest (newest first, deep), most_read (Medium's most read list, about 20 per tag and period) or recommended (the ranked tag page feed, about 75). |
tagPeriod | string | none | For latest and most_read: a year (2025) or a month (2026-09). Empty means all time. |
includeFullText | boolean | false | Add the body of free stories as Markdown. Member-only stories never include text. |
skipMemberOnly | boolean | false | Leave out member-only stories. Skipped stories are not charged. |
publishedAfter | string | none | Only stories published on or after this date, ISO time or window (2026-10-01, 7 days). |
onlyNewResults | boolean | false | Skip stories an earlier run of yours already delivered. Remembers up to 50,000 story ids. |
Up to 200 tags, publications, authors and story links per run in total.
What data do you get?
One row per article. Fields, grouped:
- Where the row came from:
record_type(alwaysarticle),source_type(tag, publication, author or article),source_input(what you typed),position(order within that tag, publication or author). - The story:
article_id,title,subtitle,url,canonical_url(only when the author points the canonical link somewhere else, such as their own blog),published_at,last_updated_at,reading_time_minutes,word_count,language,image_url. - Engagement:
claps(total claps),clappers(readers who clapped; one reader can clap up to 50 times),responses_count. - Author:
author_name,author_username,author_profile_url,author_id,author_followers. - Publication:
publication_name,publication_slug,publication_url(empty for stories published on the author's own profile). - Topics:
tags(slugs, up to 5) andtag_names(as Medium displays them). - Paywall and text:
member_only,full_text_status(included,member_only,emptyornot_requested),full_textandfull_text_chars. - Run:
scraped_at.
A tag, publication, author or story link that returns nothing gets one free status row with _type: "status", a status (not_found, no_results, nothing_new, blocked, invalid_input) and a plain note. The run's OUTPUT record in the key-value store lists every entry with its outcome, pages read and what was skipped.
Stable fields for automations
These fields were filled on every one of the 1,470 rows of our proof run, and their names will not change:
| Field | What it holds |
|---|---|
record_type | Always article |
source_type | tag, publication, author or article |
source_input | Your tag, publication, author or link as written |
article_id | Medium's story id |
title | Story title |
url | Link to the story |
author_name | Author display name |
author_username | Author username |
author_followers | Author's followers on Medium |
published_at | First published, UTC, ISO 8601 |
reading_time_minutes | Medium's reading time estimate |
word_count | Words in the story |
claps | Total claps |
responses_count | Responses |
member_only | Behind the paywall or not |
Output examples
A story read from its link, with full text (trimmed)
{"record_type": "article","source_type": "article","position": 1,"article_id": "7e4afe3c1760","title": "Strata vs llama.cpp : The Best Way to Run a 125B LLM on Your Gaming PC?","subtitle": "A 125 Billion Parameter Model, on Your PC","url": "https://medium.com/data-science-in-your-pocket/strata-vs-llama-cpp-the-best-way-to-run-a-125b-llm-on-your-gaming-pc-7e4afe3c1760","author_name": "Mehul Gupta","author_username": "mehulgupta_7991","author_profile_url": "https://medium.com/@mehulgupta_7991","author_followers": 23280,"publication_name": "Data Science in Your Pocket","publication_url": "https://medium.com/data-science-in-your-pocket","published_at": "2026-10-05T10:52:31.187Z","reading_time_minutes": 8.9,"word_count": 2297,"claps": 22,"clappers": 1,"responses_count": 0,"tags": ["technology", "artificial-intelligence", "machine-learning", "data-science", "programming"],"member_only": false,"language": "en","image_url": "https://miro.medium.com/v2/resize:fit:1200/0*ih3mIwMWjWPUZimi","full_text_status": "included","full_text": "A year ago, telling someone you run a 125-billion-parameter model at home would get you laughed out of the room. Models that size lived on servers with hundreds of gigabytes of GPU memory...","full_text_chars": 13410}
A member-only story from the artificial-intelligence tag (trimmed)
{"record_type": "article","source_type": "tag","source_input": "artificial-intelligence","position": 3,"article_id": "46c3d34b1ee6","title": "Software Is Getting Worse Because Every Company Is Afraid to Stop Adding Features","url": "https://medium.com/engineering-playbook/software-is-getting-worse-because-every-company-is-afraid-to-stop-adding-features-46c3d34b1ee6","author_name": "The System Design Journal","author_followers": 1086,"publication_name": "Engineering Under Pressure","published_at": "2026-10-05T22:14:26.595Z","reading_time_minutes": 13.9,"word_count": 3628,"claps": 0,"responses_count": 0,"tags": ["technology", "software-development", "software-engineering", "artificial-intelligence", "data-science"],"member_only": true,"full_text_status": "member_only"}
A story from a publication on its own domain (UX Collective, trimmed)
{"record_type": "article","source_type": "publication","source_input": "uxdesign.cc","position": 3,"article_id": "11e4192f394c","title": "The feed I produce myself","subtitle": "On working with agents, producing more than ever, and losing the ability to see anything whole.","url": "https://uxdesign.cc/the-feed-i-produce-myself-11e4192f394c","author_name": "Pedro A. Brêtas","author_followers": 149,"publication_name": "UX Collective","publication_slug": "user-experience-design-1","publication_url": "https://uxdesign.cc","published_at": "2026-10-03T11:12:40.743Z","reading_time_minutes": 13.1,"word_count": 3291,"claps": 87,"clappers": 8,"tags": ["artificial-intelligence", "ai-agent", "the-future-of-work", "productivity", "ux"],"member_only": false,"full_text_status": "included","full_text_chars": 18352}
A link to a story that does not exist (free status row)
{"_type": "status","source_type": "article","source_input": "https://medium.com/p/000000000000","status": "not_found","note": "Medium has no such tag, author, publication or story (deleted, renamed, or a typo). Not charged."}
Pricing
Pay per event: you pay for each article row delivered to your dataset, plus a flat $0.005 per run, whatever memory you choose. The full text option costs nothing extra. Nothing else is billed: no proxy add-on, no charge per tag, per page or per request.
| Event | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) and above |
|---|---|---|---|---|
| Article delivered, per 1,000 articles | $4.99 | $4.29 | $3.59 | $2.99 |
| Run start, once per run | $0.005 | $0.005 | $0.005 | $0.005 |
Never charged: tags, publications, authors and stories that do not exist, lines that are not a tag, name or link, requests Medium refuses, a story already delivered earlier in the same run (two of your tags can share a story), stories older than publishedAfter, member-only stories when skipMemberOnly is on, stories an earlier run already delivered when onlyNewResults is on, and the status rows that explain an entry with no results. A run that delivers nothing costs only the start fee.
To cap a run's cost, set Maximum cost per run in the run options; the actor stops delivering, and charging, when that budget is used.
FAQ
What does this actor read?
Medium's own GraphQL service at medium.com, the one Medium's website calls in your browser: the tag story lists, the tag page feed, a publication's and an author's story lists, and single stories. It reads what Medium shows any visitor who is not logged in.
How many articles can I get?
Up to 5,000 per tag, publication or author, and up to 200 entries per run. Tags in latest order go back as far as Medium's tag history does; in our tests 200 stories of the programming tag covered the last 10 hours. most_read returns about 20 stories per tag and period, and recommended about 75 per tag, because that is all Medium serves for those lists. Story links return one row each.
Can I get the full text of member-only stories?
No. For member-only stories Medium serves only a preview to visitors who are not paying members, and this actor does not log in or get around the paywall. Those rows keep the title, subtitle, author, publication, claps, responses, reading time, word count, tags and image, with full_text_status: "member_only". In our proof run 52% of stories were free and came with full text.
How fresh is the data?
Live. Every run reads Medium at that moment, so claps, responses and follower counts are as of the run. In the proof run the newest programming story was less than 2 minutes old when it was read.
Do I need a Medium account, an API key or cookies?
No. Nothing to sign up for and nothing to paste. The actor reads Medium as a logged out visitor.
Do I need my own proxy?
No. The actor sends its requests through Apify's datacenter proxy, which is included. Medium sits behind Cloudflare; the actor's requests carry a real browser's connection fingerprint, and any request that gets Cloudflare's check page is retried from a different address. In the proof run all 75 requests were answered on the first try.
Why is the order of a tag different from what I see on medium.com?
Medium's tag page opens on a ranked "recommended" feed that is personalised and stops at about 75 stories. The default latest order lists the tag's stories by date, which is what monitoring and research need. Pick tagSort: "recommended" to get the ranked feed instead.
What happens with a tag, author or story that does not exist?
It gets one free status row that says not_found and is not charged. A misspelled line that is not a tag, name or link gets an invalid_input status row. The run's OUTPUT record lists every entry with its outcome.
Can I monitor tags, authors or publications on a schedule?
Yes. Create a schedule in Apify, switch on onlyNewResults and, if you like, set publishedAfter to the schedule's interval (24 hours for a daily run). Each run then returns only stories no earlier run delivered, and charges only for those.
In what formats can I export the data?
JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or the Apify API. Arrays such as tags become joined columns in CSV and Excel.
Can I use it from Claude, ChatGPT or another AI assistant?
Yes, through Apify's MCP server.
- Connector URL: https://mcp.apify.com/?tools=themineworks/medium-scraper
- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code:
claude mcp add -t http medium-scraper "https://mcp.apify.com/?tools=themineworks/medium-scraper"
Is it legal to scrape Medium?
The actor collects only stories and profile details that Medium shows to anyone without logging in, and it does not log in or bypass the paywall. You are responsible for how you use the data: respect authors' copyright when you store or republish full text, check Medium's terms for your use case, and follow the data protection laws that apply to you, such as GDPR and CCPA.
Integrations
- Google Sheets: send each run's dataset to a sheet with Apify's Google Sheets integration, one row per article.
- Make, Zapier and n8n: start a run and read its dataset with the Apify apps and nodes, for example to post new stories from a tag to Slack or Notion.
- Webhooks: have Apify call your URL when a run finishes, then fetch the dataset.
- API: start runs and read results from any language with the Apify API or the Python and JavaScript clients (see "Copy to your AI assistant" above).
- MCP clients: Claude, ChatGPT, Cursor, VS Code and Claude Code, through the connector URL in the FAQ.
For newsletters, see our Substack Scraper and LinkedIn Newsletter Scraper.
More from The Mine Works
Social media and video
- Threads Scraper
- Reddit Scraper
- Threads Search Scraper
- Instagram Profile Scraper
- Instagram Followers & Following
- Reddit Search Scraper
- Twitter / X Scraper
- YouTube Transcript
- Xiaohongshu (RED) Scraper
- Telegram Channel Scraper
- Telegram Channel Finder
- Pinterest Profile Scraper
Leads and business directories
Marketing, SEO and reviews
Real estate
Science, health and government data
Jobs and hiring
Company and business data
E-commerce and marketplaces
Food and local services
Developer and AI tools
More tools
Support
Found a tag, publication or story that does not come back right, or a field you need? Open an issue in the Issues tab and include the run link. For new sources or a custom build, email dmineworks@gmail.com.
Medium articles by tag, publication, author or link, with claps, responses, reading time, author followers, tags and the full text of free stories, no login, charged only for rows you receive.

