Medium Articles Scraper — By Tag, Publication or Writer avatar

Medium Articles Scraper — By Tag, Publication or Writer

Pricing

from $0.80 / 1,000 articles

Go to Apify Store
Medium Articles Scraper — By Tag, Publication or Writer

Medium Articles Scraper — By Tag, Publication or Writer

Latest Medium stories from a tag, a publication or a writer's feed: title, link, publish date, tags, plain-text excerpt, word count and reading time. Run it on a schedule to get only what is new since the last run. About 10 latest stories per feed. No login.

Pricing

from $0.80 / 1,000 articles

Rating

0.0

(0)

Developer

Northbell

Northbell

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Categories

Share

Give it Medium tags, publications or writers and get one clean row per story: title, link, publish date, tags, a plain-text excerpt, word count and reading time. $1.00 per 1,000 articles, no login, no API key.

Run it again — or put it on a schedule — and every row also tells you what changed since the last run: whether the story is new, where it stood in the feed last time and how far it moved. Switch on Only stories new since the last run and you pay only for stories you have not been given before.

What you get

FieldWhat it is
source, sourceTypethe tag, publication or @handle the story came from, and whether it is a tag, publication or user
rankplace in the feed, 1 = newest
title, url, guidthe story, Medium's short link to it (https://medium.com/p/<id>, opens the story) and Medium's own ID for it
publishedAt, updatedAtwhen it was published and last edited (ISO time)
tagsthe tags the writer put on the story
excerptplain text, at most 2,000 characters, with HTML and entities removed and email addresses and phone numbers taken out
hasFullTexttrue when the feed carried the whole story, false when it carried only a one-sentence preview
wordCount, readingTimeMinutescounted from the full text (reading time = words / 265, one decimal). null when hasFullText is false — a preview is not the story
imageUrlthe lead picture, when the story has one
isNewSinceLastRun, previousRank, rankChange, previousRunAtthe change since your previous run of the same source (null on the first run). rankChange is positive when the story moved up the feed
observedAtwhen this row was read

Sources that cannot be read give a free row with type: "error" and a message; every other row has type: "article".

Use it for

  • Content and trend monitoring — watch the tags and publications in your field and see each new story once
  • Competitor and creator tracking — follow a company's publication or a writer's feed and get new posts as rows you can send to Sheets, Slack or a newsletter tool
  • Research datasets — titles, tags, dates and excerpts for topic and keyword analysis (full text only where Medium puts it in the feed, see Notes)

Input

{ "sources": ["artificial-intelligence", "https://medium.com/towards-data-science", "@ev"], "maxArticlesPerSource": 50, "onlyNew": false }
  • Tag: artificial-intelligence, Artificial Intelligence or #ai. A bare word is always a tag.
  • Publication: a URL such as https://medium.com/towards-data-science (or pub:towards-data-science).
  • Writer: @handle or https://medium.com/@handle.
  • A https://<name>.medium.com address also works.

What was already given is remembered per source in a named key-value store in your Apify account, so the second run of the same Actor already shows the changes. Schedule it (Apify → Schedules) to keep a running feed.

Pricing

$1.00 per 1,000 articles, plus $0.01 per run. Error rows (an unknown publication, a tag Medium does not have, an address that is not a Medium source) are free. The $0.01 run-start fee is the one charge every run pays, even one that returns nothing.

Notes

  • Medium's feeds hold only about the 10 latest stories each. That is Medium's limit, so Max articles per source can cap the result but never raise it. You collect more by running on a schedule.
  • Busy tags move fast. The 10 stories in a tag feed can cover only a short time: on 10/8 that was about 25 minutes for artificial-intelligence, 1.4 hours for programming, 2.3 hours for startup and 11 hours for rust. Medium serves each feed from a cache that can be up to about 15 minutes behind (on 10/8 the feeds we read had been built 0 to 15 minutes before we read them, and a feed read twice 4 minutes apart did not change), so running more often than every 15 minutes mostly returns the same stories. For a busy tag run it every 15 minutes, or choose a narrower tag, a publication or a writer. Stories published between two runs that fall off the end of the feed cannot be recovered.
  • Full text only sometimes. Tag feeds carry a one-sentence preview. Publication and writer feeds carry the whole story for some stories (in the feeds checked, 3 of 10 in one publication and 10 of 10 in one writer), and a preview for the others. That is why wordCount and readingTimeMinutes are null on every row from a tag feed, and on preview-only rows elsewhere; hasFullText tells you which rows have them. Japanese and Chinese text is counted at two characters to a word.
  • A tag Medium does not know returns an empty feed rather than an error, so you get a free error row saying so: check the spelling against medium.com/tag/<tag>. Medium's tags have no dots or symbols (nodejs, csharp, cpp); dots are removed for you, symbols are not.
  • Medium limits how fast it answers one client. The Actor spaces its requests, retries a refused one twice (after 5 and then 10 seconds) and otherwise returns a free error row for that source; run that source again a few minutes later.
  • A story tagged with two of your sources appears once for each source; use guid to remove duplicates. rank is the place in the full feed even when Only stories new since the last run hides older rows. The first run of a source returns everything the feed has (up to Max articles per source) and leaves the since-last-run fields null. A story that the cap left out counts as not given: the next run returns it with isNewSinceLastRun true (its previousRank is where it stood in the feed last time).
  • Public data only: what anyone sees without signing in. Writers' names and handles are not returned: url is Medium's short link, not the link with the writer's @handle in it. Email addresses and phone numbers are removed from excerpts.

To follow other newsletters and blogs, see Substack Scraper and RSS Feed Reader.

For AI agents

{"sources": ["artificial-intelligence"], "maxArticlesPerSource": 5} returns up to 5 rows with title, link, date, tags and a short excerpt. Rows have type: article or error. Use "onlyNew": true on a schedule to get only unseen stories; wordCount is null unless hasFullText is true.

**Something broke or looks wrong?** Open an issue on this Actor's Issues tab and I'll look at it. **Found it useful?** A short review on the Store page helps other people find it.