Blog API and CLI
Manage blog posts, authors, and tags programmatically via the REST API, the Cavuno CLI, or the TypeScript SDK.
A
JAll blog resources are available through the Cavuno REST API under /v1/blog/. Authenticate with an API key from Settings → Developer → API keys.
Before you begin
Create an API key for the board you intend to change and keep it outside source control. Use the authenticated operator endpoints for drafts and mutations; use the anonymous board endpoints only for published content.
Manage posts via API
GET /v1/blog/posts— list posts, filter bystatus(draft,scheduled,published)GET /v1/blog/posts/:id— retrieve a single post including rendered HTMLPOST /v1/blog/posts— create a post (defaults todraft)PATCH /v1/blog/posts/:id— update title, slug, content, authors, or tagsDELETE /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
GET /v1/blog/authors— list authorsGET /v1/blog/authors/:id— retrieve an authorPOST /v1/blog/authors— create an authorPATCH /v1/blog/authors/:id— update name, slug, bio, or emailDELETE /v1/blog/authors/:id— delete an author (posts keep the author ID)
Manage tags via API
GET /v1/blog/tags— list tagsPOST /v1/blog/tags— create a tagPATCH /v1/blog/tags/:id— update name, slug, description, or visibilityDELETE /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.
GET /v1/boards/:identifier/blog/posts— list published posts for a boardGET /v1/boards/:identifier/blog/posts/:postSlug— retrieve a published postPOST /v1/boards/:identifier/blog/search— search published posts by titleGET /v1/boards/:identifier/blog/tags— list tagsGET /v1/boards/:identifier/blog/tags/:tagSlug— retrieve a tagGET /v1/boards/:identifier/blog/authors— list authorsGET /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.
12345cavuno blog posts list --status draftcavuno 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.
Verify API or CLI changes
After a create or update, retrieve the returned resource by ID and confirm the response contains the title, slug, status, authors, and tags you sent. Publishing is a separate lifecycle action: after publishing, list posts with status=published and request the board's anonymous post route by slug. A draft should appear through the authenticated operator endpoint but must not appear through the anonymous board route.
Troubleshoot a request
If a request returns an authentication error, confirm the API key belongs to the target board and is sent using the authentication method in the API reference. If a published post is missing from the anonymous route, retrieve it through the operator endpoint and confirm its status and slug before publishing it again. For batch requests, inspect every sub-operation because one failure does not roll back the successful operations.
Use the TypeScript SDK
Import createBlogClient from @kit/api-client:
1234567import { 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.
Next steps
- Create a blog post: understand the fields and publishing lifecycle before automating it
- Manage authors and tags: plan the relationships your integration will assign