Medium Article Scraper: Tags, Authors & Publications avatar

Medium Article Scraper: Tags, Authors & Publications

Pricing

from $7.50 / 1,000 saved stories

Go to Apify Store
Medium Article Scraper: Tags, Authors & Publications

Medium Article Scraper: Tags, Authors & Publications

Scrape the latest Medium stories by tag, author, publication or URL. Get title, author, date, tags, member-only flag, reading time and open-story text. No login.

Pricing

from $7.50 / 1,000 saved stories

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Share

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.

Medium Article Scraper: tags, authors and publications to a table of stories with member-only flag, reading time and full text

Contents

What it does

The Actor reads public Medium RSS feeds. Choose one mode and give a list:

  • tag — topic tags, such as artificial-intelligence or Machine Learning;
  • author — usernames or profile links, such as @ev or ev.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.

Every feed gives up to 10 latest stories. This is a Medium RSS limit: older stories and full archives are not available. One run reads up to 20 feeds and saves up to 200 stories.

Good fit

  • 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 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.

Data you get

Each row is one story: id, url, title, subtitle, author (authorName, authorUsername, authorUrl), publication (publicationSlug, publicationName, publicationUrl), publishedAt, updatedAt, tags, isMemberOnly, contentAvailability, wordCount, readingTimeMin, imageUrl, and with includeContent also contentText and contentHtml. Every row also says where it came from (sourceType, sourceValue, feedUrl) and when (fetchedAt).

The run report RUN_SUMMARY lists every feed with its status: complete, empty, not_found, error or skipped.

This Actor is independent. It is not made or endorsed by Medium. Stories belong to their authors; check the Medium Terms of Service before you reuse the text.

Quick start

  1. Open Input.
  2. Keep the example: Mode tag, Tags artificial-intelligence, Max items 20.
  3. Click Start.
  4. Open Articles in the output. Check title, authorName, publishedAt and tags.

Expected result: about 10 of the newest AI stories in 2–10 seconds. A tag feed has 10 stories, so maxItems: 20 saves 10.

Input

FieldTypeRequiredDefault / exampleAllowed valuesWhat it doesTip
modestringyestagtag, author, publication, articleWhich list the run reads. Other lists are ignored.One mode per run. Use several runs for a mix.
tagsarray of stringsin tag modeexample ["artificial-intelligence"]1–20 items; slug, name or medium.com/tag/... linkReads medium.com/feed/tag/<slug>. Machine Learning becomes machine-learning. Non-Latin tags, such as 日本語, work.Names and links of the same tag count once.
authorsarray of stringsin author mode["ev"]1–20 items; ev, @ev, medium.com/@ev, ev.medium.comReads the author's feed.Different spellings of one author count once.
publicationsarray of stringsin publication mode["towards-data-science"]1–20 items; slug or medium.com/<slug> / <slug>.medium.com linkReads the publication feed.For a custom domain, use the Medium slug, such as netflix-techblog.
articleUrlsarray of stringsin article mode—1–100 links on medium.com or *.medium.com, from up to 20 different authors or publicationsFinds each story in its author or publication feed.Short /p/<id> links have no author: use the full story link.
maxItemsintegerno100 (example 20)1–200Maximum saved rows for the whole run. Each row is charged.Set it to the number of rows you want to pay for.
includeContentbooleannofalsetrue, falseAdds contentText and contentHtml of open stories, wordCount and readingTimeMin.In tag mode the text comes from extra feeds; see Limits.
onlyNewbooleannofalsetrue, falseSkips stories that earlier runs with the same stateKey already saved.Use it for scheduled runs.
stateKeystringnodefault1–40 letters, digits or -Name of the memory for onlyNew.Use one name per watch list.

Empty or wrong input. An empty list for the chosen mode, an unknown field, a bad link or more than 20 feeds fails the run before any feed is read. A tag that has no stories gives status empty. An author or publication that does not exist gives status not_found. Both are normal results, not errors.

Duplicates. A story that appears in two feeds is saved once.

Input examples

Latest stories for several tags

{
"mode": "tag",
"tags": ["artificial-intelligence", "Machine Learning", "python"],
"maxItems": 30
}

Expected: up to 30 rows, 10 per tag, newest first inside each tag. isMemberOnly is null, because a tag feed shows only a short snippet.

Publication stories with full text

{
"mode": "publication",
"publications": ["towards-data-science", "netflix-techblog"],
"includeContent": true,
"maxItems": 20
}

Expected: up to 20 rows. Open stories have contentAvailability: "full", contentText and readingTimeMin. Member-only stories have isMemberOnly: true and contentAvailability: "preview_member_only" with no text.

Daily watch list of authors

{
"mode": "author",
"authors": ["@ev", "netflixtechblog.medium.com"],
"onlyNew": true,
"stateKey": "my-authors",
"maxItems": 50
}

Expected: the first run saves the latest stories. Later runs save only stories that are new since the last run, often 0 rows.

Check specific stories

{
"mode": "article",
"articleUrls": ["https://ev.medium.com/making-social-social-again-0126fa5c6ce8"],
"includeContent": true
}

Expected: one row if the story is among the 10 latest of its author or publication. Otherwise RUN_SUMMARY.articles says not_in_feed or feed_not_found, and no row is charged.

Output

Output fields

FieldTypeCan be empty?ExampleMeaning
idstringnoaac387e10cb6Medium story ID.
urlstringnohttps://medium.com/data-science/deep-dive-...-aac387e10cb6Story link without tracking parameters.
titlestringnoDeep Dive into WebSockets ...Story title.
subtitlestringyesOne thing I have noticed ...Subtitle or snippet from the feed.
authorNamestringyesclaraAuthor name shown on Medium.
authorUsernamestringyesevMedium username, when the feed or link shows it.
authorUrlstringyeshttps://medium.com/@evAuthor profile link.
publicationSlugstringyestowards-data-sciencePublication slug for publication stories.
publicationNamestringyesTDS ArchivePublication name from the feed.
publicationUrlstringyeshttps://medium.com/data-sciencePublication link.
publishedAtstring (ISO date)yes2025-02-03T11:02:00.000ZPublish time.
updatedAtstring (ISO date)yes2025-02-03T11:02:00.167ZLast update time from the feed.
tagsarray of stringsno (can be [])["websocket", "software-development"]Story tags.
isMemberOnlybooleanyesfalsetrue — member-only, preview only; false — open story; null — unknown (tag feed without text).
contentAvailabilitystringnofullfull, preview_member_only, not_requested or unknown.
wordCountintegeryes1837Words in the open text. Only when the text is full.
readingTimeMinnumberyes7.6Estimated reading time in minutes (words ÷ 265 plus images). Only when the text is full.
imageUrlstringyeshttps://cdn-images-1.medium.com/...jpegFirst image of the story.
contentTextstringyesWebSockets are ...Plain text of an open story. Only with includeContent.
contentHtmlstringyes<p>WebSockets are ...</p>HTML of an open story. Only with includeContent.
sourceTypestringnopublicationFeed type: tag, author or publication.
sourceValuestringnotowards-data-scienceYour input value after cleanup.
feedUrlstringnohttps://medium.com/feed/towards-data-scienceFeed that gave the row.
fetchedAtstring (ISO date)no2026-10-15T00:20:38.167ZWhen the Actor read the feed.

null means "not in the source" or "not known". It never means 0.

Output example

Trimmed: contentText and contentHtml are shortened.

{
"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"
}

Where to find results

SituationWhereWhat you see
Normal runDataset views Articles and ContentOne row per story.
No stories (empty tag, unknown author)Dataset is empty; RUN_SUMMARYFeed status empty or not_found, run SUCCEEDED.
Stopped early (Medium limit, time or budget)Dataset and RUN_SUMMARYSaved rows stay. status: "partial" and errorCode explain why.
Wrong input or feed failureRun status and RUN_SUMMARYFAILED with errorCode and a short message.

Pricing

This Actor uses pay per event. You pay for:

EventFreeBronzeSilverGold and higher
Actor start (once per run)$0.003$0.003$0.003$0.003
Saved story (one Dataset row)$0.009$0.0085$0.008$0.0075

Platform usage is included. Stories that are skipped as duplicates, by onlyNew, or not found are not charged. A run with 0 saved stories costs only the start fee.

ScenarioInputRowsFree tier price
Example run1 tag, maxItems: 2010$0.093
10 publications with text10 publications, includeContent100$0.903
Biggest run20 tags, maxItems: 200up to 200up to $1.803
Nothing newonlyNew, no new stories0$0.003

To cap the cost, set maxItems or a maximum charge for the run in Apify. When the cap is reached, the run stops with partial and CHARGE_LIMIT and keeps the saved rows.

Use cases

GoalInputKey fieldsNext step
Topic monitoringtags + onlyNew on a scheduletitle, url, publishedAt, tagsSend new rows to Slack, email or a sheet.
Content researchpublications + includeContentcontentText, wordCount, readingTimeMinFeed open text to an LLM or a search index.
Author trackingauthorstitle, publishedAt, isMemberOnlyKeep a list of new posts by people you follow.
Link checkarticleUrlsisMemberOnly, contentAvailabilitySee if a story is open before you share it.

Scheduled runs and only new stories

Create a schedule in Apify (for example, every day). Turn on onlyNew and give the list a stateKey. The Actor keeps the IDs of stories it saved in a named key-value store medium-articles-seen-<stateKey>. The next run with the same stateKey skips them and charges only new rows. Rows from a run that stopped early are remembered too, so you never pay twice for one story.

A feed shows only 10 stories. For a busy tag (new stories every few minutes) run more often, or some stories will pass between runs.

API, export and integrations

  • Export: download the Dataset as JSON, CSV, Excel, XML or RSS from the run page.
  • API: start the Actor with the Apify API and read /datasets/{id}/items?view=overview.
  • Schedules and webhooks: use Apify schedules for daily runs and webhooks or integrations (Make, Zapier, n8n) to send new rows on.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/medium-articles-scraper.
  • Smallest input: {"mode": "tag", "tags": ["artificial-intelligence"], "maxItems": 10}.
  • Key output fields: title, url, authorName, publishedAt, contentText (only with includeContent, open stories).
  • A typical run takes 2–10 seconds. 10 rows cost $0.093 on the Free tier.
  • Limits: one mode per run, up to 20 feeds and 200 rows, 10 latest stories per feed.

Limits and partial results

  • 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 SUCCEEDED with status: "partial" and errorCode: "RATE_LIMITED". Feeds not read get skipped. If no row was saved, the run is FAILED with RATE_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 keep contentAvailability: "unknown". For reliable full text, use author or publication mode.
  • 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 partial with DEADLINE.
  • Feed failure. If a feed fails after retries, the run is FAILED with SOURCE_ERROR, but saved rows stay in the Dataset.

Troubleshooting

The run saved fewer rows than maxItems

Symptom: 10 rows with maxItems: 100. Reason: each feed gives at most 10 stories. Action: add more tags, authors or publications (up to 20).

partial with RATE_LIMITED

Symptom: some feeds are skipped in RUN_SUMMARY. Reason: Medium limited feed reads from the IP address. Action: keep the saved rows. Start a new run with the skipped feeds after 15 minutes or more.

Status not_found

Symptom: no rows, feed status not_found. Reason: the author or publication does not exist under that name, or a custom domain is used. Action: open the profile on Medium and copy the username or the publication slug from the address.

contentAvailability is unknown

Reason: tag mode with includeContent, and the request budget ended before the author feed of this story was read. Action: read the story's author or publication in a separate run.

FAQ

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.

Can I get older stories?

No. Each feed shows only the 10 latest stories. Use onlyNew on a schedule to build your own history over time.

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.

Is the text of member-only stories included?

No. The Actor does not bypass the Medium paywall.

Support

For help, open an issue on this Actor's Issues tab in Apify Store. Share the run ID and your input. Remove tokens and private information.