Skip to Content
Authentication

Authentication

VoxBurst uses API key authentication. All requests require a Bearer token in the Authorization header.

API Keys

Authorization: Bearer vb_live_xxxxxxxxxxxxx

API keys are prefixed with vb_live_. Keys created in the VoxBurst dashboard always use this prefix.

Create and manage your API keys in the VoxBurst dashboard .

Keep your API keys secret. Never commit them to version control or expose them in client-side code.

Scopes

API keys can be scoped to specific permissions. Use the minimum scopes required for your use case.

ScopeDescription
posts:readRead posts and their status
posts:writeCreate, update, delete, and publish posts
accounts:readList connected social accounts
accounts:writeConnect and disconnect social accounts
media:readView uploaded media files
media:writeUpload and delete media files
webhooks:readView webhook configurations
webhooks:writeCreate, update, and delete webhooks
personas:writeCreate, update, and manage personas
billing:writePreview plan changes, change plans, manage add-ons, and purchase credits
hashtag-sets:writeCreate, update, and delete hashtag sets

Rate Limiting

Rate limits are applied per API key based on your plan:

PlanRequests/Minute
Free120
Starter200
Pro500
Agency1,000

Rate limit information is returned in response headers:

X-RateLimit-Limit: 120 X-RateLimit-Remaining: 118 X-RateLimit-Reset: 1707753600

When rate limited, the API returns 429 Too Many Requests with a Retry-After header indicating when to retry.

Rate Limit Headers

Every API response includes headers to help you manage request pacing:

HeaderDescriptionExample
X-RateLimit-LimitMaximum requests allowed per minute120
X-RateLimit-RemainingRequests remaining in current window118
X-RateLimit-ResetUnix timestamp when the limit resets1707753600

Example Response with Rate Limit Headers

HTTP/1.1 200 OK Content-Type: application/json X-RateLimit-Limit: 120 X-RateLimit-Remaining: 118 X-RateLimit-Reset: 1707753600 { "id": "post_abc123", "content": "Hello from VoxBurst!", "status": "scheduled" }

Use different API keys for development and production environments to limit the blast radius of a leaked key.

Environment Variables

Store your API key as an environment variable:

# .env VOXBURST_API_KEY=vb_live_xxxxxxxxxxxxx
curl https://api.voxburst.io/v1/accounts \ -H "Authorization: Bearer $VOXBURST_API_KEY"

Or with the TypeScript SDK:

import { VoxBurstClient } from '@voxburst/sdk' const client = new VoxBurstClient({ apiKey: process.env.VOXBURST_API_KEY! })

Health Check

The API exposes two health endpoints under the /v1 prefix:

EndpointDescription
GET /v1/healthReturns 200 when the API is up
GET /v1/readyReturns 200 when the API is up and dependencies are healthy
curl https://api.voxburst.io/v1/health

The health endpoints are at /v1/health — not /health. Requests to https://api.voxburst.io/health (without /v1) return 403 from the CloudFront distribution layer and do not reach the API. Always use the /v1/ prefix.

Both endpoints are unauthenticated and do not require an API key.


Resource ID Format

All VoxBurst resource IDs (post IDs, account IDs, etc.) follow the cuid2  format:

  • Exactly 25 characters total
  • Starts with the letter c
  • Followed by 24 lowercase alphanumeric characters (az, 09)
  • Example: cmp6v6bhf000369v60htcu3vc

Passing a malformed ID returns 400 Bad Request — not 404. The API validates the ID format before attempting a database lookup. Handle both 400 and 404 when an ID might be user-supplied:

{ "error": { "code": "BAD_REQUEST", "message": "Invalid path parameter 'id': Invalid ID format" } }

Idempotency

VoxBurst supports idempotency for all write operations (POST, PUT, PATCH, DELETE). This lets you safely retry requests on network failures without creating duplicate resources.

How to use

Add an Idempotency-Key header to any write request:

POST /v1/posts Authorization: Bearer vb_live_xxxxxxxxxxxxx Idempotency-Key: create-post-2026-06-01-campaign-a Content-Type: application/json

Key format

RuleValue
Header nameIdempotency-Key (case-insensitive)
Allowed charactersAlphanumeric, hyphens (-), underscores (_)
Min length1 character
Max length255 characters
TTL24 hours — keys are purged after expiry

Behavior

ScenarioBehavior
First requestExecutes normally, caches response against the key
Repeat request (same key, same body)Returns the cached response with Idempotency-Key-Used: true header — no duplicate action
Repeat request (same key, different body)Returns 409 Conflict — key is already locked to the original payload
Concurrent requests with same keyReturns 409 Conflict with code IN_PROGRESS — only one request proceeds
Key expired (>24h)Treated as a new request — processed normally

Response headers

HeaderDescription
Idempotency-Key-Usedtrue when the response is a replay of a cached result
X-VoxBurst-Supports-Idempotencytrue on every response — confirms the endpoint supports idempotency
# Use a UUID per attempt Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000 # Use a stable identifier for your operation Idempotency-Key: schedule-post-campaign-123-slot-4 # Use a hash of the request intent for agent workflows Idempotency-Key: post-${workspaceId}-${contentHash}-${scheduledFor}

Error codes

CodeHTTPCause
IDEMPOTENCY_CONFLICT409Key already used with a different request body
IDEMPOTENCY_IN_PROGRESS409A request with this key is currently being processed
IDEMPOTENCY_INVALID_KEY400Key format invalid (invalid characters or out of length range)

Idempotency keys are scoped to your workspace. A key from one workspace cannot conflict with the same key in another workspace.


Contract precedence

When prose descriptions, inline examples, SDK documentation, and the OpenAPI spec ever appear to conflict, this ordering determines which source is authoritative:

  1. API source code — the implementation is the ground truth. All other sources describe it.
  2. This documentation — pages under /api-reference/* reflect the current implementation, validated against the codebase before publishing.
  3. OpenAPI spec (GET /api/openapi.yaml) — machine-readable contract. Kept in sync with implementation; the source code takes precedence on conflict.
  4. SDK docs (TypeScript, Go) — SDK method signatures and types are derived from the REST contract. Where SDK behavior diverges from REST, the REST contract wins.
  5. Examples — illustrative, not normative. Examples may omit optional fields or use placeholder values.

In practice: if you encounter a mismatch between a docs example and a field table, trust the field table. If a field table conflicts with an actual API response, file a bug  — the implementation may have changed without a docs update.

Backwards compatibility: non-breaking changes (new optional fields, new endpoints, new enum values) are deployed without notice. Your client should ignore unknown fields. Breaking changes (field removal, type changes, endpoint removal) are announced at least 30 days in advance in the changelog.


Error Responses

Authentication failures return:

{ "error": { "code": "UNAUTHORIZED", "message": "Invalid or missing API key" } }
StatusCodeCause
401UNAUTHORIZEDMissing or invalid API key
403FORBIDDENValid key but insufficient scope
429RATE_LIMITEDRate limit exceeded
Last updated on