How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
artificial-intelligencein Tags. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Medium Article Scraper reads the latest Medium stories by tag, author, publication or story URL. It returns title, author, publication, date, tags, member-only flag, reading time and the full text of open stories. No login, cookies or API key. The example run saves 10 stories about AI in about 5 seconds and costs $0.093 on the Free tier.
- tag — topic tags, such as
artificial-intelligenceorMachine Learning; - author — usernames or profile links, such as
@evorev.medium.com; - publication — publication names or links, such as
towards-data-science; - article — story links. The Actor finds each story in its author or publication feed.
Good for
- Watch new stories on a topic, an author or a publication every day.
- Collect story metadata and open text for research, newsletters or AI tools.
- Check if a story is member-only before you share or analyze it.
Not a good fit
- Full author archives or search by keyword. RSS gives only the latest 10 stories.
- Claps, responses, followers or view counts. RSS does not have them.
- Text of member-only stories. The Actor does not log in and does not bypass the paywall; you get a preview flag only.
Who uses it
Newsletter writers
Find new stories on your topic every day.
Content researchers
Send open story text to an AI tool or search index.
Social media managers
Check if a story is member-only before you share it.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.003 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Saved story | $0.009 (from $0.0075 on paid Apify plans) | One Medium story saved as a Dataset row. Duplicates, onlyNew skips and not-found items are not charged. |
Examples
- One result: about $0.01.
- 1,000 results: about $9.00.
- Every day 100 results, for 30 days: about $27.09 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 550 results.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Can I get older stories?
No. Each feed shows only the 10 latest stories. A schedule helps you collect more over time.
Does it show claps or views?
No. Medium RSS does not have claps, responses or views.
Can I read member-only stories?
No. You get a member-only flag, but not the paid text.
How many feeds can I read in one run?
Up to 20 feeds per run.
Do I need a Medium account?
No. The Actor reads public RSS feeds. It does not log in and does not use cookies.
Can I get claps or responses?
No. Medium RSS does not include them, and the Actor reads only RSS.
Why is a story missing in article mode?
The story is not among the 10 latest of its author or publication feed. RUN_SUMMARY.articles shows not_in_feed.
Details
Step by step on Apify
- Open Input.
- Keep the example: Mode
tag, Tagsartificial-intelligence, Max items20. - Click Start.
- Open Articles in the output. Check
title,authorName,publishedAtandtags.
Use cases
| Goal | Input | Key fields | Next step |
|---|---|---|---|
| Topic monitoring | tags + onlyNew on a schedule | title, url, publishedAt, tags | Send new rows to Slack, email or a sheet. |
| Content research | publications + includeContent | contentText, wordCount, readingTimeMin | Feed open text to an LLM or a search index. |
| Author tracking | authors | title, publishedAt, isMemberOnly | Keep a list of new posts by people you follow. |
| Link check | articleUrls | isMemberOnly, contentAvailability | See if a story is open before you share it. |
Tips for better results
- Run it on a schedule with only-new on to build your own history.
- Use author or publication mode to get full text more often.
- Do not start two big runs at the same time; Medium may slow them.
Limits and good to know
- 10 stories per feed. Medium RSS has no paging. A run cannot go deeper than the 10 latest stories
- 20 feeds per run. Medium allows about 25 feed reads in a short time from one IP address. After that it answers HTTP 429 for 10 minutes or more. The Actor does not try to go around this limit
- Medium limit during a run. If Medium answers 429, the Actor stops reading. It keeps the rows saved so far and ends
SUCCEEDEDwithstatus: "partial"anderrorCode: "RATE_LIMITED". Feeds not read getskipped. If no row was saved, the run isFAILEDwithRATE_LIMITED. Runs that start at the same time can share this limit, so a big run right after another big run can stop early - Text in tag mode. A tag feed has only a snippet. With
includeContent, the Actor reads the author or publication feed of each story to get the text, but only while the per-run request budget allows. Other rows keepcontentAvailability: "unknown". For reliable full text, useauthororpublicationmode - Member-only stories. Only the preview.
isMemberOnly: true, no text - Time. A run stops reading after 4 minutes (or 10 seconds before its timeout) and ends
partialwithDEADLINE - Feed failure. If a feed fails after retries, the run is
FAILEDwithSOURCE_ERROR, but saved rows stay in the Dataset
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"id": "aac387e10cb6",
"url": "https://medium.com/data-science/deep-dive-into-websockets-and-their-role-in-client-server-communication-aac387e10cb6",
"title": "Deep Dive into WebSockets and Their Role in Client-Server Communication",
"subtitle": null,
"authorName": "clara",
"authorUsername": null,
"authorUrl": null,
"publicationSlug": "towards-data-science",
"publicationName": "TDS Archive",
"publicationUrl": "https://medium.com/data-science",
"publishedAt": "2025-02-03T11:02:00.000Z",
"updatedAt": "2025-02-03T11:02:00.167Z",
"tags": ["software-development", "system-design-concepts", "websocket", "client-server-model", "getting-started"],
"isMemberOnly": false,
"contentAvailability": "full",
"wordCount": 1837,
"readingTimeMin": 7.6,
"imageUrl": "https://cdn-images-1.medium.com/max/1024/1*HzsgZYLeeRwRNm5gbwQWrg.jpeg",
"contentText": "…",
"contentHtml": "…",
"sourceType": "publication",
"sourceValue": "towards-data-science",
"feedUrl": "https://medium.com/feed/towards-data-science",
"fetchedAt": "2026-10-15T00:20:38.167Z"
}Use it from code
Actor ID: cliqtomedia/medium-articles-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/medium-articles-scraper").call(run_input={
"mode": "tag",
"tags": [
"artificial-intelligence"
]
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~medium-articles-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "tag", "tags": ["artificial-intelligence"]}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/medium-articles-scraper")
result = tool.invoke({"run_input": {"mode": "tag", "tags": ["artificial-intelligence"]}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (24)
| Field | Type | Meaning |
|---|---|---|
id | string | Medium story ID (12 hex characters), from the feed guid medium.com/p/<id>. |
url | string | Story URL without tracking parameters. |
title | string | Story title. |
subtitle | string | Feed snippet: the subtitle or first line. Null when the feed has full text instead. |
authorName | string | Author display name from the feed. |
authorUsername | string | Medium username when the URL or feed shows it. |
authorUrl | string | Author profile URL, if the username is known. |
publicationSlug | string | Publication slug, such as towards-data-science. Null for personal stories. |
publicationName | string | Publication name, when read from a publication feed. |
publicationUrl | string | Publication URL. |
publishedAt | string | ISO time of publication. |
updatedAt | string | ISO time of the last update reported by the feed. |
tags | array | Story tags (feed categories). Can be empty. |
isMemberOnly | boolean | true: member-only story, the feed has only a preview. false: open story. null: unknown (tag feeds without includeContent, or story not in the author/publication feed). |
contentAvailability | string | full, preview_member_only, not_requested or unknown. |
wordCount | integer | Words in the full feed text. Null when there is no full text. |
readingTimeMin | number | Estimated reading time in minutes (Medium method: 265 words per minute plus image time). Estimate, not the value shown on Medium. |
imageUrl | string | First image URL. |
contentText | string | Plain text with paragraph breaks. Only with includeContent and open stories. |
contentHtml | string | Story HTML as published in the feed. Only with includeContent and open stories. |
sourceType | string | Feed type the row came from: tag, author or publication. |
sourceValue | string | Tag, username or publication slug from your input. |
feedUrl | string | Medium RSS feed URL that was read. |
fetchedAt | string | ISO time when the feed was read. |
Input settings (9)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Mode required | mode | string | "tag" |
| Tags | tags | array | ["artificial-intelligence"] |
| Authors | authors | array | |
| Publications | publications | array | |
| Article URLs | articleUrls | array | |
| Max articles | maxItems | integer | 20 |
| Include full text | includeContent | boolean | false |
| Only new articles | onlyNew | boolean | false |
| Memory name | stateKey | string | "default" |
Use cases with this tool
Each guide shows all the steps and the other tools.