Extract structured data from medium.com β Medium articles by tag, author or publication: title, byline, publication, tags, publish and update dates, and the article text as HTML, plain text and Markdown where the source provides it. Incremental mode returns only new or changed posts.
Medium Scraper [Just π°$1.79] on Apify β
No credit card required. No commitment. Cancel anytime.
- Click sign up β pick GitHub, Google, or email; takes ~30 seconds
- Open this actor β input is pre-filled with a working example
- Click Start β export results as JSON, CSV, or Excel
Your $5 monthly platform credit is enough to run this actor right away β and again every month β scraping typically several hundred to several thousand results per run, depending on your input.
Search with filters β Search by keyword. Filter by π description format, and more.
Detail enrichment β Fetch structured metadata for each record.
Incremental mode β Only get new or changed records since your last run. Content hash per record β no duplicates, no re-processing.
Change classification β Track unchanged across runs. Build audit trails of how records evolve over time.
Compact output β Emit core fields only (AI-agent / MCP-friendly). Keeps response size small for LLM workflows.
Description truncation β Cap description length per ${NOUN} to control output size and cost.
Result cap β Stop after N records (up to 1.000). Set to 0 for the full catalog.
Export anywhere β Download as JSON, CSV, or Excel. Stream via Apify API, webhooks, or integrations with Make, Zapier, Airbyte, Keboola.
Structured data β Every record returns the same schema with consistent field naming. All fields always present β null when unavailable, never omitted.
Data pipeline automation Integrate with your ETL pipeline to collect structured records from medium.com on a schedule. Export to CSV, JSON, or directly to your database. Use compact mode to control output size.
Market research Monitor records, track trends, and analyze market dynamics with structured, deduplicated data from medium.com.
Change monitoring Run daily or hourly in incremental mode to capture only new, updated, or expired ${NOUNS}. Perfect for price-tracking, churn analysis, and alerting pipelines.
AI / LLM training data Structured JSON per record is ready for RAG pipelines, embeddings, and agent workflows. Compact mode trims tokens for LLM context windows.
{
"query": "python",
"maxResults": 100,
"includeDetails": true,
"descriptionMaxLength": 0,
"compact": false,
"excludeEmptyFields": false,
"incrementalMode": false,
"emitUnchanged": false,
"notifyOnlyChanges": false,
"notificationLimit": 5,
"descriptionFormat": "all"
}| Parameter | Type | Default | Description |
|---|---|---|---|
query |
string | β | What to collect articles from. A topic tag (python, machine learning), an author handle with the @ (@quincylarson), or a publication slug (towards-data-science). Paste a JSON array to run several in one go β ["python", "rust", "@quincylarson"] β which is also how you get more than one surface's worth of articles. |
startUrls |
array | [] |
Paste tag, author or publication pages instead of typing names β e.g. https://medium.com/tag/python, https://medium.com/@quincylarson, https://medium.com/towards-data-science. Feed URLs (/feed/tag/python) work too. Each URL becomes its own search and results are merged and deduplicated across all of them. When supplied, these replace the search field. |
maxResults |
integer | 100 |
Maximum total articles to return (0 = no limit). Medium publishes only the newest posts per tag, author or publication, so a single search returns roughly ten articles β raise the count AND pass several searches to collect more. |
includeDetails |
boolean | true |
Fetch each article's complete body where the author publishes it in full. Off = title, byline, tags, image and teaser only, which is faster. |
descriptionMaxLength |
integer | 0 |
Truncate the plain-text and Markdown body to N characters. 0 = no truncation. The HTML body is left intact β cutting markup mid-tag breaks whatever parses it downstream. |
compact |
boolean | false |
Headline fields only β title, byline, publication, tags, timestamps, image and teaser, without the article body. Keeps records small for AI-agent/MCP workflows. |
excludeEmptyFields |
boolean | false |
Drop null / empty-string / empty-array fields (and fully-null nested objects like socialProfiles) from each record. Off by default to preserve dataset schema compatibility; turn on to slim output for LLM / agent consumption. |
incrementalMode |
boolean | false |
Compare against the previous run and return only new or edited articles β the point of a scheduled run against a stream of posts. stateKey is optional; it defaults to a value derived from the searches so different search sets never share state. |
stateKey |
string | β | Optional. Stable identifier for the tracked set of searches. Leave empty to auto-generate from the search inputs. |
emitUnchanged |
boolean | false |
Also return articles that have not changed since the last run (incremental mode only). |
notifyOnlyChanges |
boolean | false |
When Incremental Mode is on, only send notifications for new and edited articles. Has no effect outside incremental mode. |
notificationLimit |
integer | 5 |
Maximum number of articles included in each notification message (1β20). |
telegramToken |
string | β | Telegram bot token (from @BotFather). Required for Telegram notifications. |
telegramChatId |
string | β | Telegram chat or channel ID (e.g. "-100123456789"). Required when telegramToken is set. |
discordWebhookUrl |
string | β | Discord incoming webhook URL. Server Settings β Integrations β Webhooks β New Webhook. |
slackWebhookUrl |
string | β | Slack incoming webhook URL. api.slack.com/messaging/webhooks. |
whatsappPhoneNumberId |
string | β | Your WhatsApp Business phone-number ID (numeric, from Meta dashboard). Required when whatsappAccessToken is set. |
whatsappAccessToken |
string | β | WhatsApp Cloud API permanent access token (System User token from Meta Business). Recipient must have messaged the business number within the last 24h (service-conversation window β free since Nov 2024). |
whatsappTo |
string | β | Recipient phone in E.164 format without + (e.g. "436641234567"). Recipient must have messaged your business number within last 24h. |
webhookUrl |
string | β | Receives a JSON POST with {metadata, items} after each run. Universal escape hatch for n8n / Make / Zapier / custom backends. |
webhookHeaders |
object | β | Optional JSON object of custom headers (e.g. {"Authorization":"Bearer ..."}). |
appConnector |
string | β | Optional. Pick a connected app under Settings β API & Integrations to receive your results. Best-effort across MCP connectors as Apify expands its catalog. |
mcpIssueTeam |
string | β | Only when the connected app is an issue tracker: the team (name or ID) the summary issue is created under, if that app requires one. |
descriptionFormat |
enum | "all" |
Choose which representation of the listing description to include. all keeps every variant; the others keep only the selected one. |
Every record returns the same 27-field schema. Missing values are null β never omitted.
idtitleurlportalUrlauthorpublicationpublishedAtupdatedAtcategoriestagsexcerptcontentHtmlcontentTextcontentMarkdownimageUrlreadingTimefeedUrlextractedEmailsextractedUrlssocialProfilessearchQuerycontentQualitydetailFetchedscrapedAtsourcecontentHashchangeType
One object per record. Here is a real example from a production run:
{
"id": "428ee98273fb",
"title": "Introduction to Computer Vision with Python",
"url": "https://medium.com/@kaivalya25comp/introduction-to-computer-vision-with-python-428ee98273fb",
"portalUrl": "https://medium.com/@kaivalya25comp/introduction-to-computer-vision-with-python-428ee98273fb",
"author": "Kaivalya Thombare",
"publication": null,
"publishedAt": "2026-10-04T10:40:26.000Z",
"updatedAt": "2026-10-04T10:40:26.941Z",
"categories": [
"python",
"machine-learning",
"programming",
"education",
"usp"
],
"tags": [
"python",
"machine-learning",
"programming",
"education",
"usp"
],
"excerpt": "Introduction to Computer Vision with Python",
"contentHtml": "<div class=\"medium-feed-item\"><p class=\"medium-feed-image\"><a href=\"https://medium.com/@kaivalya25comp/introduction-to-computer-vision-with-python-428ee98273fb?source=rss------pythβ¦"
}Truncated β full records contain 27 fields. See Output fields for the complete schema.
Try Medium Scraper [Just π°$1.79] now β $5 free credit, no credit card β
Pay only for what you extract. No subscription required β Apify's free $5 credit covers thousands of results.
| Event | Price (USD) |
|---|---|
| Actor Start | $0.01 |
| Result | $0.001791 |
See the actor on Apify for current pricing.
How do I scrape medium.com? Use this actor on Apify to extract structured data from medium.com. Configure your search query and filters in the input, then click Start β no coding required.
How do I get medium.com data as JSON, CSV, or Excel? The actor writes each record to Apify's dataset. Download as JSON, CSV, or Excel from the Console, stream via the API, or push to Make, Zapier, Airbyte, or Keboola.
Is it legal to scrape medium.com? Web scraping of publicly available data is generally legal. This actor only accesses publicly visible information. Always check medium.com's terms of service for your specific use case.
How much does it cost? Pay-per-event pricing β you only pay for ${NOUNS} extracted. Apify's free $5 credit is enough to run thousands of results before you pay anything.
How does incremental mode work? Each record gets a content hash. On subsequent runs, only new or changed records are emitted β saving time, compute, and storage. Expired records can be tracked separately.
Do I need an API key or credentials? No. Just sign up for Apify, paste your input, and click Start. No credit card required.
Browse all Black Falcon Data actors β
New to Apify? Create a free account with $5 credit β no credit card required.
- Sign up β $5 platform credit included
- Open Medium Scraper [Just π°$1.79] and configure your input
- Click Start β export results as JSON, CSV, or Excel
Need more later? See Apify pricing.
Black Falcon Data builds production-grade web scrapers for job boards and marketplace data. Browse our full actor catalog at www.blackfalcondata.com.
Last updated: 2026 10