# List posts

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

Canonical: https://revnu.com/docs/content-posts

```bash
curl -H "Authorization: Bearer $REVNU_TOKEN" \
  "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` | Up to 200. |
| `cursor` | The `cursor` from the previous page. |

## Response

`{ "blog": {…}, "nav": {…}, "posts": [summary, …], "cursor": "…" | null }`. Each summary carries `slug`, `title`, `metaDescription`, `canonicalPath`, `publishedAt` and `updatedAt`, which is everything a listing page or a sitemap needs.

A post that disappears from the list was removed; drop the page.

`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: `canonicalPath` for the URL and `updatedAt` as the last-modified time. Refresh it on the same schedule as your listing page.

### How often should I poll?

With ISR or a revalidate window of a few minutes you never need to. Build-time frameworks should use a deploy hook instead of polling; see [Host your blog](/docs/content-api).
