# Medium API
> Read Medium posts in real time — no login or key needed. Pull the recent stories of any Medium user (@handle), any topic/tag, or any publication, straight from Medium's own public RSS feeds. Each post comes with its title, author, canonical link, publish date, categories/tags, a clean text excerpt and the full content HTML. Pass user = the @handle, tag = a topic slug, or publication = a publication slug; every call is live (no cache). 4 endpoints. Built for content aggregation, author/topic monitoring and reading-list back-ends. A Medium reader API. No upstream key, no cache.

## Authentication
All requests require your oanor API key in the `x-oanor-key` header. Get one at https://www.oanor.com/developer/keys.

```bash
curl -H "x-oanor-key: oanor_live_…" "https://api.oanor.com/medium-api/..."
```

## Pricing
- **Free** (Free) — 3,500 calls/Mo, 2 req/s
- **Starter** ($7/Mo) — 67,000 calls/Mo, 8 req/s
- **Pro** ($20/Mo) — 335,000 calls/Mo, 20 req/s
- **Mega** ($47/Mo) — 1,640,000 calls/Mo, 50 req/s

## Endpoints

### Medium

#### `GET /v1/publication` — Publication posts

**Parameters:**
- `publication` (query, required, string) — Publication slug Example: `better-programming`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/medium-api/v1/publication?publication=better-programming"
```

**Response:**
```json
{
    "data": {
        "feed": {
            "link": "https://betterprogramming.pub?source=rss----d0b105d10f0a---4",
            "image": "https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png",
            "title": "Better Programming - Medium",
            "description": "Advice for programmers. - Medium"
        },
        "count": 10,
        "items": [
            {
                "guid": "https://medium.com/p/bf37baef8f27",
                "link": "https://medium.com/better-programming/let-a-thousand-programming-publications-bloom-bf37baef8f27?source=rss----d0b105d10f0a---4",
                "title": "Let a thousand programming publications bloom.",
                "author": "Tony Stubblebine",
                "excerpt": "I’m putting Better Programming on hiatus to make room for other programming publications. I get that this is a big pivot given that we switched to a new editor recently. But things are changing at Medium and I think this will ultimately be a boon for everyone, authors, readers and publications. I wo",
                "updated": "2023-11-27T17:53:37.557Z",
                "published": "Fri, 10 Nov 2023 18:18:10 GMT",
                "categories": [],
                "content_html": "<h4>I’m putting Better Programming on hiatus to make room for other programming publications.</h4><p>I<em> get that this is a big pivot given that we switched to a new editor recently. But things are changing at Medium and I think this will ultimately be a
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/tag` — Tag posts

**Parameters:**
- `tag` (query, required, string) — Topic slug Example: `programming`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/medium-api/v1/tag?tag=programming"
```

**Response:**
```json
{
    "data": {
        "feed": {
            "link": "https://medium.com/tag/programming/latest?source=rss------programming-5",
            "image": "https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png",
            "title": "Programming on Medium",
            "description": "Latest stories tagged with Programming on Medium"
        },
        "count": 9,
        "items": [
            {
                "guid": "https://medium.com/p/36024bdb36c6",
                "link": "https://medium.com/techtofreedom/9-levels-of-profiling-python-apps-in-2026-from-cprofile-to-tachyon-36024bdb36c6?source=rss------programming-5",
                "title": "9 Levels of Profiling Python Apps in 2026: From cProfile to Tachyon",
                "author": "Yang Zhou",
                "excerpt": null,
                "updated": "2026-06-02T16:38:28.436Z",
                "published": "Tue, 02 Jun 2026 16:38:28 GMT",
                "categories": [
                    "technology",
                    "python",
                    "software-engineering",
                    "programming",
                    "coding"
                ],
                "content_html": null
            },
            {
                "guid": "https://medium.com/p/62467e5d41df",
                "link": "https://medium.com/@kp9810113/the-day-our-2-week-sprint-became-a-6-week-death-march-62467e5d41df?source=rss------programming-5",
                "title": "The Day Our 2-Week Sprint Became a 6-Week Deat
…(truncated, see openapi.json for full schema)
```

#### `GET /v1/user` — User posts

**Parameters:**
- `user` (query, required, string) — Medium @handle (without @) Example: `medium`

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/medium-api/v1/user?user=medium"
```

**Response:**
```json
{
    "data": {
        "feed": {
            "link": "https://medium.com/@Medium?source=rss-504c7870fdb6------2",
            "image": "https://cdn-images-1.medium.com/fit/c/150/150/1*8E6Laeaz-zMfU_rkpZUyKw.png",
            "title": "Stories by Medium on Medium",
            "description": "Stories by Medium on Medium"
        },
        "count": 10,
        "items": [
            {
                "guid": "https://medium.com/p/62edea66ffa4",
                "link": "https://medium.com/blog/updating-our-rules-june-2023-62edea66ffa4?source=rss-504c7870fdb6------2",
                "title": "Updating Our Rules — June 2023",
                "author": "Medium",
                "excerpt": "Updating Our Rules — June 2023 This month, we are updating our Rules . As the world evolves, so do the ways in which people use Medium. To accommodate this, we regularly assess our rules, and adjust them accordingly. We believe that through helping people share their experiences and viewpoints, we c",
                "updated": "2023-06-28T18:01:22.039Z",
                "published": "Wed, 28 Jun 2023 18:01:22 GMT",
                "categories": [
                    "rules",
                    "medium"
                ],
                "content_html": "<h3>Updating Our Rules — June 2023</h3><p>This month, we are updating our <a href=\"https://policy.medium.com/medium-rules-30e5502c4eb4\">Rules</a>. As the world evolves, so do the ways in which people use Medium. To accommodat
…(truncated, see openapi.json for full schema)
```

### Meta

#### `GET /v1/meta` — Spec

**Example:**
```bash
curl -H "x-oanor-key: $KEY" \
  "https://api.oanor.com/medium-api/v1/meta"
```

**Response:**
```json
{
    "data": {
        "auth": "none upstream; gateway requires x-api-key",
        "name": "Medium API",
        "note": "Live, no cache. Returns recent posts (RSS-limited, typically up to 10) with title, author, link, categories and full content HTML. user = @handle, tag = topic slug, publication = publication slug.",
        "source": "Medium public RSS feeds (medium.com/feed/...)",
        "endpoints": 4
    },
    "meta": {
        "timestamp": "2026-06-02T16:53:18.818Z",
        "request_id": "0730090c-9cd6-48bf-9e55-c174374c75db"
    },
    "status": "ok",
    "message": "Meta",
    "success": true
}
```


---
Marketplace page: https://www.oanor.com/api/medium-api
OpenAPI spec: https://www.oanor.com/api/medium-api/openapi.json
