Blog API and CLI

Manage blog posts, authors, and tags programmatically via the REST API, the cavuno CLI, or the TypeScript SDK.

All blog resources are available through the Cavuno REST API under /v1/blog/. Authenticate with an API key from Settings → API keys.

Manage posts via API

  1. GET /v1/blog/posts — list posts, filter by status (draft, scheduled, published)
  2. GET /v1/blog/posts/:id — retrieve a single post including rendered HTML
  3. POST /v1/blog/posts — create a post (defaults to draft)
  4. PATCH /v1/blog/posts/:id — update title, slug, content, authors, or tags
  5. DELETE /v1/blog/posts/:id — delete a post

Use POST /v1/blog/posts/:id/publish and POST /v1/blog/posts/:id/unpublish for lifecycle transitions. Use POST /v1/blog/posts/:id/toggle-featured to toggle the featured flag. To search by title across all statuses, use POST /v1/blog/posts/search.

Batch posts

Send up to 50 create, update, delete, publish, or unpublish operations in a single request to POST /v1/blog/posts/batch. Each sub-operation runs independently; a failure in one does not abort the rest.

Manage authors via API

  1. GET /v1/blog/authors — list authors
  2. GET /v1/blog/authors/:id — retrieve an author
  3. POST /v1/blog/authors — create an author
  4. PATCH /v1/blog/authors/:id — update name, slug, bio, or email
  5. DELETE /v1/blog/authors/:id — delete an author (posts keep the author ID)

Manage tags via API

  1. GET /v1/blog/tags — list tags
  2. POST /v1/blog/tags — create a tag
  3. PATCH /v1/blog/tags/:id — update name, slug, description, or visibility
  4. DELETE /v1/blog/tags/:id — delete a tag (posts keep the tag ID)

Read blog data anonymously

Public read routes for board visitors and external integrations require no authentication:

The :identifier path segment is your board slug.

  1. GET /v1/boards/:identifier/blog/posts — list published posts for a board
  2. GET /v1/boards/:identifier/blog/posts/:postSlug — retrieve a published post
  3. POST /v1/boards/:identifier/blog/search — search published posts by title
  4. GET /v1/boards/:identifier/blog/tags — list tags
  5. GET /v1/boards/:identifier/blog/tags/:tagSlug — retrieve a tag
  6. GET /v1/boards/:identifier/blog/authors — list authors
  7. GET /v1/boards/:identifier/blog/authors/:authorSlug — retrieve an author

Use the CLI

The cavuno blog command group mirrors the REST API. Install the CLI and authenticate with an API key.

bash
cavuno blog posts list --status draft
cavuno blog posts create --title "Hiring trends"
cavuno blog posts publish <id>
cavuno blog authors create --name "Alex Chen"
cavuno blog tags create --name "Hiring"

Run cavuno blog --help to see all subcommands for posts, authors, and tags.

Use the TypeScript SDK

Import createBlogClient from @kit/api-client:

ts
import { createBlogClient } from '@kit/api-client';
const blog = createBlogClient({ apiKey: 'cavuno_live_...', baseUrl: 'https://api.cavuno.com/v1' });
const posts = await blog.list({ status: 'published' });
await blog.create({ title: 'Hiring trends' });
await blog.publish(postId);

The client exposes list, get, create, update, remove, publish, unpublish, toggleFeatured, search, and batch for posts, plus authorsList, authorsGet, authorsCreate, authorsUpdate, authorsDelete, and the equivalent tags* methods.