Calendar
Manage posts through VoxBurst’s content calendar and approval workflow: create and update calendar posts, submit them for approval, approve/reject, and publish. Also covers calendar personas (a separate, legacy persona system — see the callout below) and platform-to-calendar sync.
This is a separate system from /v1/posts. /v1/calendar/posts are a distinct
resource (CalendarPost) from the Post resource documented in Posts.
If your integration was built against POST /v1/posts, you do not need this group — it
exists for workspaces using the calendar-based drafting and approval UI.
Calendar personas are legacy. The /v1/calendar/personas* endpoints on this page sit
on top of the older CalendarPersona model. They remain fully functional, but the
intended long-term replacement is the newer persona engine documented in
Personas (/v1/personas, backed by PersonaProfile). New
integrations should prefer /v1/personas.
Base URL
https://api.voxburst.io/v1/calendarAuthentication: All endpoints require a Bearer token and workspace context, with the
group’s schedule:read / schedule:write scopes. Some write endpoints additionally require
an ADMIN or OWNER workspace role — noted per endpoint below.
List Calendar Posts
GET /v1/calendar/posts
curl "https://api.voxburst.io/v1/calendar/posts?status=scheduled&limit=20" \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
status | string | No | Filter by calendar post status |
platform | string | No | Filter by platform |
from | string | No | ISO 8601 start of date range |
to | string | No | ISO 8601 end of date range |
limit | number | No | 1–100, default 20 |
cursor | string | No | Pagination cursor |
Get a Calendar Post
GET /v1/calendar/posts/:id
curl https://api.voxburst.io/v1/calendar/posts/cmp6v6bhf000369v60htcu3vc \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Returns { "data": <CalendarPost> }, or 404 if not found in the workspace.
Create a Calendar Post
POST /v1/calendar/posts
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
accountId | string | Yes | Social account to post to |
content | string | Yes | Post content, 1–10,000 characters |
platform | string | Yes | Platform string |
personaId | string | No | Calendar persona to associate |
scheduledAt | string | No | ISO 8601 datetime — must be in the future if set |
mediaId | string | No | Attached media ID |
imageUrl | string | No | Direct image URL (alternative to mediaId) |
notes | string | No | Internal notes, not shown to end viewers |
arc | string | No | Free-form campaign/arc grouping label |
curl -X POST https://api.voxburst.io/v1/calendar/posts \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"accountId": "acc_abc123",
"content": "Draft for review",
"platform": "TWITTER",
"scheduledAt": "2026-09-01T15:00:00Z"
}'Returns { "data": <CalendarPost> } with 201.
Update a Calendar Post
PATCH /v1/calendar/posts/:id
All fields optional; only send what changes. Body fields mirror the create schema
(content, scheduledAt, mediaId, imageUrl, notes, arc, personaId, status — each
nullable where noted in the create schema).
curl -X PATCH https://api.voxburst.io/v1/calendar/posts/cmp6v6bhf000369v60htcu3vc \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "content": "Updated draft copy" }'Submit for Approval
POST /v1/calendar/posts/:id/submit
Submits a calendar post into the approval workflow. Requires the calendar_approval_workflows
plan feature.
If the workspace has disabled post approval (settings.require_approval: false), this
endpoint is a no-op that returns 402 PAYMENT_REQUIRED-shaped error content explaining
posts publish automatically without an approval step — it is not a bug, the workspace has
opted out of the approval gate entirely.
Error Codes
| Status | Cause |
|---|---|
403 | PAYMENT_REQUIRED-class error — plan does not include calendar_approval_workflows, or approval is disabled for the workspace |
403 | User authentication required (not just an API key) |
404 | Calendar post not found |
Approve / Reject a Calendar Post
POST /v1/calendar/posts/:id/approve — requires ADMIN or OWNER role.
POST /v1/calendar/posts/:id/reject — requires ADMIN or OWNER role. Body: { "notes"?: string }.
curl -X POST https://api.voxburst.io/v1/calendar/posts/cmp6v6bhf000369v60htcu3vc/reject \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "notes": "Please shorten the caption" }'Error Codes
| Status | Cause |
|---|---|
403 | Caller lacks ADMIN/OWNER role, or lacks user authentication |
404 | Calendar post not found |
Publish a Calendar Post
POST /v1/calendar/posts/:id/publish — requires ADMIN or OWNER role.
Hands the calendar post off to VoxBurst’s publish pipeline.
curl -X POST https://api.voxburst.io/v1/calendar/posts/cmp6v6bhf000369v60htcu3vc/publish \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Sync Posts from Platforms
POST /v1/calendar/sync
For each active connected account in the workspace whose platform adapter supports fetching
historical posts (currently Mastodon and TikTok), imports recently published posts into the
calendar and marks previously-tracked posts as UNPUBLISHED if they’ve been removed from the
platform.
curl -X POST https://api.voxburst.io/v1/calendar/sync \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Response
{
"data": {
"added": 3,
"removed": 1,
"unchanged": 46,
"platforms": ["MASTODON"],
"postsPerPlatform": 50
}
}Fix Duplicate Platform Records
POST /v1/calendar/fix-duplicate-platforms
Maintenance endpoint that de-duplicates internal records created by a sync run that executed
twice concurrently. Safe to call repeatedly — returns 0 removed if there is nothing to fix.
curl -X POST https://api.voxburst.io/v1/calendar/fix-duplicate-platforms \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Response
{ "data": { "removed": 2, "postPlatformRowsRemoved": 1, "duplicatePostsRemoved": 1 } }Calendar Personas
See the legacy-status note at the top of this page. These endpoints operate on
CalendarPersona, not the PersonaProfile model used by /v1/personas.
List Personas
GET /v1/calendar/personas — requires the calendar_personas plan feature.
Get a Persona
GET /v1/calendar/personas/:id — requires the calendar_personas plan feature.
Create a Persona
POST /v1/calendar/personas — requires ADMIN/OWNER role and the calendar_personas plan feature.
| Field | Type | Required | Description |
|---|---|---|---|
slug | string | Yes | Lowercase alphanumeric, hyphens/underscores only |
displayName | string | Yes | Display name |
runtimePrompt | string | No | Persona system prompt used for AI-assisted drafting |
accountIds | string[] | No | Social accounts this persona applies to |
Update a Persona
PATCH /v1/calendar/personas/:id — requires ADMIN/OWNER role and the calendar_personas plan feature.
| Field | Type | Required | Description |
|---|---|---|---|
displayName | string | No | Display name |
runtimePrompt | string | null | No | Persona system prompt |
isActive | boolean | No | Enable/disable the persona |
Error Codes (all persona endpoints)
| Status | Cause |
|---|---|
403 | Plan does not include calendar_personas, or (write endpoints) caller lacks ADMIN/OWNER role |
404 | Persona not found in the workspace |