List posts
Every published post, newest first, with cursor paging and filters by content type and time.
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.
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 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.