Canonical schemas
Named schemas for objects that appear in multiple endpoints. Reference these definitions instead of inferring shapes from individual endpoint examples.
API conventions
Rules that apply uniformly across every endpoint. An agent or code generator can rely on these without inspecting individual endpoint documentation.
Field naming
All request body fields and response fields use camelCase (e.g. accountIds, scheduledFor, platformPostUrl). There are no snake_case or kebab-case fields in the REST API.
Date and time
All datetime fields are ISO 8601 strings in UTC with a Z suffix (e.g. "2026-06-01T14:00:00Z"). The API never returns Unix timestamps or locale-specific formats. Submitting a datetime without a timezone offset is rejected with 400 INVALID_DATE.
ID format
All IDs are cuid2 strings with a resource-type prefix:
| Prefix | Resource |
|---|---|
post_ | Post |
acc_ | Connected account |
media_ | Media file |
pp_ | PostPlatform (per-platform publish target) |
wh_ | Webhook endpoint |
ws_ | Workspace |
usr_ | User |
IDs are case-sensitive. Never construct or mutate ID strings — treat them as opaque tokens.
Enum casing
Enum values follow a consistent rule based on context:
| Context | Casing | Example |
|---|---|---|
Request body (contentType, platforms, status filter) | UPPERCASE | "IMAGE", "TWITTER", "PUBLISHED" |
REST response fields (post.status, account.status) | lowercase | "scheduled", "active" |
Webhook payload fields (post.status, platform) | UPPERCASE | "SCHEDULED", "TWITTER" |
When the same field (e.g. platform) appears in both a REST response and a webhook payload, its casing differs. See PlatformResult for the concrete example.
Null vs. absent fields
Optional fields that have no value are returned as null, not omitted. A field listed in the schema will always be present in the response object — you do not need to check 'field' in obj separately.
Exception: fields marked undefined in BulkItemResult are genuinely absent when not applicable (e.g. postId is absent on failure, not null).
Pagination envelope
All list endpoints return the same pagination shape:
{
"data": [ ... ],
"pagination": {
"has_more": true,
"next_cursor": "cjld2cjxh0000qzrmn831i7rn",
"limit": 20
}
}Pass cursor (not page or offset) to fetch the next page. When has_more is false, next_cursor is null. The TypeScript SDK’s listAll() and Go SDK’s ListAll() handle cursor iteration automatically.
Unknown fields
The API may add new optional fields to any response without a major version bump. Clients must ignore unknown fields rather than failing on them. This is the only change guaranteed not to be announced in advance.
Post
Returned by POST /v1/posts, GET /v1/posts/:id, PATCH /v1/posts/:id, and all post list/lifecycle endpoints.
| Field | Type | Description |
|---|---|---|
id | string | Post ID (cuid2) |
content | string | Post text |
contentType | string | null | "TEXT", "IMAGE", "VIDEO", "CAROUSEL", "STORY", "REEL", or "THREAD" |
status | string | See Post Status — lowercase |
scheduledFor | string | null | ISO 8601 publish time, or null |
publishedAt | string | null | ISO 8601 completion time |
platformRemovedAt | string | null | ISO 8601 time the post was removed from the platform |
firstComment | string | null | First comment text |
firstCommentDelay | number | null | Seconds before first comment (0–60) |
queuePosition | number | null | Queue slot position, if queued |
tags | string[] | Internal tags (not published) |
metadata | object | null | Arbitrary key-value metadata |
media | object[] | Attached Media objects |
platforms | PlatformResult[] | Per-platform publish state |
threadPosts | ThreadItem[] | Thread items (X only) |
recurringPostId | string | null | Source recurring rule ID |
isRecurring | boolean | null | true if this post generates recurrences |
personaId | string | null | Associated persona |
createdAt | string | ISO 8601 creation timestamp |
updatedAt | string | ISO 8601 last-modified timestamp |
PlatformResult
Each item in post.platforms[]. Present in REST responses (lowercase) and webhook payloads (UPPERCASE).
| Field | Type | Description |
|---|---|---|
postPlatformId | string | Unique ID for this platform target — used in POST /v1/posts/:id/platforms/:id/fix |
platform | string | Platform slug — lowercase in REST, UPPERCASE in webhooks |
accountId | string | VoxBurst account ID |
accountName | string | null | Account display name |
status | string | Platform-level status — lowercase in REST, UPPERCASE in webhooks. Values: pending, publishing, published, failed, skipped |
platformPostId | string | null | Platform’s native post ID (set on success) |
platformPostUrl | string | null | Public post URL (set on success) |
publishedAt | string | null | ISO 8601 publish timestamp |
error | object | null | { code: string, message: string } — set on failure |
attempts | object[] | Publish attempt history |
ThreadItem
Each item in post.threadPosts[] (X/Twitter only).
| Field | Type | Required | Description |
|---|---|---|---|
sequence | integer | Yes | 1-based position. Must be contiguous from 1. |
content | string | Yes | Tweet text (max 280 chars for X) |
mediaIds | string[] | No | Media IDs for this thread item (max 4) |
Media object
Each item in post.media[] and standalone media endpoint responses.
| Field | Type | Description |
|---|---|---|
id | string | Media ID (cuid2) |
filename | string | Display filename |
contentType | string | MIME type (image/jpeg after normalization) |
sizeBytes | integer | File size in bytes |
status | string | "PENDING", "PROCESSING", "READY", or "FAILED" — UPPERCASE |
publicUrl | string | null | CDN URL (available when READY) |
validationStatus | string | "pending", "passed", "failed", or "skipped" |
validationResults | object | null | Per-platform validation errors |
videoDuration | number | null | Duration in seconds (video only) |
videoCodec | string | null | Codec string (video only) |
videoWidth | number | null | Width in pixels (video only) |
videoHeight | number | null | Height in pixels (video only) |
createdAt | string | ISO 8601 creation timestamp |
WebhookEnvelope
The outer wrapper for all webhook deliveries.
| Field | Type | Description |
|---|---|---|
id | string | Unique event ID — use for deduplication |
type | string | Event type — see Webhook Event Catalog |
createdAt | string | ISO 8601 timestamp of the event |
data | object | Event-specific payload — see catalog for per-event schema |
BulkItemResult
Each item in POST /v1/posts/bulk → results[].
| Field | Type | Description |
|---|---|---|
index | integer | Zero-based position in the input posts array |
status | string | "created" (live run success), "failed" (live run failure), "valid" (dry run success), or "invalid" (dry run failure) |
postId | string | undefined | Created post ID — present when status: "created" |
errors | object[] | undefined | Validation errors — present when status: "failed" or "invalid" |
Account
Returned by account list, get, connect callback, and test endpoints.
| Field | Type | Description |
|---|---|---|
id | string | Account ID (cuid2) |
platform | string | Platform slug — always lowercase in REST responses |
username | string | null | Platform username or handle |
displayName | string | null | Display name |
avatarUrl | string | null | Profile avatar URL |
accountType | string | null | "personal", "business", or "creator" |
status | string | Account status — always lowercase in REST responses. See Account Status |
connectedAt | string | ISO 8601 connection timestamp |
WebhookEndpoint
Returned by webhook create, get, and list endpoints.
| Field | Type | Description |
|---|---|---|
id | string | Endpoint ID (wh_…) |
url | string | Delivery URL |
events | string[] | Subscribed event types |
enabled | boolean | Whether active |
failureCount | number | Cumulative failed deliveries (never resets) |
consecutiveFailures | number | Consecutive failures — resets to 0 on success or re-enable |
autoDisabledAt | string | null | Timestamp of auto-disable after 10 consecutive failures |
lastDeliveryAt | string | null | Most recent successful delivery timestamp |
createdAt | string | ISO 8601 |
updatedAt | string | ISO 8601 |
secret | string | Signing secret — returned only on creation and rotation, never again |