Skip to Content
API ReferenceCanonical schemas

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:

PrefixResource
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:

ContextCasingExample
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.

FieldTypeDescription
idstringPost ID (cuid2)
contentstringPost text
contentTypestring | null"TEXT", "IMAGE", "VIDEO", "CAROUSEL", "STORY", "REEL", or "THREAD"
statusstringSee Post Status — lowercase
scheduledForstring | nullISO 8601 publish time, or null
publishedAtstring | nullISO 8601 completion time
platformRemovedAtstring | nullISO 8601 time the post was removed from the platform
firstCommentstring | nullFirst comment text
firstCommentDelaynumber | nullSeconds before first comment (0–60)
queuePositionnumber | nullQueue slot position, if queued
tagsstring[]Internal tags (not published)
metadataobject | nullArbitrary key-value metadata
mediaobject[]Attached Media objects
platformsPlatformResult[]Per-platform publish state
threadPostsThreadItem[]Thread items (X only)
recurringPostIdstring | nullSource recurring rule ID
isRecurringboolean | nulltrue if this post generates recurrences
personaIdstring | nullAssociated persona
createdAtstringISO 8601 creation timestamp
updatedAtstringISO 8601 last-modified timestamp

PlatformResult

Each item in post.platforms[]. Present in REST responses (lowercase) and webhook payloads (UPPERCASE).

FieldTypeDescription
postPlatformIdstringUnique ID for this platform target — used in POST /v1/posts/:id/platforms/:id/fix
platformstringPlatform slug — lowercase in REST, UPPERCASE in webhooks
accountIdstringVoxBurst account ID
accountNamestring | nullAccount display name
statusstringPlatform-level status — lowercase in REST, UPPERCASE in webhooks. Values: pending, publishing, published, failed, skipped
platformPostIdstring | nullPlatform’s native post ID (set on success)
platformPostUrlstring | nullPublic post URL (set on success)
publishedAtstring | nullISO 8601 publish timestamp
errorobject | null{ code: string, message: string } — set on failure
attemptsobject[]Publish attempt history

ThreadItem

Each item in post.threadPosts[] (X/Twitter only).

FieldTypeRequiredDescription
sequenceintegerYes1-based position. Must be contiguous from 1.
contentstringYesTweet text (max 280 chars for X)
mediaIdsstring[]NoMedia IDs for this thread item (max 4)

Media object

Each item in post.media[] and standalone media endpoint responses.

FieldTypeDescription
idstringMedia ID (cuid2)
filenamestringDisplay filename
contentTypestringMIME type (image/jpeg after normalization)
sizeBytesintegerFile size in bytes
statusstring"PENDING", "PROCESSING", "READY", or "FAILED" — UPPERCASE
publicUrlstring | nullCDN URL (available when READY)
validationStatusstring"pending", "passed", "failed", or "skipped"
validationResultsobject | nullPer-platform validation errors
videoDurationnumber | nullDuration in seconds (video only)
videoCodecstring | nullCodec string (video only)
videoWidthnumber | nullWidth in pixels (video only)
videoHeightnumber | nullHeight in pixels (video only)
createdAtstringISO 8601 creation timestamp

WebhookEnvelope

The outer wrapper for all webhook deliveries.

FieldTypeDescription
idstringUnique event ID — use for deduplication
typestringEvent type — see Webhook Event Catalog
createdAtstringISO 8601 timestamp of the event
dataobjectEvent-specific payload — see catalog for per-event schema

BulkItemResult

Each item in POST /v1/posts/bulkresults[].

FieldTypeDescription
indexintegerZero-based position in the input posts array
statusstring"created" (live run success), "failed" (live run failure), "valid" (dry run success), or "invalid" (dry run failure)
postIdstring | undefinedCreated post ID — present when status: "created"
errorsobject[] | undefinedValidation errors — present when status: "failed" or "invalid"

Account

Returned by account list, get, connect callback, and test endpoints.

FieldTypeDescription
idstringAccount ID (cuid2)
platformstringPlatform slug — always lowercase in REST responses
usernamestring | nullPlatform username or handle
displayNamestring | nullDisplay name
avatarUrlstring | nullProfile avatar URL
accountTypestring | null"personal", "business", or "creator"
statusstringAccount status — always lowercase in REST responses. See Account Status
connectedAtstringISO 8601 connection timestamp

WebhookEndpoint

Returned by webhook create, get, and list endpoints.

FieldTypeDescription
idstringEndpoint ID (wh_…)
urlstringDelivery URL
eventsstring[]Subscribed event types
enabledbooleanWhether active
failureCountnumberCumulative failed deliveries (never resets)
consecutiveFailuresnumberConsecutive failures — resets to 0 on success or re-enable
autoDisabledAtstring | nullTimestamp of auto-disable after 10 consecutive failures
lastDeliveryAtstring | nullMost recent successful delivery timestamp
createdAtstringISO 8601
updatedAtstringISO 8601
secretstringSigning secret — returned only on creation and rotation, never again
Last updated on