Medium Posts Scraper avatar

Medium Posts Scraper

Pricing

from $6.50 / 1,000 medium story rows

Go to Apify Store
Medium Posts Scraper

Medium Posts Scraper

A scraper for public Medium story feeds: the newest posts for any tag, author or publication, with title, canonical URL, author, tags, publish time, teaser and full public body text. No login, no cookies, no challenge bypass.

Pricing

from $6.50 / 1,000 medium story rows

Rating

0.0

(0)

Developer

Leonardo Santos

Leonardo Santos

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Scrape public Medium story feeds: the newest posts for any tag, author handle or publication, or resolve specific public post URLs into the same typed rows. Every row is flat, typed and null-safe for SEO research, content monitoring, spreadsheets and pipelines.

Why this actor?

  • Two buyer-shaped modes: search (list the newest stories of tag, author and publication feeds) and detail (resolve exact post URLs).
  • One flat row per story: title, canonical URL, author, tags, publish time, teaser and — where the feed carries it — the full public body text.
  • Hard local bounds on sources and rows keep delivery and spend predictable.
  • Invalid or unknown tags/authors/publications, empty feeds, unresolvable post URLs and blocked fetches are free error rows.
  • Public feed surface only: no login, no cookies, no challenge bypass, no media download.

Input

{"mode":"search","tags":["web-scraping"],"maxItemsPerSource":10}

For detail mode, set mode to detail and provide postUrls.

InputMeaning
modesearch (list feeds) or detail (resolve exact post URLs).
tagsMedium tag slugs, e.g. web-scraping; or medium.com/tag/… URLs.
authorsMedium author handles, e.g. @tripathi.ha; or medium.com/@handle URLs.
publicationsMedium publication slugs, e.g. medium-engineering.
postUrlsdetail mode: public post URLs, deduplicated and capped at 50.
maxItemsPerSourceHard local cap of rows per source (1–10).
includeBodyHtmlWhen true, rows carry the feed's full public story HTML.
proxyConfigurationProxy for Medium feed requests; datacenter is the default.

Up to 20 sources per run across tags + authors + publications.

Output

{"mode":"search","input":"web-scraping","source_type":"tag","source":"web-scraping","post_id":"2a038f5ae896","url":"https://medium.com/@tripathi.ha/build-a-multi-site-competitor-price-monitor-in-10-minutes-no-selectors-no-selenium-2a038f5ae896","title":"Build a Multi-Site Competitor Price Monitor in 10 Minutes (No Selectors, No Selenium)","author":"Tripathi Harsh","author_handle":"tripathi.ha","tags":["ai-scraping","web-scraping","python","llm","ai"],"published_at":"2026-09-18T08:49:53.000Z","updated_at":"2026-09-18T08:49:53.274Z","snippet":"How to automate e-commerce price intelligence, Slack webhook alerts, and zero-cost GitHub Actions scheduling.","body_html":null,"body_text":null,"word_count":null,"image_url":null,"error":null,"scraped_at":"2026-09-18T10:12:41.000Z"}
FieldMeaning
modeWhich mode produced the row: search or detail.
inputThe source exactly as provided (tag, handle, publication, or post URL).
source_typetag, author or publication in search mode; post in detail mode.
sourceNormalized source key (tag slug, handle, publication slug); null when the input could not be normalized.
post_idMedium post id — the 12-hex tail of the story URL.
urlCanonical public story URL, query string stripped.
titleStory title.
authorDisplay name of the story's author.
author_handle@handle when the story link carries one; null for publication paths.
tagsStory tags from the feed; always an array, possibly empty.
published_atPublish time, ISO 8601 (feed pubDate, falling back to atom:updated).
updated_atFeed update time, ISO 8601.
snippetTeaser text only the tag feeds carry; null on author/publication feeds.
body_htmlFull public story HTML when the source feed carries it and includeBodyHtml is not false.
body_textPlain text derived from the full public story HTML; null when the feed carries no body.
word_countWord count of body_text.
image_urlFirst image referenced by the feed item, if any.
errorFree per-input error message; null on story rows.
scraped_atExtraction timestamp.

Pricing

Pay per event, and the platform usage is on us — the price you see is the price you pay, with no compute bill on top.

EventPriceWhat one charge buys
Medium story row$0.01One delivered public Medium story row from a public feed: title, canonical URL, author, tags, publish time, teaser and — on author/publication feeds — the full public body text. An invalid or unknown tag/author/publication, a feed with no stories, an unresolvable post URL, and any blocked, 5xx or timeout fetch are free error rows and are never charged.
Actor Start$0.002One run, whatever it returns.

Higher Apify subscription tiers pay less on every event (Silver −20%, Gold −35%).

Proxy

Requests use the Apify proxy configured in proxyConfiguration. The validated default is datacenter. This actor does not bypass challenges, log in, or read private pages. Per-run residential bandwidth (only relevant if a run explicitly selects the residential tier) is capped by proxyGbytesCap in .actor/publish.json.

Modes and limits

  • search — one feed fetch per source (medium.com/feed/tag/<tag>, medium.com/feed/@<handle>, medium.com/feed/<publication>), newest first. A public Medium feed exposes at most 10 items and has no page parameter, so maxItemsPerSource (1–10) is the whole pagination surface; rows are deduplicated across sources so a story appearing in a tag feed and its author's feed is never charged twice.
  • detail — each public post URL is resolved through its own author or publication feed, so a post resolves while it is among that feed's newest 10 public items. /p/<id>-style links that do not name their source are free error rows.

Use cases

  • Watch what a tag publishes without opening Medium.
  • Track a set of authors or publications and pull their newest stories.
  • Build a dated story index (title, URL, author, tags, publish time) for SEO work.
  • Pull the public full text of the newest stories of an author or publication.
  • Resolve specific story URLs into typed rows for a spreadsheet or pipeline.

FAQ

Does this need a Medium account? No. Only the public feed documents are read.

Why is snippet null on author feeds? Medium's author/publication feeds carry the full body in content:encoded instead of a teaser; tag feeds are the opposite. The keys are always present.

Why is body_text null on some rows? Medium omits the body for some feed items (cross-posted or link stories); the row carries everything else, and the keys stay null-safe.

Does a detail lookup work for any old story? No — a public feed lists only its newest 10 items, so older stories resolve as a free "not found in the latest items" error row.


This Actor is an independent tool and is not affiliated with Medium.