> **For coding agents and LLMs:** This is one Social Fetch marketing page (markdown export). For API orientation start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for auth and crawl rules use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for every operation use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt).

## This page

- **On-site (HTML):** <https://www.socialfetch.dev/platforms/medium>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/medium.mdx>

---

# Medium API. Feeds and sitemaps as JSON.

The newest ten posts by tag, author or publication, and the sitemap tree for backfills and discovery.

- Tag and author feeds
- Sitemap discovery
- 1 to 2 credits per request

Social Fetch exposes six routes under `/v1/medium`. The tag, author and publication routes return the newest ten posts of a tag, an author handle, or a publication slug or custom domain. Each post carries `postId`, `title`, `url`, `publishedAt`, `tags`, `contentHtml`, `contentText`, `wordCount` and `readingMinutes` when the article body is available. The sitemap routes list one day's post URLs or one day's entity URLs, paged with `page.nextCursor`, and the index route pages the available sitemap files by `kind` with a `date` and `lastModified`.

Every response uses the `{ data, meta }` envelope. Check `data.lookupStatus` before storing a row: `not_found` is a typed outcome, not an error. Cursors are opaque and only valid with the same filters.

## What you can get

- A tag's newest ten posts, with the snippet and first image when one is available.
- An author's ten newest posts across publications, with full article HTML when the article body is available.
- A publication's ten newest posts by Medium slug or custom domain, with an optional tag filter.
- One day's post sitemap, up to 500 URLs per page, for a deterministic backfill.
- Entity sitemaps for users, publications, tags, lists, topics, removed posts and removed users.
- The sitemap index, so you can name the files available for a kind before you page them.

## Medium endpoints

| Endpoint | Request | Credits | Docs |
| --- | --- | --- | --- |
| Tag posts | GET /v1/medium/tags/{tag}/posts | 1 credit Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/medium/tags/tag/posts/get) |
| Author posts | GET /v1/medium/authors/{username}/posts | 1 credit Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/medium/authors/username/posts/get) |
| Publication posts | GET /v1/medium/publications/{slug}/posts | 1 credit Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/medium/publications/slug/posts/get) |
| Post sitemap | GET /v1/medium/posts | 1 credit Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/medium/posts/get) |
| Entity sitemap | GET /v1/medium/discover/{kind} | 1 credit Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/medium/discover/kind/get) |
| Sitemap index | GET /v1/medium/sitemap | 2 credits Failed requests are free | [docs](https://www.socialfetch.dev/docs/api/v1/medium/sitemap/get) |

## How to start

1. **Create an API key.** Sign up at Social Fetch and copy a key (`sfk_...`). New accounts get 100 free credits, enough to try every Medium route.
2. **Pick the read.** Use `GET /v1/medium/tags/javascript/posts` for a tag's latest ten, `GET /v1/medium/authors/ev/posts` for an author, or `GET /v1/medium/posts?date=2011-06-29` for a sitemap day. Send `x-api-key` on every request.
3. **Page and branch.** Check `data.lookupStatus`, keep requesting with `page.nextCursor` while `page.hasMore` is true, and read `meta.creditsCharged` for billing.

## Pricing

Most Medium routes charge 1 credit per completed request; the sitemap index charges 2. The price is shown on each endpoint page. Each sitemap page is its own request. A temporary 503 is not billed. `meta.creditsCharged` on every response is the billing source of truth.

## Compared with the official API

Medium has no general public API covering these surfaces. A tag, author or publication list stops at ten posts and has no cursor, and each post brings the publisher's own markup. Social Fetch returns one JSON shape across posts and sitemaps, derives plain text and reading time, and pages a sitemap day so thousands of URLs have a stable cursor.

## FAQ

### What can I get from the Medium API?

Tag, author and publication feeds, one day's post sitemap, entity sitemaps, and the sitemap index. Every route returns JSON in the same envelope.

### How many posts does each list return?

Ten, the list's whole depth. `page.depth` is 10 and `page.hasMore` is null because the list has no cursor or older-page parameter. Use a sitemap for a deeper history.

### How do I pull every post for a day?

Call `GET /v1/medium/posts` with `date=YYYY-MM-DD` and follow `page.nextCursor` until `page.hasMore` is false. `page.total` is the row count for that page, and each page is its own request.

### Can I use a publication on its own domain?

Yes. Pass the domain as the slug (`uxdesign.cc`) or add `domain=uxdesign.cc`. The optional `tag` filter is only supported on Medium-hosted publications.

### Why is `contentHtml` null on a tag feed?

A tag's items often carry a snippet instead of the article body. Check `contentAvailable`; when it is false, read `snippet` and `imageUrl`. Author and publication items usually include the full HTML.

### What does `lookupStatus` mean?

`found` means the list was returned; a tag with no stories is still `found` with an empty `posts` array. `not_found` means the handle, publication or dated sitemap file does not exist. HTTP 200 only means the request finished, so always branch on `data.lookupStatus`.

### What does `complete: false` mean?

An item was incomplete and left out. The rest of the response is still returned and `complete` is false. A later request may return every item.

### How do I find the sitemap files for a kind?

Call `GET /v1/medium/sitemap` with `kind=posts` (or another kind). The answer pages `files[]` with `url`, `path`, `kind`, `date` and `lastModified`, plus `count`, `latest` and `page.nextCursor`. Set `limit` from 1 to 500; the default is 100.

### How much does the Medium API cost?

1 credit per completed request on most routes and 2 for the sitemap index. Each page of a sitemap is a separate request. A temporary 503 is not billed. `meta.creditsCharged` on every response is the billing source of truth.

### Can I use the Medium routes from an agent or Make?

Yes. The routes are typed MCP tools and Ask targets, and they are reachable in Make through the shared modules and Make an API call. Use the typed routes for production jobs.

## Related

- [Medium Tag Posts API](https://www.socialfetch.dev/platforms/medium/tags-tag-posts): The ten newest posts carrying a tag (`GET /v1/medium/tags/{tag}/posts`).
- [Medium Author Posts API](https://www.socialfetch.dev/platforms/medium/authors-username-posts): An author's ten newest posts with article HTML (`GET /v1/medium/authors/{username}/posts`).
- [Medium Post Sitemap API](https://www.socialfetch.dev/platforms/medium/posts): One day's post URLs and last-modified dates (`GET /v1/medium/posts`).
- [Medium Sitemap Index API](https://www.socialfetch.dev/platforms/medium/sitemap): The sitemap files available for a kind (`GET /v1/medium/sitemap`).
- [Ask in plain English](https://www.socialfetch.dev/ask): Route a natural-language question to the matching Medium operation.
- [Hosted MCP](https://www.socialfetch.dev/mcp): Call Medium tools from Cursor or Claude with the same credit metering as REST.
