Published posts
Newest first by default. Filter by category, tag, author, featured flag and publish date; search title, excerpt and body; page with page/limit (max 100). Bodies are left out unless include=content.
x-api-keyx-api-key<token>A tenant API key — secret (htk_…) or, where allowed, publishable (hpk_…).
page?numberlimit?numbercategory?array<string>Category slug(s) or id(s), comma separated. A post matches if it is in any of them. Includes posts in child categories.
tag?array<string>Tag slug(s) or id(s), comma separated. Matches any by default — see tagMatch.
tagMatch?stringall returns only posts carrying every tag in tag.
"any""all"featured?booleanOnly featured (pinned) posts, or only non-featured with false.
publishedFrom?stringPublished on or after.
date-timepublishedTo?stringPublished on or before.
date-timeexclude?array<string>Leave these post ids or slugs out (e.g. the post being read, for a "more posts" strip).
sort?string"publishedAt:desc""publishedAt:asc""title:asc""title:desc""viewCount:desc""commentCount:desc""reactionCount:desc""updatedAt:desc"include?array<string>Extra fields on each list item: content (rendered html), design (raw blocks), toc. Left out by default to keep lists small.
search?stringA page of published posts. Add include=content for bodies.
response?unknownapplication/jsoncurl -X GET 'https://api.horbit.ng/v1/public/blog/posts'{ "status": true, "message": "Posts retrieved successfully", "data": [ { "id": "3fb45a08bd18428cae49d3572c769237", "slug": "five-lessons-open-data-hackathon", "title": "Five lessons from our first open-data hackathon", "excerpt": "What 120 researchers taught us about sharing data in 48 hours.", "status": "published", "publishedAt": "2026-10-25T09:00:00.000Z", "updatedAt": "2026-10-25T10:12:44.000Z", "readingTimeMinutes": 4, "wordCount": 912, "isFeatured": true, "featuredImage": { "url": "https://cdn.horbit.ng/blog/hackathon.jpg", "alt": "Researchers around a table of laptops", "caption": "Day two, around 3am." }, "seo": { "title": "Open-data hackathon: five lessons", "description": "What 120 researchers taught us about sharing data in 48 hours.", "canonicalUrl": null, "ogImageUrl": "https://cdn.horbit.ng/blog/hackathon.jpg" }, "author": { "id": "7770812996284e9b92905104b95e36d2", "name": "Ada Obi", "avatarUrl": "https://cdn.horbit.ng/avatars/ada.jpg" }, "categories": [ { "id": "9c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f", "slug": "community-news", "title": "Community News", "color": "#3B9EFF", "parentId": null } ], "tags": [ { "id": "a1b2c3d4e5f60718293a4b5c6d7e8f90", "name": "Open Data", "slug": "open-data" }, { "id": "b2c3d4e5f60718293a4b5c6d7e8f90a1", "name": "Events", "slug": "events" } ], "stats": { "views": 1284, "comments": 12, "reactions": 87, "reactionCounts": { "like": 51, "love": 20, "clap": 12, "insightful": 4 } }, "commentsOpen": true, "reactionsOpen": true } ], "meta": { "totalItems": 42, "itemsCount": 1, "itemsPerPage": 10, "totalPages": 5, "currentPage": 1 }}RSS 2.0 feed of the 30 newest posts GET
Previous Page
One post, with its rendered body GET
`content.html` is the body; `content.toc` lists its headings (each heading has the matching `id`). `previous`/`next` are the neighbouring published posts. Counting a view is a separate call — see `POST /posts/{post}/views`.