---
title: "List posts"
method: GET
path: "/api/content/v1/posts"
tags: ["Content API"]
---

# List posts

`GET /api/content/v1/posts`

## Request

- Base URL: `https://revnu.com`
- URL: `https://revnu.com/api/content/v1/posts`
- Auth: HTTP bearer

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

**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](/docs/content-api).

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

## Query parameters

- `type` string
- `since` integer
- `limit` integer
- `cursor` string

## Response `200`

{ "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

- object
  - `blog` object, required
    - `blogSlug` string, required
    - `title` string, nullable, required
    - `creatorName` string, required
    - `creatorOneliner` string, nullable, required
    - `creatorTargetUrl` string, nullable, required
    - `authorName` string, nullable, required
    - `authorPhotoUrl` string, nullable, required
    - `logoUrl` string, nullable, required
    - `baseUrl` string, required
    - `flatContentPaths` boolean, required
    - `trailingSlash` boolean, required
  - `nav` NavItem[], required
    - `type` 'alternative' | 'blog' | 'comparison' | 'glossary' | 'how_to' | 'use_case', required
    - `prefix` string, required
    - `label` string, required
  - `posts` object[], required
    - `slug` string, required
    - `title` string, required
    - `contentType` 'alternative' | 'blog' | 'comparison' | 'glossary' | 'how_to' | 'use_case', required
    - `canonicalPath` string, required
    - `canonicalUrl` string, required
    - `metaDescription` string, nullable, required
    - `heroImageUrl` string, nullable, required
    - `readingMinutes` number, required
    - `publishedAt` number, required
    - `updatedAt` number, nullable, required
  - `cursor` string, nullable, required

## Other responses

- `400`: an unrecognised type, or a non-numeric since or limit on the list
- `401`: missing or malformed Authorization header
- `404`: unknown or revoked token, or unknown slug; indistinguishable on purpose
- `429`: slow down; Retry-After is set

---

[API](https://skmtc.dev/revnu/apis/revnu-api.md) · [All operations](https://skmtc.dev/revnu/apis/revnu-api/llms.txt) · [OpenAPI document](https://skmtc.dev/revnu/apis/revnu-api/revisions/52e523c2db61?raw)
