# Medium API

> Medium returns public articles, article details, and engagement data as a workflow and API.

Medium lists a writer’s or publication’s latest public articles, using a username, publication name, or profile link as input. Medium lists public articles by topic in newest or popular-this-week order, using a topic and optionally a sort order. Medium reads an article’s publicly visible text and details from its link; member-only articles include only public previews.

- Page: https://fous.com/workflows/medium
- Handle: `@medium`
- Category: [Social](https://fous.com/workflows/category/social)
- Source website: https://medium.com
- Last verified: Sep 29, 2026
- Fous is not affiliated with Medium.

## Methods

### List author articles

Operation `list_author_articles`, version 1. 1 credit per call.

List the latest public articles by a Medium writer or publication, with dates, reading times, claps, member-only labels, and tags. Includes article details visible without signing in; member-only articles are not opened.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `author` | string | yes | `"@ev"` | Writer username with or without @, publication name, or Medium profile or publication link. Example: @ev or Towards Data Science. |
| `max_results` | integer | no | `10` | Maximum number of latest articles to return. Example: 10. |

**Input schema**

```json
{
  "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.",
      "examples": [
        "@ev",
        "https://medium.com/swlh",
        "ev"
      ]
    },
    "max_results": {
      "type": "integer",
      "default": 10,
      "maximum": 25,
      "minimum": 1,
      "description": "Maximum number of latest articles to return. Example: 10.",
      "x-fous-developer": true,
      "examples": [
        10,
        3,
        2
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "author": "@ev",
      "max_results": 10
    },
    {
      "author": "https://medium.com/swlh",
      "max_results": 3
    },
    {
      "author": "ev",
      "max_results": 2
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `link` | string | `"https://medium.com/@ev"` | Medium writer or publication page link. |
| `name` | string | `"Ev Williams"` | Medium writer or publication name. |
| `articles` | array |  | Latest articles, newest first. |
| `articles[].link` | string | `"https://ev.medium.com/making-social-social-again-0126fa5c6ce8"` |  |
| `articles[].tags` | array |  |  |
| `articles[].claps` | integer or null | `3542` |  |
| `articles[].title` | string | `"Making “Social” Social Again"` |  |
| `articles[].author` | string or null | `"Ev Williams"` |  |
| `articles[].subtitle` | string or null | `"Announcing Mozi"` |  |
| `articles[].member_only` | boolean or null | `false` |  |
| `articles[].published_date` | string or null | `"2024-12-12"` |  |
| `articles[].reading_time_minutes` | integer or null | `8` |  |

**Example input**

```json
{
  "author": "@ev",
  "max_results": 10
}
```

**Example output**

```json
{
  "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
    }
  ]
}
```

### List topic articles

Operation `list_topic_articles`, version 1. 1 credit per call.

List public Medium topic articles in newest or popular-this-week order, with author, publication, reading time and membership status. Popular reflects Medium’s weekly ranking.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `sort` | string | no | `"popular"` | Article order, for example popular (this week). |
| `topic` | string | yes | `"artificial intelligence"` | Topic to explore, for example artificial intelligence. |
| `max_results` | integer | no | `10` | Maximum articles to return, for example 10 (up to 25). |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "topic"
  ],
  "properties": {
    "sort": {
      "enum": [
        "latest",
        "popular"
      ],
      "type": "string",
      "default": "latest",
      "description": "Article order, for example popular (this week).",
      "examples": [
        "popular",
        "latest"
      ]
    },
    "topic": {
      "type": "string",
      "minLength": 1,
      "description": "Topic to explore, for example artificial intelligence.",
      "examples": [
        "artificial intelligence",
        "leadership",
        "zzznosuchtopicqqq"
      ]
    },
    "max_results": {
      "type": "integer",
      "default": 10,
      "maximum": 25,
      "minimum": 1,
      "description": "Maximum articles to return, for example 10 (up to 25).",
      "x-fous-developer": true,
      "examples": [
        10,
        25
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "topic": "artificial intelligence"
    },
    {
      "sort": "popular",
      "topic": "leadership",
      "max_results": 10
    },
    {
      "topic": "zzznosuchtopicqqq"
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `articles` | array |  |  |
| `articles[].link` | string | `"https://medium.com/@NIDAM_/how-to-use-ai-to-make-9k-each-month-9016df1849a2"` |  |
| `articles[].claps` | integer or null | `0` |  |
| `articles[].title` | string | `"How To Use AI To Make $9K Each Month"` |  |
| `articles[].author` | string or null | `"NIDA M."` |  |
| `articles[].subtitle` | string or null | `"There are a feww ways to make AI make you income."` |  |
| `articles[].member_only` | boolean | `true` |  |
| `articles[].publication` | string or null |  |  |
| `articles[].published_date` | string or null | `"2026-09-29"` |  |
| `articles[].reading_time_minutes` | integer or null | `2` |  |

**Example input**

```json
{
  "topic": "artificial intelligence"
}
```

**Example output**

```json
{
  "articles": [
    {
      "link": "https://medium.com/@NIDAM_/how-to-use-ai-to-make-9k-each-month-9016df1849a2",
      "claps": 0,
      "title": "How To Use AI To Make $9K Each Month",
      "author": "NIDA M.",
      "subtitle": "There are a feww ways to make AI make you income.",
      "member_only": true,
      "publication": null,
      "published_date": "2026-09-29",
      "reading_time_minutes": 2
    },
    {
      "link": "https://sumanthpoola.medium.com/it-was-2-am-our-payment-service-was-down-the-bug-was-one-line-883152c1b4d2",
      "claps": 0,
      "title": "It Was 2 AM. Our Payment Service Was Down. The Bug Was One Line.",
      "author": "Sumanth | Java & AI",
      "subtitle": "Not one line of bad code. One line of misplaced faith in an annotation.",
      "member_only": true,
      "publication": null,
      "published_date": "2026-09-29",
      "reading_time_minutes": 4
    },
    {
      "link": "https://medium.com/@sudiptokanti/building-health-watcher-an-explainable-ai-system-for-wearable-event-detection-1b30b9b607d4",
      "claps": 0,
      "title": "Building Health-Watcher: An Explainable AI System for Wearable Event Detection",
      "author": "Sudipto K Haldar",
      "subtitle": "How public sensor datasets, subject-level validation, interpretable models, persistence gates, model cards, and an operator-centered…",
      "member_only": false,
      "publication": null,
      "published_date": "2026-09-29",
      "reading_time_minutes": 13
    }
  ]
}
```

### Read article

Operation `read_article`, version 1. 1 credit per call.

Read a public Medium article, including its details, engagement counts and plain-text paragraphs. Member-only stories include only the publicly visible preview; full text is not available without membership.

**Input**

| Field | Type | Required | Example | Description |
|---|---|---|---|---|
| `article` | string | yes | `"https://medium.com/@tarasjseaks/why-i-only-write-for-medium-0b8c500134a1"` | Link to a Medium article, including a publication’s own domain, such as https://medium.com/@tarasjseaks/why-i-only-write-for-medium-0b8c500134a1. |

**Input schema**

```json
{
  "type": "object",
  "required": [
    "article"
  ],
  "properties": {
    "article": {
      "type": "string",
      "description": "Link to a Medium article, including a publication’s own domain, such as https://medium.com/@tarasjseaks/why-i-only-write-for-medium-0b8c500134a1.",
      "examples": [
        "https://medium.com/@tarasjseaks/why-i-only-write-for-medium-0b8c500134a1",
        "https://medium.com/ask-an-editor/yippee-your-medium-response-is-relevant-509fe1e041bb",
        "https://python.plainenglish.io/i-added-type-hints-everywhere-then-took-half-of-them-out-f2aed65d2717"
      ]
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "article": "https://medium.com/@tarasjseaks/why-i-only-write-for-medium-0b8c500134a1"
    },
    {
      "article": "https://medium.com/ask-an-editor/yippee-your-medium-response-is-relevant-509fe1e041bb"
    },
    {
      "article": "https://python.plainenglish.io/i-added-type-hints-everywhere-then-took-half-of-them-out-f2aed65d2717"
    }
  ]
}
```

**Output**

| Field | Type | Example | Description |
|---|---|---|---|
| `tags` | array |  | Article tags. |
| `claps` | integer | `29` | Number of claps. |
| `title` | string | `"Why I Only Write for Medium"` | Article title. |
| `author` | string | `"Taras J Seaks"` | Author name. |
| `subtitle` | string or null | `"And why this story is free to read"` | Article subtitle, if any. |
| `responses` | integer | `2` | Number of responses. |
| `paragraphs` | array |  | Publicly visible text in reading order, with headings as separate paragraphs. |
| `member_only` | boolean | `false` | Whether the article is member-only. |
| `publication` | string or null | `"Ask an Editor"` | Publication name, if the story is in one. |
| `article_link` | string | `"https://medium.com/@tarasjseaks/why-i-only-write-for-medium-0b8c500134a1"` | Article page link. |
| `published_date` | string | `"2024-03-20"` | Original publication date. |
| `main_image_link` | string or null | `"https://miro.medium.com/0*nwz5ReKI2u2dF-AV"` | Main image link, if any. |
| `full_text_available` | boolean | `true` | Whether the complete text is publicly available. |
| `reading_time_minutes` | integer | `6` | Reading time shown to readers, in minutes. |

**Example input**

```json
{
  "article": "https://medium.com/@tarasjseaks/why-i-only-write-for-medium-0b8c500134a1"
}
```

**Example output**

```json
{
  "tags": [
    "Writing",
    "Community",
    "Mission"
  ],
  "claps": 29,
  "title": "Why I Only Write for Medium",
  "author": "Taras J Seaks",
  "subtitle": "And why this story is free to read",
  "responses": 2,
  "paragraphs": [
    "Why I Only Write for Medium",
    "And why this story is free to read",
    "Writers don’t just write to write. In some cases, we do. But in most cases, it’s to share an important message. This is as true for novels as it is for self-development content and everything surround…"
  ],
  "member_only": false,
  "publication": null,
  "article_link": "https://medium.com/@tarasjseaks/why-i-only-write-for-medium-0b8c500134a1",
  "published_date": "2024-03-20",
  "main_image_link": "https://miro.medium.com/0*nwz5ReKI2u2dF-AV",
  "full_text_available": true,
  "reading_time_minutes": 6
}
```

## Quick start

Call the API with a Fous API key (`FOUS_API_KEY`). To create one, turn on Developer mode in Fous Studio, then open Keys & connections → API keys (https://app.fous.com/keys).

```bash
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
: "${FOUS_API_KEY:?Set FOUS_API_KEY before running this example}"

curl 'https://api.fous.com/v1/query' \
  --fail-with-body --silent --show-error --max-time 120 \
  -H "Authorization: Bearer $FOUS_API_KEY" \
  -H 'Content-Type: application/json' \
  --data-raw '{
  "api": "@medium",
  "visibility": "public",
  "operation": "list_author_articles",
  "version": 1,
  "input": {
    "author": "@ev",
    "max_results": 10
  },
  "response": {
    "format": "json"
  }
}'
```

```python
# Save as fous.py and run with python3 fous.py. No packages needed.
# First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
import json
import os
import urllib.error
import urllib.request

api_key = os.environ.get("FOUS_API_KEY")
if not api_key:
    raise RuntimeError("Set FOUS_API_KEY before running this example")

body = json.loads("{\n  \"api\": \"@medium\",\n  \"visibility\": \"public\",\n  \"operation\": \"list_author_articles\",\n  \"version\": 1,\n  \"input\": {\n    \"author\": \"@ev\",\n    \"max_results\": 10\n  },\n  \"response\": {\n    \"format\": \"json\"\n  }\n}")
request = urllib.request.Request(
    "https://api.fous.com/v1/query",
    data=json.dumps(body).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    method="POST",
)
try:
    with urllib.request.urlopen(request, timeout=120) as response:
        result = json.load(response)
except urllib.error.HTTPError as error:
    raise RuntimeError(f"HTTP {error.code}: {error.read().decode('utf-8', errors='replace')}") from error
if result.get("success") is False:
    raise RuntimeError(result.get("error", {}).get("message", "Request failed"))
print(json.dumps(result["data"]["output"], indent=2))
```

```typescript
// Save as fous.mts and run with npx tsx fous.mts.
// First set your key: export FOUS_API_KEY='YOUR_FOUS_API_KEY'
const apiKey = process.env.FOUS_API_KEY;
if (!apiKey) throw new Error("Set FOUS_API_KEY before running this example");

const response = await fetch("https://api.fous.com/v1/query", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  signal: AbortSignal.timeout(120_000),
  body: JSON.stringify({
  "api": "@medium",
  "visibility": "public",
  "operation": "list_author_articles",
  "version": 1,
  "input": {
    "author": "@ev",
    "max_results": 10
  },
  "response": {
    "format": "json"
  }
}),
});
type ApiResult = { success: boolean; data?: { output: unknown }; error?: { message: string } };
const result: ApiResult = await response.json();
if (!response.ok || result.success === false) {
  throw new Error(result.error?.message ?? `HTTP ${response.status}`);
}
if (!result.data) throw new Error("Missing API response data");
console.log(result.data.output);
```

Or describe the data in plain language: send `{"api":"@medium","prompt":"Describe the data you need, with every detail"}` to the same URL. Fous fills in the input, runs the method that fits and returns only the fields you asked for; `data.route.calls[].request` is the exact call it made. Routing is free; the run costs the same.

## Use cases

- Track a writer’s latest articles and claps
- Explore popular weekly articles by topic
- Compare article reading times and publication dates
- Review visible article text and response counts
- Collect article titles, tags, and authors

## FAQ

### Is Fous affiliated with Medium?

No. Fous is not affiliated with Medium. This workflow reads the public medium.com website and returns its data.

### How much does it cost?

Each run costs 1 credit. With pay-as-you-go, a credit costs 1¢; monthly plans cost less per credit.

### Do I need a Medium account?

No. You only need a Fous account.

### How current is the data?

Fous gets the data from medium.com when you run it; repeating the same request within a day may return the saved result. Fous checks this workflow automatically; it last passed a check on Sep 29, 2026.

### Which articles has a writer published recently?

Use List author articles with a writer username, publication name, or profile link.

### What articles are popular this week on a topic?

Use List topic articles with the topic and popular (this week) sort.

### What does a public article say?

Use Read article with the article link to get publicly visible text and details.

## Related

- [The Guardian API](https://fous.com/workflows/the-guardian.md): The Guardian provides news, sport, culture and opinion, ordered headlines, keyword-search results that may omit older or less prominent stories, and article details with available text; live blogs show the latest entries.
- [AP News API](https://fous.com/workflows/ap-news.md): AP News provides reporting, up to 50 public-page headlines, searchable articles visible in its search, and full text when accessible.
- [Substack API](https://fous.com/workflows/substack.md): Substack returns public newsletters and recent public post details or text; paid posts expose previews or metadata, and some custom-domain newsletters may be unavailable.
- [Threads API](https://fous.com/workflows/threads.md): Threads provides public profiles and posts, including recent posts, engagement and replies; private or login-only content is excluded, and replies may be limited to 10.
- [NPR API](https://fous.com/workflows/npr.md): NPR returns displayed section headlines, searchable articles with summaries and publication details, and available article text; date-filtered searches may miss older stories edited much later.
- [Daily Mail API](https://fous.com/workflows/daily-mail.md): Daily Mail provides ordered section headlines with available bylines and times, searches up to 200 published articles excluding syndicated wire stories, and reads public article text and details, including latest live-blog entries shown.
- [CNN API](https://fous.com/workflows/cnn.md): CNN provides section-page headlines and searchable public articles, plus article text; subscriber stories show only a brief public preview, and live blogs include entries.
- [Al Jazeera API](https://fous.com/workflows/al-jazeera.md): Al Jazeera provides news and analysis, current section headlines and article details, plus keyword-searchable articles; searches and live blogs may show only leading matches or latest updates.
- [All Social workflows](https://fous.com/workflows/category/social)
