Medium hub

Medium Post Sitemap API

One day's post URLs and last-modified dates, 500 per page, with an opaque cursor.

GET /v1/medium/posts

1 credit Failed requests are free

About this endpoint

GET /v1/medium/posts takes a UTC date such as 2011-06-29 and lists that day's post sitemap. data.entries holds url, lastModified, kind, postId, username, slug, tag, listId, priority, changefreq and removed. data.page holds limit, returned, total, hasMore and nextCursor.

The cursor carries the filters it was issued for, so a cursor from another day or another kind is refused before a request is made. Each page is its own request. A cursor past the last row returns an empty page with page.hasMore: false. Set limit from 1 to 500; the default is 100. Follow page.nextCursor until page.hasMore is false.

lookupStatus: not_found means the day's file does not exist. A temporary failure returns an error and is never reported as not_found. Use GET /v1/medium/sitemap?kind=posts to see which dates are available.

Medium Post Sitemap API FAQ

Which dates have a file?

The sitemap index lists one post file per day from 2000 through the most recent day with a file. A day's file appears after that day ends, so today's date can still be not_found. Call GET /v1/medium/sitemap?kind=posts and read files[].date before you page a day.

How large is a page?

limit accepts 1 to 500 and defaults to 100. A daily file can hold thousands of URLs, so follow page.nextCursor until page.hasMore is false.

What does `not_found` mean here?

lookupStatus: not_found means the day has no sitemap file. A temporary failure returns its own error, so it is never mistaken for a missing day.

How many credits does it cost?

Pricing is documented on the operation in the API registry (shown on this page). Confirm on every response with meta.creditsCharged: that field is the billing source of truth. Each paginated page is a separate billed request.