Medium API: List a writer's or publication's latest articles
Lists the latest public articles by a Medium writer or publication (by username, publication name or Medium link), with dates, reading times, claps, member-only labels and tags.
Unofficial. Not affiliated with or endorsed by Medium.
Inputs
Values from the run on Oct 31, 2026, shown under Output.
- Author, required
author Writer username with or without @, publication name, or Medium profile or publication link. Example: @ev or Towards Data Science.
@ev
- Max Results optional
max_results Maximum number of latest articles to return. Example: 10.
10
Whole number from 1 to 25. Default
10.
Input as JSON
{ "author": "@ev", "max_results": 10}Output
{ "link": "https://medium.com/@ev" , "name": "Ev Williams", "articles": [ { "link": "https://ev.medium.com/making-social-social-again-0126fa5c6ce8" , "tags": [ "Social", "Relationships", "Startupş" ], "claps": 3542, "title": "Making “Social” Social Again", "author": "Ev Williams", "subtitle": "Announcing Mozi", "member_only": false, "published_date": "2024-12-12", "reading_time_minutes": 8 }, { "link": "https://ev.medium.com/do-not-disturb-3622b4ddc3d8" , "tags": [], "claps": 1782, "title": "Do not disturb", "author": "Ev Williams", "subtitle": "Can I assume when you’re in the zone\nYou’re not distracted by your phone\nShould I hold my texts\nAnd take time to reflect\nOr fire away…", "member_only": false, "published_date": "2023-12-09", "reading_time_minutes": 1 }, { "link": "https://ev.medium.com/how-you-can-help-the-amazon-rainforest-today-f394d68d4e7" , "tags": [], "claps": 2848, "title": "How you can help the Amazon Rainforest–today", "author": "Ev Williams", "subtitle": "Last week, Brazil’s Congress shocked the world by suddenly fast-tracking and passing PL2903, the Marco Temporal bill. This bill paves the…", "member_only": false, "published_date": "2023-06-05", "reading_time_minutes": 2 } ]}Code
curl https://api.fous.com/v1/runs \ -H "Authorization: Bearer $FOUS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"method":"medium.com/list_author_articles","input":{"author":"@ev","max_results":10}}' # Save as fous.py, then run: python3 fous.pyimport json, os, timefrom urllib.error import HTTPErrorfrom urllib.request import Request, urlopenAPI = "https://api.fous.com/v1/runs" KEY = os.environ["FOUS_API_KEY"]HEADERS = { "Authorization": f"Bearer {KEY}", "Content-Type": "application/json" ,}def call(url, body=None): data = json.dumps(body).encode() if body else None request = Request(url, data, HEADERS) try: with urlopen(request, timeout=120) as r: return r.status, json.load(r) except HTTPError as error: message = json.load(error)["error"]["message"] raise RuntimeError(message) from errorstatus, run = call(API, { "method": "medium.com/list_author_articles" , "input": { "author": "@ev", "max_results": 10 }})# 202: still going after 30 s. Ask again until it ends.while status == 202: time.sleep(2) status, run = call(f"{API}/{run['id']}")print(json.dumps(run["data"], indent=2))// Save as fous.mjs, then run: node fous.mjsconst api = "https://api.fous.com/v1/runs" ;const headers = { Authorization: `Bearer ${process.env.FOUS_API_KEY}`, "Content-Type": "application/json" ,};let response = await fetch(api, { method: "POST", headers, body: JSON.stringify({ "method": "medium.com/list_author_articles" , "input": { "author": "@ev", "max_results": 10 } }), signal: AbortSignal.timeout(120_000),});let run = await response.json();// 202: still going after 30 s. Ask again until it ends.while (response.status === 202) { await new Promise((done) => setTimeout(done, 2_000)); response = await fetch(`${api}/${run.id}`, { headers }); run = await response.json();}if (!response.ok) throw new Error(run.error.message);console.log(run.data);# Connect your agent to Fous once, over MCP (Streamable HTTP):# https://api.fous.com/mcp# Set FOUS_API_KEY first: create a key at https://app.fous.com/keys.# Claude Codeclaude mcp add \ --scope user \ --transport http fous https://api.fous.com/mcp \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Codexcodex mcp add fous \ --url https://api.fous.com/mcp \ --bearer-token-env-var FOUS_API_KEY# Cursor, VS Code, Windsurf, Cline and morenpx -y add-mcp https://api.fous.com/mcp -g -n fous \ --header "Authorization: Bearer ${FOUS_API_KEY:?Set FOUS_API_KEY to your Fous API key}"# Then ask your agent:# "Use Fous to run medium.com/list_author_articles# with {"author":"@ev","max_results":10}"Over HTTP, the answer’s data holds the output. A run still going after 30 seconds answers 202 with its id: ask GET /v1/runs/{id} until it ends.
Schema
Input schema
{ "type": "object", "required": [ "author" ], "properties": { "author": { "type": "string", "description": "Writer username with or without @, publication name, or Medium profile or publication link. Example: @ev or Towards Data Science." }, "max_results": { "type": "integer", "default": 10, "maximum": 25, "minimum": 1, "description": "Maximum number of latest articles to return. Example: 10." } }}Output schema
{ "type": "object", "required": [ "name", "link", "articles" ], "properties": { "link": { "type": "string", "description": "Medium writer or publication page link." }, "name": { "type": "string", "description": "Medium writer or publication name." }, "articles": { "type": "array", "items": { "type": "object", "required": [ "title", "subtitle", "author", "published_date", "reading_time_minutes", "claps", "member_only", "tags", "link" ], "properties": { "link": { "type": "string" }, "tags": { "type": "array", "items": { "type": "string" } }, "claps": { "type": [ "integer", "null" ] }, "title": { "type": "string" }, "author": { "type": [ "string", "null" ] }, "subtitle": { "type": [ "string", "null" ] }, "member_only": { "type": [ "boolean", "null" ] }, "published_date": { "type": [ "string", "null" ] }, "reading_time_minutes": { "type": [ "integer", "null" ] } } }, "description": "Latest articles, newest first." } }}- Price
- 1 credit per completed run (1¢ with pay as you go); failed runs are free.
- Method
medium.com/list_author_articles- Returns
- writer or publication name and link; each article's title, subtitle, author, date, reading time, claps, member-only flag, tags, link
Use it from your agent
Give your agent this line. It reads SKILL.md, gets a Fous API key and connects the Fous MCP server. Its run then takes the method medium.com/list_author_articles with the inputs above.
Ask your agent
- What has @karpathy posted lately on Medium? Give me the last 8 articles with clap counts and whether they're paywalled.
- Show me the 15 most recent stories from the Towards Data Science publication, including reading times and tags.
- Pull the latest articles from https://medium.com/@barackobama — titles, publish dates and links are enough.
- I'm checking out the writer Cassie Kozyrkov before subscribing. List her 5 newest posts, with claps and which ones are members-only.
- Get the 20 most recent pieces published by Better Programming on medium.com, with subtitles, authors and tags for each.
See more
All Medium methodsLists public Medium articles for a topic, newest first or popular this week, with author, publication, reading time, claps and membership status.
medium.com/list_topic_articlesReads a public Medium article from its link, including publication-domain links: details, engagement counts, tags and the plain-text paragraphs. Member-only stories include only the publicly visible preview.
medium.com/read_articleLists an account's latest public Bluesky posts, newest first. Replies and reposts are left out unless requested; a repost's time is when the account reposted it.
bsky.app/list_recent_postsLists an account's latest public Threads posts, newest first, with text, engagement counts, thumbnails and links. Only posts shown without logging in are returned.
threads.com/list_recent_postsLists a Mastodon account's latest public posts, newest first. Replies and boosts are optional. Private and unlisted posts are left out.
mastodon.social/list_recent_postsLists the latest publicly embeddable posts and reels from an Instagram account, newest first. Without login Instagram may show fewer posts than requested. View counts that are not available are null.
instagram.com/list_recent_postsFinds a Substack newsletter by name or web address and returns its latest public posts with dates, authors, access level and engagement counts.
substack.com/list_newsletter_postsLists recent public posts of a Tumblr blog, optionally only those with a given tag. Private or login-only blogs cannot be read.
tumblr.com/list_blog_posts