Workspaces
Create and manage workspaces, request ownership transfer or deletion, and (as sub-resources) manage a workspace’s API keys and inspect its API usage and request history.
Base URL
https://api.voxburst.io/v1/workspacesAuthentication: All core workspace endpoints (GET/POST/PATCH/DELETE /v1/workspaces*) require the workspaces:read / workspaces:write scopes. The API-key
sub-resources below (api-keys, api-usage, request-history) have no scope of their
own — see each section for its actual requirement.
List Workspaces
GET /v1/workspaces
Returns every workspace the caller is a member of.
curl https://api.voxburst.io/v1/workspaces \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Create a Workspace
POST /v1/workspaces
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | 1–100 characters |
slug | string | Yes | Lowercase alphanumeric with hyphens, must be unique |
logo | string | No | Trusted VoxBurst-hosted URL |
settings | object | No | See Workspace Settings below |
curl -X POST https://api.voxburst.io/v1/workspaces \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "name": "Acme Co", "slug": "acme-co" }'The caller becomes OWNER. Enforces the plan’s workspace-count limit — returns 403 with
plan/limit details if exceeded.
Error Codes
| Status | Cause |
|---|---|
403 | Workspace-count limit reached for the caller’s plan |
409 | slug already in use |
Get a Workspace
GET /v1/workspaces/:id
curl https://api.voxburst.io/v1/workspaces/wsp_example123 \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Update a Workspace
PATCH /v1/workspaces/:id
All fields optional.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | 1–100 characters |
slug | string | No | Must remain unique |
logo | string | null | No | Trusted VoxBurst-hosted URL, or null to clear |
settings | object | No | See Workspace Settings below |
curl -X PATCH https://api.voxburst.io/v1/workspaces/wsp_example123 \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "settings": { "week_start_day": "monday" } }'Workspace Settings
The settings object is strictly typed server-side — any key not in this list is silently
stripped before it reaches the database. Every currently supported key:
| Key | Type | Description |
|---|---|---|
require_approval | boolean | Gate publishing behind the approval workflow |
approve_content | boolean | Gate publishing on content approval specifically (defaults to true when require_approval is on) |
approve_schedule | boolean | Gate scheduling (setting scheduledFor) on approval (default false) |
week_start_day | "sunday" | "monday" | Calendar week start day |
autoArchiveDays | 0 | 30 | 60 | 90 | 180 | Days after publish before auto-archiving a post (0 disables) |
allowedPlatforms | string[] | Restrict which platforms can be connected. Empty/absent = all platforms allowed. Values must be valid uppercase platform enum values. |
platformBetaTester | boolean | System-admin only — grants access to connect platforms still in pendingApproval. Non-admin callers attempting to set this receive 403. |
autoPrepareVideoAudio | boolean | Auto-inject a silent audio track into videos with none, for platforms that require an audio stream (default: enabled) |
calendar_execution_path also exists in the schema but is an internal implementation
detail of the legacy calendar system — do not set it from an integration.
Error Codes
| Status | Cause |
|---|---|
403 | Attempted to set platformBetaTester without system-admin privileges |
404 | Workspace not found |
409 | slug already in use |
Delete a Workspace
DELETE /v1/workspaces/:id
curl -X DELETE https://api.voxburst.io/v1/workspaces/wsp_example123 \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Error Codes
| Status | Cause |
|---|---|
400 | This is the caller’s only owned workspace — cannot delete your only workspace |
404 | Workspace not found |
Request Workspace Deletion
POST /v1/workspaces/:id/deletion-requests
Creates a deletion request (owner/admin only) that kicks off VoxBurst’s deletion review
process, distinct from the immediate DELETE /v1/workspaces/:id above.
| Field | Type | Required | Description |
|---|---|---|---|
reason | string | No | 10–2,000 characters |
curl -X POST https://api.voxburst.io/v1/workspaces/wsp_example123/deletion-requests \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{ "reason": "Consolidating into a single workspace" }'Ownership Transfer
Transfer workspace ownership to another user. The target user must accept before ownership actually moves — nothing changes until they do.
| Endpoint | Description |
|---|---|
POST /v1/workspaces/:id/transfer-request | Initiate a transfer. Body: { "targetUserId": string }. |
GET /v1/workspaces/:id/transfer-request | Get the pending transfer request, if any. |
DELETE /v1/workspaces/:id/transfer-request | Cancel a pending transfer request. |
POST /v1/workspaces/:id/transfer-request/accept | Called by the target user to accept and complete the transfer. |
POST /v1/workspaces/:id/transfer-request/decline | Called by the target user to decline. |
A transfer request expires after 7 days if not accepted. Initiating a transfer checks that the target user has capacity (workspace-count limit) to become an additional owner before creating the request.
Error Codes
| Status | Cause |
|---|---|
400 | targetUserId equals the caller (already the owner) |
Workspace API Keys
/v1/workspaces/:id/api-keys
Managing API keys requires a Cognito session — this sub-resource cannot be called with
another API key. API credentials cannot create, broaden, rotate, or revoke API
credentials; only an authenticated workspace user can. All endpoints also require OWNER
or ADMIN role.
Create an API Key
POST /v1/workspaces/:id/api-keys
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | 1–100 characters |
scopes | string[] | Yes | Named scopes (see Scopes), or ["*"] for wildcard |
expiresAt | string | null | No | ISO 8601 datetime |
curl -X POST https://api.voxburst.io/v1/workspaces/wsp_example123/api-keys \
-H "Authorization: Bearer <cognito-token>" \
-H "Content-Type: application/json" \
-d '{ "name": "CI integration", "scopes": ["posts:read", "posts:write"] }'Response (201)
{
"data": {
"id": "key_abc123",
"name": "CI integration",
"prefix": "vb_live_xxxx",
"scopes": ["posts:read", "posts:write"],
"createdAt": "2026-08-01T00:00:00.000Z",
"expiresAt": null,
"key": "vb_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}The full key value is returned only in this response. It is never retrievable again
— store it immediately. Every other endpoint on this page only ever returns the prefix.
Workspaces are capped at 25 active keys.
List API Keys
GET /v1/workspaces/:id/api-keys — never returns the full key, only prefix. Each key
includes expirationStatus ("active" | "expiring_soon" | "expired", "expiring_soon"
= within 7 days) and daysUntilExpiration.
List Keys Expiring Soon
GET /v1/workspaces/:id/api-keys/expiring?days=7 — days must be 1–365 (default 7).
Update an API Key
PATCH /v1/workspaces/:id/api-keys/:keyId
| Field | Type | Required | Description |
|---|---|---|---|
name | string | No | 1–100 characters |
scopes | string[] | No | Replaces the key’s full scope list |
allowedIps | string[] | No | IP allowlist — individual IPs or CIDR ranges |
Revoke an API Key
DELETE /v1/workspaces/:id/api-keys/:keyId — soft-deletes (sets revokedAt); does not
hard-delete the row.
Per-Key Usage
GET /v1/workspaces/:id/api-keys/:keyId/usage?startDate=&endDate=
Returns total request count, last-used timestamp, per-endpoint breakdown (method, path, count, error count), and average response time for a single key. Defaults to the current calendar month if no date range is given.
Error Codes (all API key endpoints)
| Status | Code | Cause |
|---|---|---|
400 | LIMIT_EXCEEDED | 25 active keys already exist for this workspace |
400 | VALIDATION_ERROR | Invalid scope string, wildcard combined with named scopes, or invalid IP/CIDR |
404 | NOT_FOUND | API key not found (or already revoked) |
Workspace API Usage
GET /v1/workspaces/:id/api-usage
Returns aggregate API request counts against the workspace’s monthly plan limit for the current billing period.
curl https://api.voxburst.io/v1/workspaces/wsp_example123/api-usage \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Response
{
"data": {
"requests": { "total": 4213, "limit": 100000, "remaining": 95787 },
"percentage": { "remaining": 96, "used": 4 },
"status": "healthy",
"period": { "start": "2026-08-01T00:00:00.000Z", "end": "2026-08-31T23:59:59.000Z" },
"plan": { "slug": "pro", "name": "Pro" }
}
}status is "healthy" below 75% used, "warning" at 75–89%, "critical" at 90%+.
Additional Usage Breakdown Endpoints
| Endpoint | Description |
|---|---|
GET /v1/workspaces/:id/api-usage/timeseries | Usage broken down over time (for charting request volume) |
GET /v1/workspaces/:id/api-usage/endpoints | Usage broken down by endpoint (path + method) |
Request History
GET /v1/workspaces/:id/request-history
Developer-friendly, paginated log of API requests made against the workspace — built for debugging integrations. Rate limited to 30 requests/minute.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
method | string | Filter by GET, POST, PATCH, PUT, or DELETE |
path | string | Substring match on request path |
status | string | 3-digit HTTP status code, e.g. "404" |
apiKeyId | string | Filter to requests made with a specific API key |
startDate / endDate | string | ISO 8601 range |
cursor | string | Opaque pagination cursor |
limit | number | 1–100, default 50 |
curl "https://api.voxburst.io/v1/workspaces/wsp_example123/request-history?status=500&limit=20" \
-H "Authorization: Bearer vb_live_xxxxxxxxxxxxx"Response
{
"data": [
{
"id": "log_abc123",
"timestamp": "2026-08-30T12:00:00.000Z",
"method": "POST",
"path": "/v1/posts",
"statusCode": 201,
"responseTimeMs": 142,
"requestId": "req_xyz789",
"apiKeyId": "key_abc123",
"actorType": "api_key",
"actorId": null,
"ipAddress": "203.0.113.4"
}
],
"pagination": { "has_more": true, "next_cursor": "eyJ...", "limit": 20 }
}