Posts
Browse and fetch individual posts from your Vine workspace
The Posts API lets you retrieve a list of public posts and fetch the full content of a single post. It is intended for websites, blogs, landing pages, newsletters, and other read-only consumers.
Browse All Posts
Retrieve all public posts for the workspace attached to the API key.
Endpoint
GET https://vinecms.tech/api/public/v1/{API_KEY}/postsQuery Parameters
None right now.
The current shipped API does not yet support:
- pagination
- category filtering
- tag filtering
- author filtering
- search
Example Request
curl "https://vinecms.tech/api/public/v1/{API_KEY}/posts"Example Response
{
"ok": true,
"posts": [
{
"id": "post_id",
"title": "Welcome to Vine",
"slug": "welcome-to-vine",
"excerpt": "A short introduction to the workspace.",
"readingTimeMinutes": 2,
"publishedAt": "2026-03-08T10:00:00.000Z",
"updatedAt": "2026-03-08T10:00:00.000Z",
"author": { "id": "author_id", "name": "Ava Stone" },
"category": { "slug": "announcements", "name": "Announcements" },
"tags": [{ "slug": "welcome", "name": "Welcome" }]
}
]
}Response Fields
Each post in the list response contains:
id(string): internal post identifiertitle(string): post titleslug(string): unique post slugexcerpt(string): short post summaryreadingTimeMinutes(number): estimated reading timepublishedAt(string | null): ISO timestamp for publish timeupdatedAt(string): ISO timestamp for last update timeauthor(object | null): author summary withidandnamecategory(object | null): category summary withslugandnametags(array): tag summaries withslugandname
Use Cases
- Display a blog post listing page
- Show recent posts on a homepage
- Filter posts by category or tags
- Implement pagination for large post collections
Fetch A Single Post
Retrieve the full content for one post by slug.
Endpoint
GET https://vinecms.tech/api/public/v1/{API_KEY}/posts/{postSlug}Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
postSlug | string | Yes | Slug of the post to retrieve |
Example Request
curl "https://vinecms.tech/api/public/v1/{API_KEY}/posts/welcome-to-vine"Example Response
{
"ok": true,
"post": {
"id": "post_id",
"title": "Welcome to Vine",
"slug": "welcome-to-vine",
"excerpt": "A short introduction to the workspace.",
"readingTimeMinutes": 2,
"publishedAt": "2026-03-08T10:00:00.000Z",
"updatedAt": "2026-03-08T10:00:00.000Z",
"author": { "id": "author_id", "name": "Ava Stone" },
"category": { "slug": "announcements", "name": "Announcements" },
"tags": [{ "slug": "welcome", "name": "Welcome" }],
"contentHtml": "<p>Hello world</p>"
}
}Response Fields
The single post response includes every field from the list response, plus:
contentHtml(string): rendered HTML content
Error Handling
If the slug is invalid, hidden, or unpublished, the API returns:
{
"ok": false,
"error": "Post not found"
}Use Cases
- full article pages
- blog detail routes
- newsletter rendering
- server-side content ingestion
Reading Time
Every post summary and full post includes readingTimeMinutes.
The estimate currently uses:
- text length at roughly
225words per minute - extra time for images
- extra time for code blocks
That makes it more realistic than a plain word-count-only estimate.
Visibility Rules
Posts are returned only when both conditions are true:
status = "published"visible = true
Drafts and hidden posts are excluded from public responses.
Example Usage
Fetching Posts In JavaScript
const response = await fetch(
'https://vinecms.tech/api/public/v1/{API_KEY}/posts'
);
const data = await response.json();
for (const post of data.posts) {
console.log(post.title, post.readingTimeMinutes);
}Fetching A Single Post
const response = await fetch(
'https://vinecms.tech/api/public/v1/{API_KEY}/posts/welcome-to-vine'
);
const data = await response.json();
console.log(data.post.contentHtml);