# List posts

> Every published post, newest first, with cursor paging and filters by content type and time.

Canonical: https://revnu.com/docs/content-posts
Last updated: 2026-10-15

```bash
curl -H "Authorization: Bearer $REVNU_CONTENT_API_KEY" \
  "https://revnu.com/api/content/v1/posts?limit=50"
```

## Query

| Param | Meaning |
|---|---|
| `type` | Filter by content type, e.g. `how_to`. |
| `since` | Epoch milliseconds: only posts published or updated after this. |
| `limit` | Default 50, up to 200. |
| `cursor` | The `cursor` from the previous page. |

## Response

`{ "blog": {…}, "nav": […], "posts": [summary, …], "cursor": "…" | null }`. Each summary carries `slug`, `title`, `contentType`, `metaDescription`, `canonicalPath`, `canonicalUrl`, `heroImageUrl`, `readingMinutes`, `publishedAt` and `updatedAt`, which is everything a listing page or a sitemap needs. Keep requesting with the returned `cursor` until it is `null` to get every post.

The unfiltered list is the source of truth for what exists. A post that disappears from it was removed: drop its page and its sitemap entry. A `since` filter only returns changed posts, so it never tells you about removals.

Revnu counts your site as connected when it reads the first page of the unfiltered list. A site that only ever sends filtered requests is never counted: **I've Connected It** is refused, and its posts show as "Not on site yet" in the dashboard. See [Before you click I've Connected It](https://revnu.com/docs/content-api.md).

`400` for an unrecognised `type` or a non-numeric `since` or `limit`.

## Frequently asked questions

### How do I build a sitemap from this?

One entry per post: `canonicalUrl` as the location and `updatedAt` as the last-modified time, falling back to `publishedAt` when `updatedAt` is null. Refresh it on the same schedule as your listing page. [Render posts in Next.js or Astro](https://revnu.com/docs/host-your-blog.md) has both versions.

### How often should I poll?

With ISR or a revalidate window of a few minutes you never need to. Build-time frameworks should use the rebuild hook instead of polling; see [the Content API](https://revnu.com/docs/content-api.md).
