Vine API Docs

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}/posts

Query 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 identifier
  • title (string): post title
  • slug (string): unique post slug
  • excerpt (string): short post summary
  • readingTimeMinutes (number): estimated reading time
  • publishedAt (string | null): ISO timestamp for publish time
  • updatedAt (string): ISO timestamp for last update time
  • author (object | null): author summary with id and name
  • category (object | null): category summary with slug and name
  • tags (array): tag summaries with slug and name

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

ParameterTypeRequiredDescription
postSlugstringYesSlug 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 225 words 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);

On this page