BOLTA API

v1.0

Developer Documentation

Build powerful integrations with BOLTA's programmatic API. Leverage our Brand Voice AI to create authentic content at scale.

cURL
Python
Node.js
Go
Interactive API Testing
Enter your API key to enable live testing and auto-populate code examples

Introduction

Welcome to the BOLTA API. This documentation provides everything you need to integrate with BOLTA's programmatic API and leverage our Brand Voice AI capabilities.

Base URL
All API requests should be made to the following base URL
url
https://platty.boltathread.com

Production docs list https://platty.boltathread.com as the public API host. This interactive explorer uses NEXT_PUBLIC_BOLTA_SERVER_URL when set (e.g. staging).

Authentication
All API requests require authentication using an API key

Include your API key in the Authorization header:

http
Authorization: Bearer bolta_sk_your_api_key_here

API keys can be generated in your workspace settings:

  • Navigate to Settings → API
  • Click "Generate API Key"
  • Select the permissions you need
  • Copy and securely store your key (shown only once!)
Getting Started
Quick steps to start using the API
  1. 1
    Generate an API key in your workspace settings with the permissions you need
  2. 2
    Test your API key by calling the workspaces endpoint to verify authentication
  3. 3
    Get your workspace ID from the workspaces response - you'll need it for most endpoints
  4. 4
    Start building - use the interactive examples below to test endpoints and see responses
API Key Permission Scopes
Grant only the scopes your integration needs. Missing scopes return 403 errors.
accounts:connect
Account Management

Connect Accounts

Initiate OAuth connections for social accounts

accounts:read
Account Management

Read Accounts

View connected social accounts and metadata

agents:manage
Admin

Manage Agents

Create, update, delete, and manage agent principals via API

ai:generate
Brand Voice

AI Content Generation

Generate AI content with brand voice

audit:export
Admin

Export Audit Logs

Export workspace audit and activity logs

content:bulk
Content Management

Bulk Operations

Perform bulk content operations

posts:delete
Content Management

Delete Posts

Delete posts and scheduled content

posts:read
Content Management

Read Posts

View posts and schedules

posts:write
Content Management

Write Posts

Create and update posts (schedule, draft)

recurring:manage
Content Management

Manage Recurring Posts

Approve and reject recurring post suggestions

review:approve
Workflow

Approve Reviews

Approve and route reviewed content

review:submit
Workflow

Submit for Review

Submit content for approval

team:manage
Admin

Manage Team

Create and manage agent teammates

team:manage_keys
Admin

Manage Keys

Rotate and manage API keys

voice:read
Brand Voice

Read Voice Profiles

View brand voice profiles and settings

voice:write
Brand Voice

Update Voice Profiles

Modify brand voice profiles and settings

workspace:admin
Admin

Manage Workspace Settings

Change workspace settings via API: autonomy mode, Safe Mode, posting limits. Required to PATCH workspace settings.

workspace:read
Workspace

Read Workspace

View workspace policy and capabilities

Quick Start

3 endpoints
1. Test Your API Key
Click "Try it" to verify your API key is working
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
2. List Your Voice Profiles
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/voice/profiles/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
3. List Scheduled Posts
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/posts/scheduled/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"

SDK Samples

Copy-paste-runnable snippets for the four operations you'll use most: auth, list voice profiles, generate a post, and schedule it. TypeScript, Python, and Go.

Set BOLTA_API_KEY in your environment
Every snippet below reads the API key from BOLTA_API_KEY. Generate one in Settings → API; it will be shown once.
1. Authenticate and list your workspaces
Start here. This call verifies your API key and returns the workspace IDs you'll use for every other endpoint.
typescript
const BOLTA_API = "https://platty.boltathread.com";
const API_KEY = process.env.BOLTA_API_KEY!;

async function listWorkspaces() {
  const res = await fetch(`${BOLTA_API}/api/v1/workspaces/`, {
    headers: { Authorization: `Bearer ${API_KEY}` },
  });

  if (!res.ok) {
    throw new Error(`Bolta auth failed: ${res.status} ${await res.text()}`);
  }

  return res.json() as Promise<Array<{ id: string; name: string }>>;
}

const workspaces = await listWorkspaces();
console.log("workspace_id =", workspaces[0].id);
2. List voice profiles in a workspace
Voice profiles are the foundation for every AI generation in Bolta. Pick the profile id you want to draft in.
typescript
async function listVoiceProfiles(workspaceId: string) {
  const res = await fetch(
    `${BOLTA_API}/api/v1/workspaces/${workspaceId}/voice/profiles/`,
    { headers: { Authorization: `Bearer ${API_KEY}` } },
  );
  if (!res.ok) throw new Error(await res.text());
  return res.json() as Promise<Array<{ id: string; name: string; tone: Record<string, number> }>>;
}
3. Generate a post in your voice
Pass a topic plus a voice profile id and Bolta returns a draft. Swap the voice id for any other profile in the same workspace.
typescript
async function generatePost(workspaceId: string, voiceProfileId: string, topic: string) {
  const res = await fetch(
    `${BOLTA_API}/api/v1/workspaces/${workspaceId}/voice/enhanced/content/`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${API_KEY}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        voice_profile_id: voiceProfileId,
        content_type: "social-post",
        platform: "x",
        topic,
      }),
    },
  );

  if (res.status === 429) {
    const retryAfter = res.headers.get("Retry-After");
    throw new Error(`Rate limited; retry after ${retryAfter}s`);
  }
  if (!res.ok) throw new Error(await res.text());
  return res.json() as Promise<{ body: string; image_prompt?: string }>;
}
4. Schedule a post
Once you have a draft you like, schedule it. Pass a UTC ISO timestamp and the social account ID you want to publish from.
typescript
async function schedulePost(workspaceId: string, opts: {
  body: string;
  socialAccountId: string;
  publishAt: string; // ISO 8601 UTC
}) {
  const res = await fetch(
    `${BOLTA_API}/api/v1/workspaces/${workspaceId}/posts/schedule/`,
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${API_KEY}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        body: opts.body,
        social_account_id: opts.socialAccountId,
        publish_at: opts.publishAt,
      }),
    },
  );
  if (!res.ok) throw new Error(await res.text());
  return res.json() as Promise<{ id: string; status: string }>;
}
Production checklist
Before you ship
  • • Always check res.status === 429 and honour the Retry-After header.
  • • Cache workspace_id and voice_profile_id — they don't change often.
  • • Send timestamps in UTC (ISO 8601 with the trailing Z).
  • • Scope API keys narrowly: a posting integration doesn't need workspace.write.
  • • For higher rate limits, email support@bolta.ai with your API key ID and expected request volume.

Workspaces

9 endpoints

Get your workspace information. The workspace ID is required for all other API calls.

GET
/api/v1/workspaces
List all workspaces accessible by your API key. Returns an array of workspace objects with IDs, names, and metadata.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"

Response Example

[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "My Workspace",
    "created_at": "2025-01-15T10:30:00Z",
    "updated_at": "2025-01-20T14:22:00Z"
  }
]

Notes

  • The workspace ID from this response is required for most other API endpoints
  • API keys are scoped to a single workspace, so this will typically return one workspace
  • Use the first workspace ID for subsequent API calls
GET
/api/v1/workspaces/{workspace_id}
Get details of a specific workspace. Returns workspace information including name, description, and metadata.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID to retrieve

Response Example

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "My Workspace",
  "description": "My workspace description",
  "safe_mode": true,
  "autonomy_mode": "managed",
  "max_posts_per_day": 100,
  "max_api_requests_per_hour": 1000,
  "created_at": "2025-01-15T10:30:00Z",
  "updated_at": "2025-01-20T14:22:00Z",
  "member_count": 5,
  "accounts_count": 10
}

Notes

  • For API key authentication, workspace_id must match the API key's workspace
  • For JWT authentication, user must be a member of the workspace
  • safe_mode: when true, agent-created posts route to review instead of direct scheduling
  • autonomy_mode: controls agent behavior (assisted, managed, autopilot, governance)
  • max_posts_per_day: daily quota limit for agent-created posts (null = use plan default)
  • max_api_requests_per_hour: hourly API request limit (null = use plan default)
GET
/api/v1/workspaces/{workspace_id}/policy
Get workspace governance settings including Safe Mode and scheduling rules. Agents should call this first to understand workspace rules.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/policy/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Response Example

{
  "safe_mode": true,
  "inbox_direct_scheduling": false,
  "workspace_type": "team"
}

Notes

  • safe_mode: when true, agent-created posts route to review instead of scheduling directly
  • inbox_direct_scheduling: when false, posts must go through review before scheduling
  • Essential for agents to understand workspace rules before creating content
GET
/api/v1/workspaces/{workspace_id}/my-capabilities
Get the caller's effective permissions for a workspace. Returns role, principal type, and a full permissions map.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/my-capabilities/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Response Example

{
  "role": "creator",
  "principal_type": "agent",
  "permissions": {
    "create_canvas": true,
    "publish_content": false,
    "approve_posts": false,
    "schedule_posts": false,
    "edit_posts": true
  },
  "allowed_actions_summary": "Create drafts, submit for review",
  "forbidden_actions_summary": "Cannot approve, schedule, or publish"
}

Notes

  • principal_type is 'agent' for API key auth, 'user' for JWT auth
  • Permissions map includes all 18 role-based permissions
  • Agents should check this before attempting restricted operations
PATCH
/api/v1/workspaces/{workspace_id}/update
Update workspace settings including Safe Mode, autonomy mode, and quota limits. Requires workspace admin permissions.
bash
curl -X PATCH "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/update/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "safe_mode": true,
    "autonomy_mode": "managed",
    "max_posts_per_day": 150
  }'
Parameters
1 required
7 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Optional Parameters
safe_mode
boolean
Optional

Enable/disable Safe Mode (routes agent posts to review)

autonomy_mode
string
Optional

Workspace agent autonomy level. Canonical values: 'manual', 'assisted' (default), 'auto', 'aggressive'. Legacy (auto-mapped): 'managed', 'autopilot', 'governance'. Synonyms like 'autonomous' are aliased to 'auto'. Governs how posts created via the API are routed (see notes).

max_posts_per_day
integer
Optional

Daily post creation quota (null = use plan default)

max_api_requests_per_hour
integer
Optional

Hourly API request limit (null = use plan default)

name
string
Optional

Workspace name

description
string
Optional

Workspace description

timezone
string
Optional

Workspace timezone (e.g., America/New_York)

Response Example

{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "My Workspace",
  "description": "My workspace description",
  "safe_mode": true,
  "autonomy_mode": "managed",
  "max_posts_per_day": 150,
  "max_api_requests_per_hour": 1000,
  "created_at": "2025-01-15T10:30:00Z",
  "updated_at": "2025-02-16T14:22:00Z",
  "member_count": 5,
  "accounts_count": 10
}

Notes

  • Requires the 'workspace:admin' API key scope. If your key lacks it you get 403 'does not have the required permissions: workspace:admin' — recreate the key with that scope selected (or use an ADMIN/FULL_ACCESS preset).
  • Owners and admins can also change these in the dashboard: Settings → API (Agent autonomy), or Settings → Account → Team Post Approval for Safe Mode.
  • Partial updates supported - only send fields you want to change
  • autonomy_mode (canonical four): 'manual' and 'assisted' (default) require approval — posts are routed to Draft; 'auto' and 'aggressive' act automatically — the status you send (e.g. Scheduled) is honored. Legacy 'managed'/'governance' map to 'assisted'; 'autopilot' maps to 'auto'.
  • Because the default is 'assisted', posts you create via the API with status='Scheduled' come back as 'Draft' until you set autonomy_mode to 'auto' (or 'aggressive'). The create-post response includes a 'routing' object explaining any such change.
  • Invalid autonomy_mode returns 400 with error_code 'invalid_autonomy_mode' and the list of valid values.
  • Autonomy mode 'autopilot' is incompatible with safe_mode: true (returns 400).
GET
/api/v1/workspaces/{workspace_id}/quota-status
Get current quota usage and limits for a workspace. Returns daily post count and hourly API request metrics.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/quota-status/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Response Example

{
  "workspace_id": "550e8400-e29b-41d4-a716-446655440000",
  "daily_posts": {
    "limit": 100,
    "used": 47,
    "remaining": 53,
    "percentage": 47
  },
  "hourly_api_requests": {
    "limit": 1000,
    "used": 234,
    "remaining": 766,
    "percentage": 23.4
  },
  "date": "2025-02-16",
  "quota_resets_at": "2025-02-17T00:00:00Z",
  "warnings": []
}

Notes

  • Warnings array populated when usage exceeds 85% or 100%
  • Example warning: 'Approaching daily quota limit: 85/100 posts used (85%)'
  • Quota resets at midnight UTC daily
  • Use this endpoint before bulk operations to check remaining quota
  • Quota limits can be customized per workspace (see update-workspace endpoint)
GET
/api/v1/workspaces/{workspace_id}/members
List workspace members and their roles.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/members" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Response Example

{
  "members": [
    {
      "id": "user_123",
      "email": "user@example.com",
      "role": "admin",
      "joined_at": "2025-01-15T10:30:00Z"
    }
  ],
  "count": 1
}
POST
/api/v1/workspaces/{workspace_id}/invitations
Invite a new member to the workspace.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/invitations" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "new.user@example.com",
    "role": "editor"
  }'
Parameters
3 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

email
string
Required

Email address to invite

role
string
Required

Role: admin, editor, viewer

Response Example

{
  "success": true,
  "invitation_id": "inv_123",
  "email": "new.user@example.com",
  "role": "editor",
  "status": "pending"
}
PUT
/api/v1/workspaces/{workspace_id}/settings
Update workspace settings.
bash
curl -X PUT "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/settings" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "New Workspace Name",
    "timezone": "America/New_York"
  }'
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Response Example

{
  "id": "ws_123",
  "name": "New Workspace Name",
  "timezone": "America/New_York"
}

Media Library

3 endpoints

Manage your media assets. Upload images and videos to use in your posts.

POST
/api/v1/media/upload
Upload a media file to your library.
bash
curl -X POST "https://platty.boltathread.com/api/v1/media/upload" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -F "file=@/path/to/image.jpg" \
  -F "workspace_id={workspace_id}"
Parameters
2 required
1 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

file
File
Required

The media file to upload (image or video)

Optional Parameters
alt_text
string
Optional

Alt text for accessibility

Response Example

{
  "id": "media_123",
  "url": "https://assets.bolta.ai/images/media_123.jpg",
  "filename": "image.jpg",
  "mime_type": "image/jpeg",
  "size": 102400,
  "created_at": "2025-01-29T10:00:00Z"
}
GET
/api/v1/workspaces/{workspace_id}/media
List media files in your library.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/media" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
2 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Optional Parameters
page
number
Optional

Page number

limit
number
Optional

Items per page (default: 50)

Response Example

{
  "media": [
    {
      "id": "media_123",
      "url": "https://assets.bolta.ai/images/media_123.jpg",
      "filename": "image.jpg",
      "created_at": "2025-01-29T10:00:00Z"
    }
  ],
  "count": 1,
  "total": 24
}
DELETE
/api/v1/media/{media_id}
Delete a media file.
bash
curl -X DELETE "https://platty.boltathread.com/api/v1/media/{media_id}" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
media_id
string (UUID)
Required

The media ID to delete

Response Example

{
  "success": true,
  "message": "Media deleted successfully"
}

Brand Voice AI

Core Feature
1 endpoint

Generate authentic content that matches your brand's unique voice

POST
/api/v1/voice/generate
Generate AI content using brand voice. Supports two modes: **Profile Mode** (default): provide `voiceProfileId` to use a saved voice profile — full Brand Voice generation with learned style, dos/donts, and account history. **Scratch Mode**: omit `voiceProfileId` and provide `context` + `businessName` + `niche` to generate content inline from DNA/business context — no profile required. Ideal for outreach pipelines, demos, and prospecting.
bash
# Profile Mode (standard)
curl -X POST "https://platty.boltathread.com/api/v1/voice/generate" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "{workspace_id}",
    "voiceProfileId": "voice-profile-uuid",
    "topics": ["personal_branding", "product_launch"],
    "dateRange": {
      "from": "2026-01-28T05:00:00.000Z",
      "to": "2026-02-03T05:00:00.000Z"
    },
    "time": "14:00",
    "maxPosts": "5",
    "postContentSize": "standard",
    "context": "Write about our latest feature launch"
  }'

# Scratch Mode (no profile required)
curl -X POST "https://platty.boltathread.com/api/v1/voice/generate" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "{workspace_id}",
    "businessName": "Kingdom Fitness",
    "niche": "gym fitness studio",
    "context": "Community-focused gym. Simple, no-frills strength training. Local, authentic, no corporate feel.",
    "tone": "authentic",
    "topics": ["fitness", "community", "motivation"],
    "dos": ["Sound like a real gym owner", "Reference local community", "Be specific"],
    "donts": ["Excessive emojis", "Corporate buzzwords", "Generic marketing speak"],
    "dateRange": {
      "from": "2026-01-28T05:00:00.000Z",
      "to": "2026-02-03T05:00:00.000Z"
    },
    "time": "14:00",
    "maxPosts": "7"
  }'
Parameters
5 required
20 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID where the voice profile is configured

topics
string[]
Required

Array of topics to generate content about. Content MUST reference at least one topic. Use keys like 'personal_branding', 'ai_tools', 'product_launch'.

dateRange
object
Required

Date range for scheduling. Object with 'from' and 'to' as ISO 8601 dates.

time
string (HH:mm)
Required

Preferred posting time in UTC format (HH:mm).

maxPosts
string | number
Required

Maximum posts to generate. Limited by plan (Starter: 5, Premium: 21).

Optional Parameters
voiceProfileId
string (UUID)
Optional

Voice profile ID for Profile Mode generation. Optional — omit to use Scratch Mode (requires 'context' field instead).

account_id
string (UUID)
Optional

Account ID for voice profile lookup. Not required if enableMultiPlatform is true.

postContentSize
string
Optional

Content length: 'brief' (50-100), 'standard' (100-250), 'detailed' (250-400), 'maximum' (400-500). Default: 'standard'.

postIntent
string
Optional

Post intent: 'engage', 'educate', 'promote', 'entertain', 'inspire', 'announce', 'community'.

context
string
Optional

Additional context or instructions. In Scratch Mode (no voiceProfileId), this field is the primary voice driver — pass brand DNA, tagline, description, and key themes here.

businessName
string
Optional

Business name — used in Scratch Mode to personalise generated content.

niche
string
Optional

Business niche or type (e.g. 'gym fitness studio', 'dental office'). Used in Scratch Mode to shape content topics and style.

dos
string[]
Optional

Writing guidelines — what the content should do (e.g. 'Sound local and human'). Used in Scratch Mode.

donts
string[]
Optional

Writing anti-guidelines — what to avoid (e.g. 'No corporate buzzwords'). Used in Scratch Mode.

customRules
string
Optional

Additional freeform writing rules injected into the prompt. Used in Scratch Mode.

tone
string
Optional

Tone override: happy, sad, neutral, angry, excited, confused. Defaults to voice profile tone.

language
string
Optional

Language code for content generation. Defaults to 'en'.

enableMultiPlatform
boolean
Optional

Enable multi-platform content generation. Requires selectedAccountsOrBuckets.

selectedAccountsOrBuckets
string[]
Optional

Array of account/bucket IDs. Format: 'account:{uuid}', 'bucket:{uuid}', 'account:linkedin_org_{id}', 'account:facebook_page_{id}'.

contentGenerationMode
string
Optional

Mode: 'cross-platform' (one content adapted), 'platform-specific' (unique per platform), 'both'.

useBusinessDNA
boolean
Optional

Incorporate Business DNA for brand-consistent styling and image generation.

businessDnaData
object
Optional

Business DNA object with colors, fonts, visual_aesthetics, logo_url, brand_values.

includeProductCTA
boolean
Optional

Include subtle product call-to-actions in generated content. When true, uses the selectedProductId if provided, otherwise automatically uses the first available product from the workspace's voice profile.

selectedProductId
string (UUID)
Optional

Optional product ID to use for CTAs. If includeProductCTA is true and this is not provided, the first available product from the workspace will be used.

generateImages
boolean
Optional

Generate companion images for each post. Requires imagePromptSource and imageModel.

Response Example

{
  "status": "processing",
  "task_id": "abc123-def456-ghi789",
  "message": "Content generation started in background. Use task_id to check status.",
  "check_status_url": "/api/v1/posts/bulk/{task_id}/status/"
}

Notes

  • Content generation runs asynchronously. The response includes a task_id for polling.
  • Poll status with GET /api/v1/task-status/{task_id}/ until status is 'completed'.
  • Two modes: Profile Mode (voiceProfileId provided) and Scratch Mode (context provided, no profile needed).
  • Scratch Mode: pass context + businessName + niche + tone + dos/donts for inline voice generation without a saved profile.
  • Topics are mandatory anchors - content MUST reference at least one topic
  • Multi-platform generates content for each account in selectedAccountsOrBuckets
  • Special formats: 'account:linkedin_org_{id}' for LinkedIn orgs, 'account:facebook_page_{id}' for FB pages
  • Product CTAs: Set includeProductCTA to true to automatically include subtle product mentions. Product details can also be specified in the 'context' field for more control.
  • Requires ai:generate permission

Voice Reply

1 endpoint

Generate voice-enhanced replies that match your brand's tone for responding to comments and messages.

POST
/api/v1/voice/reply
Generate an on-brand reply to a comment, message, or social interaction. Perfect for automating authentic responses at scale.
bash
curl -X POST "https://platty.boltathread.com/api/v1/voice/reply" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "{workspace_id}",
    "user_message": "Love this product! When are you launching the new features?",
    "username": "@customer123",
    "account_id": "880e8400-e29b-41d4-a716-446655440003",
    "platform": "twitter"
  }'
Parameters
4 required
1 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

Workspace ID for voice profile lookup

user_message
string
Required

The message or content you're replying to

username
string
Required

Username of the person you're replying to (e.g., @customer123)

account_id
string (UUID)
Required

Account ID for voice profile lookup. Required for voice enhancement.

Optional Parameters
platform
string
Optional

Target platform (twitter, linkedin, instagram, facebook, threads)

Response Example

{
  "success": true,
  "reply": "Thanks so much for the love! 💜 New features are dropping next month - stay tuned for some exciting updates! 🚀",
  "metadata": {
    "platform": "twitter",
    "character_count": 112,
    "context_detected": "customer_inquiry",
    "sentiment": "positive"
  }
}

Notes

  • Replies automatically match your brand voice and tone
  • Context detection helps generate appropriate responses
  • Platform-specific length limits are respected

Voice Profiles

4 endpoints

Manage your brand voice profiles programmatically. Create, update, and delete voice profiles to maintain consistent brand communication.

GET
/api/v1/workspaces/{workspace_id}/voice/profiles
Retrieve all brand voice profiles configured for a workspace. Voice profiles define your brand's unique writing style, tone, and personality.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/voice/profiles/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID to fetch voice profiles for

Example: "550e8400-e29b-41d4-a716-446655440000"

Response Example

{
  "profiles": [
    {
      "id": "660e8400-e29b-41d4-a716-446655440001",
      "name": "Company Brand Voice",
      "description": "Our main brand voice profile",
      "tone": "professional",
      "is_default": true,
      "created_at": "2025-01-15T10:30:00Z",
      "updated_at": "2025-01-20T14:22:00Z"
    }
  ],
  "count": 1
}

Notes

  • Voice profiles are used by the /api/v1/voice/generate endpoint
  • Each workspace can have multiple voice profiles for different use cases
  • One profile can be marked as default
  • Requires voice:read permission
POST
/api/v1/workspaces/{workspace_id}/voice/profiles
Create a new voice profile for your workspace. Define the tone, style, and personality traits for content generation.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/voice/profiles/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Casual Brand Voice",
    "description": "A friendly, conversational tone for social media",
    "tone": "casual",
    "personality_traits": ["friendly", "approachable", "witty"],
    "is_default": false
  }'
Parameters
3 required
3 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID to create the profile in

name
string
Required

Name for the voice profile

Example: "Casual Brand Voice"
tone
string
Required

Primary tone (professional, casual, friendly, formal, playful)

Example: "casual"
Optional Parameters
description
string
Optional

Description of when to use this profile

personality_traits
string[]
Optional

Array of personality traits

Example: ["friendly","approachable"]
is_default
boolean
Optional

Set as the default profile for this workspace

Response Example

{
  "id": "770e8400-e29b-41d4-a716-446655440002",
  "name": "Casual Brand Voice",
  "description": "A friendly, conversational tone for social media",
  "tone": "casual",
  "personality_traits": [
    "friendly",
    "approachable",
    "witty"
  ],
  "is_default": false,
  "created_at": "2025-01-28T10:30:00Z"
}

Notes

  • Requires voice:write permission
  • Setting is_default to true will unset any existing default profile
PUT
/api/v1/workspaces/{workspace_id}/voice/profiles/{profile_id}
Update an existing voice profile's settings.
bash
curl -X PUT "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/voice/profiles/{profile_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Updated Brand Voice",
    "tone": "professional"
  }'
Parameters
2 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

profile_id
string (UUID)
Required

The voice profile ID to update

Response Example

{
  "id": "660e8400-e29b-41d4-a716-446655440001",
  "name": "Updated Brand Voice",
  "tone": "professional",
  "updated_at": "2025-01-28T11:00:00Z"
}
DELETE
/api/v1/workspaces/{workspace_id}/voice/profiles/{profile_id}
Delete a voice profile. Note: You cannot delete the default profile.
bash
curl -X DELETE "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/voice/profiles/{profile_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
2 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

profile_id
string (UUID)
Required

The voice profile ID to delete

Response Example

{
  "success": true,
  "message": "Voice profile deleted successfully"
}

Notes

  • Cannot delete the default profile - set another profile as default first
  • Deletion is permanent and cannot be undone

Business DNA

3 endpoints

Manage Business DNA profiles to align content generation with brand values, aesthetics, and identity.

POST
/api/v1/workspaces/{workspace_id}/dna
Create a new Business DNA profile.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/dna/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Tech Startup DNA",
    "website_url": "https://example.com",
    "brand_values": ["Innovation", "Speed", "Reliability"]
  }'
Parameters
2 required
2 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

name
string
Required

Name of the DNA profile

Optional Parameters
website_url
string
Optional

Website URL to extract brand info from

brand_values
string[]
Optional

List of core brand values

Response Example

{
  "id": "dna_123",
  "name": "Tech Startup DNA",
  "status": "processing_extraction",
  "created_at": "2025-01-29T10:00:00Z"
}
GET
/api/v1/workspaces/{workspace_id}/dna
List Business DNA profiles for a workspace.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/dna/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Response Example

{
  "profiles": [
    {
      "id": "dna_123",
      "name": "Tech Startup DNA",
      "is_active": true
    }
  ]
}
POST
/api/v1/workspaces/{workspace_id}/dna/extract
Trigger an extraction of brand DNA from a URL.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/dna/extract/" \
   -H "Authorization: Bearer bolta_sk_your_api_key_here" \
   -H "Content-Type: application/json" \
   -d '{
     "url": "https://example.com",
     "name": "Extracted DNA"
   }'
Parameters
2 required
1 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

url
string
Required

URL to extract from

Optional Parameters
name
string
Optional

Optional name for the extracted DNA profile

Response Example

{
  "success": true,
  "dna": {
    "id": "dna_123",
    "name": "Extracted DNA"
  }
}

Posts

8 endpoints

Create, read, update, and delete posts. Manage your content programmatically for scheduling and automation.

Post status

Every post has a status field. The API returns and accepts status in PascalCase (e.g. Scheduled, not scheduled). Use the status query parameter when listing posts to filter by one of these values.

StatusDescription
DraftPost is not scheduled; content can be edited freely.
ScheduledPost has a scheduled_time and will be published at that time.
PublishedPost has been successfully published to the connected platform(s).
FailedPublishing was attempted but failed (e.g. token expired, platform error). Check failure_reason or publication status for details.
Pending Approval(Teams) Post is awaiting review before it can be scheduled.
Needs Revision(Teams) Reviewer requested changes; author should update the post.
Approved(Teams) Post was approved and can be scheduled.
Rejected(Teams) Post was rejected and will not be published.
QueuedPost is in the publish queue, waiting to be sent.
ProcessingPost is currently being published.
Ready for SchedulingPost passed checks and is ready to be scheduled (e.g. after approval or validation).

Common flows: Create with Draft or Scheduled; list/filter by status; responses always include the current status. Team workspaces may use the approval statuses (Pending Approval, Approved, Needs Revision, Rejected) for review workflows.

GET
/api/v1/workspaces/{workspace_id}/posts
List all posts for a workspace with optional filters for status, platform, and date range. Supports pagination and sorting.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/posts/?status=Scheduled&platform=twitter&start_date=2025-01-01&end_date=2025-02-01" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
8 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Optional Parameters
status
string
Optional

Filter by post status. One of: Draft, Scheduled, Published, Failed, Pending Approval, Needs Revision, Approved, Rejected, Queued, Processing, Ready for Scheduling.

platform
string
Optional

Filter by platform: twitter, linkedin, facebook, instagram, threads

start_date
string (ISO 8601)
Optional

Filter posts scheduled/created after this date

end_date
string (ISO 8601)
Optional

Filter posts scheduled/created before this date

limit
number
Optional

Number of results to return (default: 50, max: 100)

page
number
Optional

Page number for pagination (default: 1)

sort_by
string
Optional

Field to sort by: created_at, updated_at, scheduled_time (default: updated_at)

sort_order
string
Optional

Sort order: asc or desc (default: desc)

Response Example

{
  "posts": [
    {
      "id": "770e8400-e29b-41d4-a716-446655440002",
      "content": "Check out our latest update!",
      "platform": "twitter",
      "scheduled_at": "2025-01-30T14:00:00Z",
      "status": "Scheduled"
    }
  ],
  "count": 1,
  "total": 15,
  "has_more": true,
  "pagination": {
    "page": 1,
    "limit": 50,
    "total": 15,
    "has_next": false,
    "has_previous": false
  }
}

Notes

  • Returns posts sorted by updated_at (descending) by default
  • Date filters apply to scheduled_time for scheduled posts, created_at for others
  • Platform filter matches any account associated with the post
  • status in responses is always PascalCase (e.g. Draft, Scheduled, Published, Failed).
POST
/api/v1/posts
Create a new post. Supports multi-account posting, media attachments, and platform-specific content.
bash
curl -X POST "https://platty.boltathread.com/api/v1/posts/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "{workspace_id}",
    "status": "Scheduled",
    "scheduled_time": "2025-02-01T14:00:00Z",
    "accounts": ["880e8400-e29b-41d4-a716-446655440003"],
    "contents": [
      {
        "content": "Exciting news! Check out our latest update 🚀",
        "index": 0,
        "media": []
      }
    ],
    "tags": ["announcement"]
  }'
Parameters
5 required
3 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID. Auto-set if using API key authentication.

status
string
Required

Post status. Common values: Draft, Scheduled, Published. Full set: Draft, Scheduled, Published, Failed, Pending Approval, Needs Revision, Approved, Rejected, Queued, Processing, Ready for Scheduling. Default: Draft. NOTE: the workspace autonomy_mode can override this — on the default 'assisted' mode any non-Draft status is routed to Draft. See notes.

scheduled_time
string (ISO 8601)
Required

When to publish. Required if status is 'Scheduled'. Must be in the future.

accounts
string[]
Required

Array of account UUIDs. Special formats: 'linkedin_org_{id}', 'facebook_page_{id}'.

contents
array
Required

Array of content objects: { content, index, media: [{ media_url, order }] }.

Optional Parameters
social_buckets
string[]
Optional

Alternative to accounts. Posts to all accounts in bucket.

platform_specific
object
Optional

Platform-specific content overrides. Key: platform, value: content object.

tags
string[]
Optional

Array of tag names or IDs to associate with the post.

Response Example

{
  "id": "990e8400-e29b-41d4-a716-446655440004",
  "status": "Scheduled",
  "scheduled_time": "2025-02-01T14:00:00Z",
  "contents": [
    {
      "content": "Exciting news! Check out our latest update 🚀",
      "index": 0
    }
  ],
  "created_at": "2025-01-28T10:30:00Z"
}

Notes

  • Use 'linkedin_org_{id}' for LinkedIn organizations
  • Use 'facebook_page_{id}' for Facebook pages
  • Multiple accounts can be specified for cross-posting
  • Requires posts:write permission
  • Workspace autonomy_mode governs the final status. On the default 'assisted' mode (and 'manual'), status='Scheduled' (or any non-Draft) is routed to 'Draft'. Set autonomy_mode to 'auto' (PATCH /workspaces, needs workspace:admin) so Scheduled is honored. Posts created via API keys with no linked agent always use the workspace autonomy_mode.
  • When the status is changed by autonomy/Safe Mode routing, the response includes 'original_requested_status' and a 'routing' object: { requested_status, effective_status, cause, reason, how_to_change }. Check it instead of assuming the post scheduled.
GET
/api/v1/posts/{post_id}
Get details of a specific post including its status and metadata.
bash
curl -X GET "https://platty.boltathread.com/api/v1/posts/{post_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
post_id
string (UUID)
Required

The post ID to retrieve

Response Example

{
  "id": "990e8400-e29b-41d4-a716-446655440004",
  "content": "Exciting news! Check out our latest update 🚀",
  "platform": "twitter",
  "status": "Scheduled",
  "scheduled_at": "2025-02-01T14:00:00Z",
  "account": {
    "id": "880e8400-e29b-41d4-a716-446655440003",
    "username": "@mycompany",
    "platform": "twitter"
  },
  "created_at": "2025-01-28T10:30:00Z",
  "updated_at": "2025-01-28T10:30:00Z"
}
PUT
/api/v1/posts/{post_id}
Update an existing post. Only draft and scheduled posts can be updated.
bash
curl -X PUT "https://platty.boltathread.com/api/v1/posts/{post_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Updated content with better messaging! 🎉",
    "scheduled_at": "2025-02-02T10:00:00Z"
  }'
Parameters
1 required
2 optional
ParameterTypeRequiredDescription
post_id
string (UUID)
Required

The post ID to update

Optional Parameters
content
string
Optional

Updated post content

scheduled_at
string (ISO 8601)
Optional

Updated schedule time

Response Example

{
  "id": "990e8400-e29b-41d4-a716-446655440004",
  "content": "Updated content with better messaging! 🎉",
  "status": "Scheduled",
  "scheduled_at": "2025-02-02T10:00:00Z",
  "updated_at": "2025-01-28T11:00:00Z"
}

Notes

  • Cannot update posts that have already been published
  • Changing scheduled_at reschedules the post
DELETE
/api/v1/posts/{post_id}
Delete a post. Published posts cannot be deleted (use platform's native tools).
bash
curl -X DELETE "https://platty.boltathread.com/api/v1/posts/{post_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
post_id
string (UUID)
Required

The post ID to delete

Response Example

{
  "success": true,
  "message": "Post deleted successfully"
}
GET
/api/v1/workspaces/{workspace_id}/posts/scheduled
Retrieve all scheduled posts for a workspace. Returns posts that are scheduled for future publication.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/posts/scheduled/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID to fetch scheduled posts for

Example: "550e8400-e29b-41d4-a716-446655440000"

Response Example

{
  "posts": [
    {
      "id": "770e8400-e29b-41d4-a716-446655440002",
      "content": "Check out our latest update!",
      "platform": "twitter",
      "scheduled_at": "2025-01-30T14:00:00Z",
      "status": "Scheduled",
      "account_id": "880e8400-e29b-41d4-a716-446655440003"
    }
  ],
  "count": 1,
  "total": 1
}

Notes

  • Only returns posts with status 'Scheduled'
  • Posts are sorted by scheduled_at date (ascending)
POST
/api/v1/workspaces/{workspace_id}/posts/{post_id}/schedule
Schedule a post for future publication. Validates the post is in a schedulable status (Draft, Approved, Ready for Scheduling). When Safe Mode is enabled, Draft posts are routed to Pending Approval instead.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/posts/{post_id}/schedule/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "time": "2025-02-15T14:00:00Z"
  }'
Parameters
3 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

post_id
string (UUID)
Required

The post ID to schedule

time
string (ISO 8601)
Required

When to publish the post. Must be in the future.

Response Example

{
  "post_id": "990e8400-e29b-41d4-a716-446655440004",
  "status": "Scheduled",
  "scheduled_time": "2025-02-15T14:00:00Z"
}

Notes

  • Requires admin or owner role — creator-role agents will get 403
  • Post must be in Draft, Approved, or Ready for Scheduling status
  • Safe Mode: if enabled and post is Draft, it routes to Pending Approval instead of scheduling
  • When safe_mode_enforced is true, the response includes the original requested action
  • Requires posts:write permission
POST
/api/v1/workspaces/{workspace_id}/posts/{post_id}/publish
Immediately publish a post. Sets the post to Queued status and dispatches the publishing task. Blocked when Safe Mode is enabled.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/posts/{post_id}/publish/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
2 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

post_id
string (UUID)
Required

The post ID to publish immediately

Response Example

{
  "post_id": "990e8400-e29b-41d4-a716-446655440004",
  "status": "Queued",
  "message": "Publishing initiated"
}

Notes

  • Requires admin or owner role — creator-role agents will get 403
  • Returns 403 when Safe Mode is enabled (posts must go through review)
  • Post must be in Draft, Approved, Scheduled, or Ready for Scheduling status
  • The post is set to Queued and a background task handles the actual publishing
  • Requires posts:write permission

Campaigns

2 endpoints

Create and manage marketing campaigns to organize your content and track performance.

POST
/api/v1/campaigns
Create a new campaign.
bash
curl -X POST "https://platty.boltathread.com/api/v1/campaigns" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "{workspace_id}",
    "name": "Summer Sale 2025",
    "description": "Q3 promotional campaign",
    "start_date": "2025-06-01T00:00:00Z",
    "end_date": "2025-08-31T23:59:59Z",
    "budget": 5000,
    "currency": "USD"
  }'
Parameters
3 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

name
string
Required

Campaign name

start_date
string (ISO 8601)
Required

Campaign start date

Response Example

{
  "id": "camp_123",
  "name": "Summer Sale 2025",
  "status": "active",
  "created_at": "2025-01-29T10:00:00Z"
}
GET
/api/v1/workspaces/{workspace_id}/campaigns
List all campaigns.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/campaigns" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Response Example

{
  "campaigns": [
    {
      "id": "camp_123",
      "name": "Summer Sale 2025",
      "status": "active"
    }
  ],
  "count": 1
}

Post Details

8 endpoints

Manage platform-specific post metadata for X, Threads, LinkedIn, Facebook, Instagram, BlueSky, Mastodon, Reddit, and Discord using a single unified endpoint shape. WordPress remains on the legacy path for now.

GET
/POST/PUT/PATCH /api/v1/posts/{post_id}/details/{platform}
Unified post details endpoint for all supported platforms. Use the platform slug in path (x, threads, linkedin, facebook, instagram, bluesky, mastodon, reddit, discord). For POST/PUT/PATCH, send a JSON body with only that platform's field names (no prefix)—e.g. when platform=x send reply_settings, quoted_tweet_id, etc.
bash
curl -X PATCH "https://platty.boltathread.com/api/v1/posts/{post_id}/details/{platform}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "post_type": "TEXT",
    "privacy": "EVERYONE",
    "enable_comments": true,
    "cross_post_enabled": false
  }'
Parameters
2 required
80 optional
ParameterTypeRequiredDescription
post_id
string (UUID or ghost instance ID)
Required

Post ID in path. Supports loop ghost format: loop-{recurring_post_id}-ghost-{index}.

platform
string
Required

One of: x, threads, linkedin, facebook, instagram, bluesky, mastodon, reddit, discord.

Optional Parameters — by platform
X
reply_settings
string
Optional

Reply controls: everyone, mentioned_users, followers.

quoted_tweet_id
string
Optional

Tweet ID to quote.

in_reply_to_tweet_id
string
Optional

Parent tweet ID for reply posts.

poll_options
string[]
Optional

Poll options (2-4 options, max 25 chars each).

poll_duration_minutes
number
Optional

Poll duration in minutes (5-10080).

geo_place_id
string
Optional

Place ID for geo-tagging.

media_tagged_user_ids
string[]
Optional

User IDs to tag in media.

for_super_followers_only
boolean
Optional

Publish for super followers only.

auto_publish
boolean
Optional

Auto-publish post immediately.

is_thread
boolean
Optional

Whether this post is part of a thread.

thread_position
number
Optional

Position of this post in a thread.

Threads
topic_tag
string
Optional

Topic tag (without #).

use_topic_tag
boolean
Optional

Enable topic tag usage.

location_id
string
Optional

Location ID.

auto_publish
boolean
Optional

Auto-publish post immediately.

reply_control
string
Optional

Reply controls: everyone, mentioned, followers.

is_ghost_post
boolean
Optional

Mark as ghost post (text-only, 24h).

is_spoiler_media
boolean
Optional

Mark media as spoiler.

LinkedIn
post_type
string
Optional

Post type (TEXT, ARTICLE, IMAGE, VIDEO, etc.).

visibility
string
Optional

Visibility (PUBLIC, CONNECTIONS).

post_as_organization
boolean
Optional

Post as an organization.

selected_organization_id
string
Optional

Primary organization ID (or send `selected_organization`).

cross_post_organizations
string[]
Optional

Additional organization IDs for cross-posting.

cross_post_enabled
boolean
Optional

Enable cross-posting.

cross_post_delay
number
Optional

Delay in minutes between cross-posts.

include_hashtags
boolean
Optional

Auto-include hashtags.

tag_connections
boolean
Optional

Tag connections in posts.

enable_comments
boolean
Optional

Allow comments.

enable_resharing
boolean
Optional

Allow reshares.

linkedin_specific_content
string
Optional

Platform-specific content override.

location
string
Optional

Location metadata.

Facebook
post_type
string
Optional

Post type (TEXT, PHOTO, VIDEO, LINK, STORY).

privacy
string
Optional

Privacy (EVERYONE, FRIENDS, etc.).

primary_page_id
string
Optional

Primary page ID (or send `primary_page`).

cross_post_pages
string[]
Optional

Additional page IDs for cross-posting.

enable_comments
boolean
Optional

Allow comments.

enable_sharing
boolean
Optional

Allow shares.

enable_reactions
boolean
Optional

Allow reactions.

cross_post_enabled
boolean
Optional

Enable cross-posting.

cross_post_delay
number
Optional

Delay in minutes between cross-posts.

location
string
Optional

Location metadata.

feeling
string
Optional

Feeling metadata.

activity
string
Optional

Activity metadata.

Instagram
content_type
string
Optional

Content type (FEED, REELS, STORY).

media_type
string
Optional

Media type (IMAGE, VIDEO, CAROUSEL_ALBUM).

caption
string
Optional

Caption text.

alt_text
string
Optional

Alt text for accessibility.

location_id
string
Optional

Location ID.

user_tags
array
Optional

User tags payload.

product_tags
array
Optional

Product tags payload.

cover_url
string
Optional

Video cover image URL.

thumbnail_offset
number
Optional

Video thumbnail frame offset.

BlueSky
languages
string[]
Optional

Language tags (BCP-47).

reply_settings
string
Optional

Reply controls: everyone, nobody, mentioned.

include_facets
boolean
Optional

Auto-detect links/mentions as facets.

Mastodon
visibility
string
Optional

Visibility: public, unlisted, private, direct.

sensitive
boolean
Optional

Mark post as sensitive.

spoiler_text
string
Optional

Content warning text.

in_reply_to_id
string
Optional

Status ID being replied to.

language
string
Optional

Language code.

poll_options
string[]
Optional

Poll options.

poll_expires_in
number
Optional

Poll expiration in seconds.

poll_multiple
boolean
Optional

Allow multiple choices in poll.

poll_hide_totals
boolean
Optional

Hide poll totals until poll ends.

Reddit
title
string
Optional

Post title.

selected_subreddit_id
string
Optional

Target subreddit ID (or send `selected_subreddit`).

nsfw
boolean
Optional

Mark post as NSFW.

spoiler
boolean
Optional

Mark post as spoiler.

sendreplies
boolean
Optional

Send reply notifications to inbox.

resubmit
boolean
Optional

Allow resubmission behavior.

flair_id
string
Optional

Flair template ID.

flair_text
string
Optional

Flair text.

scheduling_metadata
object
Optional

Scheduling and promotion metadata payload.

Discord
selected_guild_id
string
Optional

Guild ID (or send `selected_guild`).

selected_channel_id
string
Optional

Channel ID (or send `selected_channel`).

embed_enabled
boolean
Optional

Enable embed payload.

embed_title
string
Optional

Embed title.

embed_description
string
Optional

Embed description body.

embed_color
string
Optional

Embed color in hex format.

embed_footer
string
Optional

Embed footer text.

Response Example

{
  "success": true,
  "status": "found",
  "platform": "threads",
  "post_details": {
    "topic_tag": "ai",
    "use_topic_tag": true
  },
  "is_ghost_instance": false
}

Notes

  • Supports API key (`bolta_sk_...`) and JWT auth
  • Requires `posts:read` for GET and `posts:write` for POST/PUT/PATCH when using API keys
  • Workspace members must have `view_drafts` (read) and `edit_posts` (write) permissions
  • POST and PUT support the same platform payload shape; PATCH can be used for partial field updates
  • Platform payload fields (verified from `SERVER/posts/post_details_api_v1_views.py` model-driven config):
  • X: post_type, reply_settings, quoted_tweet_id, in_reply_to_tweet_id, poll_options, poll_duration_minutes, geo_place_id, media_tagged_user_ids, for_super_followers_only, auto_publish, is_thread, thread_position
  • Threads: topic_tag, use_topic_tag, location_id, auto_publish, reply_control, is_ghost_post, is_spoiler_media
  • LinkedIn: post_type, visibility, post_as_organization, selected_organization|selected_organization_id, cross_post_organizations, cross_post_enabled, cross_post_delay, include_hashtags, tag_connections, enable_comments, enable_resharing, linkedin_specific_content, location, feeling, activity
  • Facebook: post_type, privacy, primary_page|primary_page_id, cross_post_pages, enable_comments, enable_sharing, enable_reactions, cross_post_enabled, cross_post_delay, location, feeling, activity
  • Instagram: content_type, media_type, caption, alt_text, location_id, user_tags, product_tags, cover_url, thumbnail_offset
  • BlueSky: languages, reply_settings, include_facets
  • Mastodon: visibility, sensitive, spoiler_text, in_reply_to_id, language, poll_options, poll_expires_in, poll_multiple, poll_hide_totals
  • Reddit: title, selected_subreddit|selected_subreddit_id, nsfw, spoiler, sendreplies, resubmit, flair_id, flair_text, scheduling_metadata
  • Discord: selected_guild|selected_guild_id, selected_channel|selected_channel_id, embed_enabled, embed_title, embed_description, embed_color, embed_footer
  • For foreign keys you can send either relation field or *_id (for example `selected_subreddit` or `selected_subreddit_id`)
  • WordPress post details are currently not supported by this unified endpoint and stay on legacy platform routes
POST
/api/v1/posts/{post_id}/details/x
Create X-specific post details payload (reply settings, polls, and thread metadata) for a post.
bash
curl -X POST "https://platty.boltathread.com/api/v1/posts/{post_id}/details/x/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "reply_settings": "everyone",
    "poll_options": ["Option A", "Option B"],
    "poll_duration_minutes": 1440,
    "for_super_followers_only": false
  }'
Parameters
1 required
7 optional
ParameterTypeRequiredDescription
post_id
string (UUID or ghost instance ID)
Required

Post ID in path. Supports loop ghost format: loop-{recurring_post_id}-ghost-{index}.

Optional Parameters
reply_settings
string
Optional

Reply permissions: everyone, mentioned_users, followers.

poll_options
string[]
Optional

Poll options (2-4 options, max 25 chars each).

poll_duration_minutes
number
Optional

Poll duration in minutes (5-10080).

quoted_tweet_id
string
Optional

Tweet ID to quote.

in_reply_to_tweet_id
string
Optional

Parent tweet ID for reply posts.

geo_place_id
string
Optional

Location place ID for tweet geo-tagging.

for_super_followers_only
boolean
Optional

If true, publish for super followers only.

Response Example

{
  "success": true,
  "platform": "x",
  "post_details": {
    "reply_settings": "everyone",
    "poll_options": [
      "Option A",
      "Option B"
    ],
    "poll_duration_minutes": 1440
  },
  "message": "X post details saved successfully"
}

Notes

  • Compatibility route for the unified platform endpoint
  • Supports API key (`bolta_sk_...`) and JWT auth
PUT
/api/v1/posts/{post_id}/details/x
Update X-specific details for an existing post ID (supports regular and loop ghost IDs).
bash
curl -X PUT "https://platty.boltathread.com/api/v1/posts/{post_id}/details/x/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "reply_settings": "mentioned_users",
    "for_super_followers_only": false
  }'
Parameters
1 required
7 optional
ParameterTypeRequiredDescription
post_id
string (UUID or ghost instance ID)
Required

Post ID, supports loop ghost format: loop-{recurring_post_id}-ghost-{index}.

Optional Parameters
reply_settings
string
Optional

Reply permissions: everyone, mentioned_users, followers.

poll_options
string[]
Optional

Poll options (2-4 options, max 25 chars each).

poll_duration_minutes
number
Optional

Poll duration in minutes (5-10080).

quoted_tweet_id
string
Optional

Tweet ID to quote.

in_reply_to_tweet_id
string
Optional

Parent tweet ID for reply posts.

geo_place_id
string
Optional

Location place ID for tweet geo-tagging.

for_super_followers_only
boolean
Optional

If true, publish for super followers only.

Response Example

{
  "success": true,
  "platform": "x",
  "post_details": {
    "reply_settings": "mentioned_users"
  },
  "is_ghost_instance": false,
  "message": "X post details saved successfully"
}

Notes

  • Compatibility route for the unified platform endpoint
  • Supports API key (`bolta_sk_...`) and JWT auth
GET
/api/v1/posts/{post_id}/details/x
Fetch X-specific details for a post.
bash
curl -X GET "https://platty.boltathread.com/api/v1/posts/{post_id}/details/x/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
post_id
string (UUID or ghost instance ID)
Required

Post ID, supports loop ghost format: loop-{recurring_post_id}-ghost-{index}.

Response Example

{
  "success": true,
  "status": "found",
  "platform": "x",
  "post_details": {
    "reply_settings": "everyone",
    "poll_options": []
  },
  "is_ghost_instance": false
}

Notes

  • Compatibility route for the unified platform endpoint
  • Supports API key (`bolta_sk_...`) and JWT auth
POST
/api/v1/posts/{post_id}/details/threads
Create Threads-specific post details and attach them to an existing post.
bash
curl -X POST "https://platty.boltathread.com/api/v1/posts/{post_id}/details/threads/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "topic_tag": "ai",
    "use_topic_tag": true,
    "reply_control": "everyone"
  }'
Parameters
1 required
7 optional
ParameterTypeRequiredDescription
post_id
string (UUID or ghost instance ID)
Required

Post ID in path. Supports loop ghost format: loop-{recurring_post_id}-ghost-{index}.

Optional Parameters
topic_tag
string
Optional

Optional Threads topic tag.

reply_control
string
Optional

Reply controls: everyone, mentioned, followers.

use_topic_tag
boolean
Optional

Enable topic tag usage on Threads.

location_id
string
Optional

Threads location ID.

auto_publish
boolean
Optional

Auto-publish behavior for Threads.

is_ghost_post
boolean
Optional

Ghost post metadata for recurring instances.

is_spoiler_media
boolean
Optional

Mark attached media as spoiler.

Response Example

{
  "success": true,
  "platform": "threads",
  "post_details": {
    "topic_tag": "ai",
    "use_topic_tag": true,
    "reply_control": "everyone"
  },
  "message": "Threads post details saved successfully"
}

Notes

  • Compatibility route for the unified platform endpoint
  • Supports API key (`bolta_sk_...`) and JWT auth
PUT
/api/v1/posts/{post_id}/details/threads
Update Threads-specific details for an existing post.
bash
curl -X PUT "https://platty.boltathread.com/api/v1/posts/{post_id}/details/threads/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "topic_tag": "growth",
    "use_topic_tag": true,
    "is_spoiler_media": false
  }'
Parameters
1 required
7 optional
ParameterTypeRequiredDescription
post_id
string (UUID or ghost instance ID)
Required

Post ID, supports loop ghost format: loop-{recurring_post_id}-ghost-{index}.

Optional Parameters
topic_tag
string
Optional

Optional Threads topic tag.

use_topic_tag
boolean
Optional

Enable topic tag usage on Threads.

location_id
string
Optional

Threads location ID.

auto_publish
boolean
Optional

Auto-publish behavior for Threads.

reply_control
string
Optional

Reply controls: everyone, mentioned, followers.

is_ghost_post
boolean
Optional

Ghost post metadata for recurring instances.

is_spoiler_media
boolean
Optional

Mark attached media as spoiler.

Response Example

{
  "success": true,
  "platform": "threads",
  "post_details": {
    "topic_tag": "growth",
    "use_topic_tag": true
  },
  "message": "Threads post details saved successfully"
}

Notes

  • Compatibility route for the unified platform endpoint
  • Supports API key (`bolta_sk_...`) and JWT auth
GET
/api/v1/posts/{post_id}/details/threads
Get Threads-specific details for a post (supports regular and loop ghost IDs).
bash
curl -X GET "https://platty.boltathread.com/api/v1/posts/{post_id}/details/threads/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
post_id
string (UUID or ghost instance ID)
Required

Post ID, supports loop ghost format: loop-{recurring_post_id}-ghost-{index}.

Response Example

{
  "success": true,
  "status": "found",
  "platform": "threads",
  "post_details": {
    "topic_tag": "ai",
    "use_topic_tag": true,
    "reply_control": "everyone"
  },
  "is_ghost_instance": false
}

Notes

  • Compatibility route for the unified platform endpoint
  • Supports API key (`bolta_sk_...`) and JWT auth
DEPRECATED /threads/post-details/*
Legacy Threads-only endpoints remain available temporarily for backward compatibility. Migrate to /api/v1/posts/{post_id}/details/threads/.
bash
curl -X GET "https://platty.boltathread.com/threads/post-details/{post_id}/" \
  -H "Authorization: Bearer "
Parameters
1 required
ParameterTypeRequiredDescription
post_id
string
Required

Target post ID.

Response Example

{
  "success": true,
  "deprecated": true,
  "message": "Threads post details retrieved successfully. This endpoint is deprecated; use /api/v1/posts/{post_id}/details/threads/."
}

Notes

  • Responses include deprecation headers (`Deprecation`, `Sunset`, `Link`)
  • Planned for removal after migration window

Bulk Operations

2 endpoints

Create multiple posts at once and track bulk operation status. Perfect for large-scale content scheduling.

POST
/api/v1/posts/bulk
Create multiple posts in a single request. Returns a task ID for tracking the bulk operation status.
bash
curl -X POST "https://platty.boltathread.com/api/v1/posts/bulk/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "{workspace_id}",
    "posts": [
      {
        "content": "Monday motivation! 💪",
        "platform": "twitter",
        "account_id": "880e8400-e29b-41d4-a716-446655440003",
        "scheduled_at": "2025-02-03T09:00:00Z"
      },
      {
        "content": "Tip Tuesday: Always plan your content ahead! 📅",
        "platform": "twitter",
        "account_id": "880e8400-e29b-41d4-a716-446655440003",
        "scheduled_at": "2025-02-04T09:00:00Z"
      }
    ]
  }'
Parameters
2 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

posts
array
Required

Array of post objects (max 100 per request)

Response Example

{
  "task_id": "task_abc123",
  "status": "processing",
  "total_posts": 2,
  "message": "Bulk creation started. Use the task_id to check status."
}

Notes

  • Maximum of 100 posts per bulk request
  • Each post is validated individually
  • Use the returned task_id to check completion status
GET
/api/v1/posts/bulk/{task_id}/status
Check the status of a bulk post creation operation.
bash
curl -X GET "https://platty.boltathread.com/api/v1/posts/bulk/{task_id}/status/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
task_id
string
Required

The task ID returned from bulk create

Response Example

{
  "task_id": "task_abc123",
  "status": "completed",
  "total": 2,
  "successful": 2,
  "failed": 0,
  "created_posts": [
    {
      "id": "post_1",
      "status": "scheduled"
    },
    {
      "id": "post_2",
      "status": "scheduled"
    }
  ],
  "errors": [],
  "completed_at": "2025-01-28T10:31:00Z"
}

Notes

  • Status can be: pending, processing, completed, failed
  • Poll this endpoint to track long-running bulk operations

Recurring Posts

2 endpoints

Manage recurring post approvals. Recurring posts generate content that requires approval before publishing.

POST
/api/v1/posts/recurring/{review_id}/approve
Approve a recurring post for publication. The post will be scheduled according to its recurrence settings.
bash
curl -X POST "https://platty.boltathread.com/api/v1/posts/recurring/{review_id}/approve/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "modifications": {
      "content": "Optional: modified content if needed"
    }
  }'
Parameters
1 required
1 optional
ParameterTypeRequiredDescription
review_id
string (UUID)
Required

The recurring post review ID

Optional Parameters
modifications
object
Optional

Optional modifications to apply before approval

Response Example

{
  "success": true,
  "post_id": "990e8400-e29b-41d4-a716-446655440004",
  "status": "scheduled",
  "scheduled_at": "2025-02-01T14:00:00Z"
}
POST
/api/v1/posts/recurring/{review_id}/reject
Reject a recurring post. Optionally provide a reason for rejection.
bash
curl -X POST "https://platty.boltathread.com/api/v1/posts/recurring/{review_id}/reject/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "Content needs revision - tone doesn't match brand guidelines"
  }'
Parameters
1 required
1 optional
ParameterTypeRequiredDescription
review_id
string (UUID)
Required

The recurring post review ID

Optional Parameters
reason
string
Optional

Reason for rejection (useful for team workflows)

Response Example

{
  "success": true,
  "status": "rejected",
  "reason": "Content needs revision - tone doesn't match brand guidelines"
}

Recurring Templates

3 endpoints

Manage templates for recurring content generation. Create loops (recurring templates) via API, render template content without creating posts, and manage existing templates.

POST
/api/v1/templates/recurring
Create a recurring generation template.
bash
curl -X POST "https://platty.boltathread.com/api/v1/templates/recurring" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "{workspace_id}",
    "name": "Monday Motivation",
    "frequency": "weekly",
    "schedule_day": "monday",
    "schedule_time": "09:00",
    "prompt": "Generate a motivational quote related to tech",
    "voice_profile_id": "{voice_profile_id}"
  }'
Parameters
2 required
ParameterTypeRequiredDescription
name
string
Required

Template name

frequency
string
Required

daily, weekly, monthly

Response Example

{
  "id": "template_123",
  "status": "active",
  "next_run": "2025-02-03T09:00:00Z"
}
POST
/api/v1/workspaces/{workspace_id}/loops
Create a new Loop (recurring template) via API key. Loops automatically generate content on a schedule using your voice profile and topic settings.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/loops/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Daily AI Tips",
    "generation_time": "09:00",
    "voice_profile_id": "{voice_profile_id}",
    "target_account_or_bucket": "account:{account_id}",
    "topics": ["ai_tools", "productivity"],
    "content_size": "standard",
    "context": "Focus on practical tips for developers"
  }'
Parameters
5 required
3 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

name
string
Required

Name for the loop

generation_time
string (HH:MM)
Required

Time of day to generate content (UTC)

voice_profile_id
string (UUID)
Required

Voice profile to use for content generation

target_account_or_bucket
string
Required

Target in format 'account:{uuid}' or 'bucket:{uuid}'

Optional Parameters
topics
string[]
Optional

Array of topic keys for content generation

content_size
string
Optional

Content length: brief, standard, detailed, maximum. Default: standard

context
string
Optional

Additional context or instructions for generation

Response Example

{
  "id": "template_456",
  "name": "Daily AI Tips",
  "generation_time": "09:00:00",
  "status": "active",
  "created_at": "2025-02-01T10:00:00Z"
}

Notes

  • Requires posts:write permission
  • Creates a RecurringTemplate that generates content on a daily schedule
  • The voice_profile_id must belong to the same workspace
  • target_account_or_bucket format: 'account:{uuid}' or 'bucket:{uuid}'
POST
/api/v1/workspaces/{workspace_id}/templates/{template_id}/render
Generate content from a recurring template without creating a post. Useful for previewing what a template would produce, or for generating content to review before committing.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/templates/{template_id}/render/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "topic_seed": "AI productivity tools for remote teams",
    "context": "Focus on practical tips"
  }'
Parameters
2 required
3 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

template_id
string (UUID)
Required

The recurring template ID to render

Optional Parameters
voice_profile_id
string (UUID)
Optional

Override the template's voice profile

topic_seed
string
Optional

Topic seed to guide content generation

context
string
Optional

Additional context for the generation

Response Example

{
  "template_id": "template_789",
  "template_name": "Daily AI Tips",
  "generated_content": "Here are 3 AI productivity tools every remote team should try...",
  "voice_profile_used": "Company Brand Voice",
  "generated_at": "2025-02-01T10:30:00Z"
}

Notes

  • Requires posts:write permission
  • Does NOT create a post — content is returned for preview only
  • Uses the template's configured voice profile unless overridden
  • Useful for agents to preview content before creating a post

Social Buckets

1 endpoint

Group social accounts into buckets for easier cross-posting.

POST
/api/v1/buckets
Create a new social bucket.
bash
curl -X POST "https://platty.boltathread.com/api/v1/buckets" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "workspace_id": "{workspace_id}",
    "name": "Tech Accounts",
    "account_ids": ["acc_1", "acc_2"]
  }'
Parameters
2 required
ParameterTypeRequiredDescription
name
string
Required

Bucket name

account_ids
string[]
Required

List of account IDs

Response Example

{
  "id": "bucket_123",
  "name": "Tech Accounts",
  "account_count": 2
}

Social Accounts

3 endpoints

Manage connected social media accounts. List, connect, and disconnect accounts from your workspace.

GET
/api/v1/workspaces/{workspace_id}/accounts
List all connected social media accounts for a workspace.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/accounts/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Response Example

{
  "accounts": [
    {
      "id": "880e8400-e29b-41d4-a716-446655440003",
      "platform": "twitter",
      "username": "@mycompany",
      "display_name": "My Company",
      "profile_image_url": "https://pbs.twimg.com/...",
      "connected_at": "2025-01-15T10:30:00Z",
      "status": "active"
    },
    {
      "id": "881e8400-e29b-41d4-a716-446655440004",
      "platform": "linkedin",
      "username": "my-company",
      "display_name": "My Company",
      "connected_at": "2025-01-16T11:00:00Z",
      "status": "active"
    }
  ],
  "count": 2
}
POST
/api/v1/workspaces/{workspace_id}/accounts/connect
Initiate OAuth connection for a new social account. Returns a URL to complete the OAuth flow.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/accounts/connect/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "platform": "twitter",
    "callback_url": "https://yourapp.com/oauth/callback"
  }'
Parameters
2 required
1 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

platform
string
Required

Platform to connect (twitter, linkedin, facebook, instagram)

Optional Parameters
callback_url
string
Optional

URL to redirect to after OAuth completion (optional, platform-specific endpoints handle redirects)

Response Example

{
  "message": "OAuth connection requires browser-based authentication",
  "platform": "twitter",
  "instructions": "Use the platform-specific OAuth endpoint for twitter. For programmatic access, consider using the web interface to connect accounts first.",
  "platform_endpoints": {
    "twitter": "/x/oauth/authorize/",
    "linkedin": "/linkedin/oauth/authorize/",
    "facebook": "/facebook/oauth/",
    "instagram": "/instagram/oauth/",
    "threads": "/threads/oauth/",
    "reddit": "/reddit/oauth/authorize/",
    "bluesky": "/bluesky/connect/",
    "mastodon": "/mastodon/oauth/authorize/",
    "discord": "/discord/oauth/authorize/"
  }
}

Notes

  • OAuth connection requires browser-based authentication
  • For programmatic access, connect accounts via the web interface first
  • Platform-specific OAuth endpoints are available for each platform
  • Supported platforms: twitter, linkedin, facebook, instagram, threads, reddit, bluesky, mastodon, discord
DELETE
/api/v1/workspaces/{workspace_id}/accounts/{account_id}
Disconnect a social media account from the workspace.
bash
curl -X DELETE "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/accounts/{account_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
2 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

account_id
string (UUID)
Required

The account ID to disconnect

Response Example

{
  "success": true,
  "message": "Account disconnected successfully"
}

Notes

  • Disconnecting will cancel any scheduled posts for this account
  • Historical data and published posts are retained

Review Workflow

6 endpoints

Submit posts for team review, approve or reject them, and list pending reviews. Required when Safe Mode is enabled or for team collaboration workflows.

POST
/api/v1/workspaces/{workspace_id}/posts/submit-for-review
Submit one or more posts for team review. Changes post status to 'Pending Approval' and creates review records.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/posts/submit-for-review/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "post_ids": ["post_id_1", "post_id_2"],
    "note": "AI drafts ready for review"
  }'
Parameters
2 required
1 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

post_ids
string[]
Required

Array of post IDs to submit for review

Optional Parameters
note
string
Optional

Note for reviewers

Response Example

{
  "submitted": 2,
  "failed": 0,
  "results": [
    {
      "post_id": "post_id_1",
      "status": "submitted"
    },
    {
      "post_id": "post_id_2",
      "status": "submitted"
    }
  ]
}

Notes

  • Posts must belong to the specified workspace
  • Posts must be in Draft status to be submitted for review
  • Requires posts:write permission
POST
/api/v1/workspaces/{workspace_id}/posts/{post_id}/approve
Approve a post pending review. Requires admin or owner role. Supports scheduling modes.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/posts/{post_id}/approve/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "schedule_mode": "approve_only",
    "comments": "Looks good!"
  }'
Parameters
2 required
3 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

post_id
string (UUID)
Required

The post ID to approve

Optional Parameters
schedule_mode
string
Optional

Scheduling mode: 'approve_only' (default), 'use_suggested_time', or 'set_fixed_time'

fixed_time
string (ISO8601)
Optional

Schedule time (required when schedule_mode is 'set_fixed_time')

comments
string
Optional

Approval comments

Response Example

{
  "post_id": "post_id_1",
  "status": "Approved",
  "scheduled": false
}

Notes

  • Requires admin or owner role — creator-role agents will get 403
  • Respects Safe Mode and inbox_safety_mode routing rules
  • schedule_mode 'use_suggested_time' uses the post's existing scheduled_time
GET
/api/v1/workspaces/{workspace_id}/reviews
List all posts pending review in a workspace. Combines team and recurring reviews.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/reviews/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
2 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Optional Parameters
reviewer_id
string
Optional

Filter by reviewer ID, or 'me' for the current user

workflow_type
string
Optional

Filter by workflow: 'team' or 'recurring'

Response Example

{
  "reviews": [
    {
      "id": "review_123",
      "post_id": "post_456",
      "status": "pending",
      "submitted_at": "2025-01-20T14:22:00Z",
      "submitted_by": "agent_789"
    }
  ],
  "count": 1
}

Notes

  • Requires posts:read permission
  • Returns both team reviews and recurring reviews by default
  • Use workflow_type filter to narrow results
GET
/api/v1/workspaces/{workspace_id}/recurring-reviews
List AI-generated recurring posts pending review.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/recurring-reviews/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
2 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Optional Parameters
status
string
Optional

Filter by status: 'pending' (default), 'approved', 'rejected'

template_id
string (UUID)
Optional

Filter by recurring template ID

Response Example

{
  "reviews": [
    {
      "id": "rr_123",
      "post_id": "post_456",
      "template_id": "template_789",
      "status": "pending",
      "generated_at": "2025-01-20T10:00:00Z"
    }
  ],
  "count": 1
}
GET
/api/v1/workspaces/{workspace_id}/team-reviews
List team workflow posts pending review.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/team-reviews/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
2 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Optional Parameters
status
string
Optional

Filter by status: 'pending' (default), 'approved', 'rejected', 'needs_revision'

reviewer_id
string
Optional

Filter by reviewer ID, or 'me' for the current user

Response Example

{
  "reviews": [
    {
      "id": "tr_123",
      "post_id": "post_456",
      "status": "pending",
      "submitted_at": "2025-01-20T14:22:00Z",
      "reviewer_id": "user_789"
    }
  ],
  "count": 1
}
GET
/api/v1/workspaces/{workspace_id}/inbox
Unified inbox view that merges team and recurring post reviews. Returns all pending review items sorted by creation date, with a source field indicating review type.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/inbox/?status=pending&limit=20" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
2 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Optional Parameters
status
string
Optional

Filter by status: pending, approved, rejected. Default: pending

limit
number
Optional

Number of items to return (default: 50, max: 100)

Response Example

{
  "items": [
    {
      "id": "tr_123",
      "source": "team",
      "post_id": "post_456",
      "post_content": "Check out our latest update!",
      "status": "pending",
      "submitted_by": "agent_789",
      "created_at": "2025-02-01T14:22:00Z"
    },
    {
      "id": "rr_456",
      "source": "recurring",
      "post_id": "post_789",
      "template_name": "Daily AI Tips",
      "status": "pending",
      "created_at": "2025-02-01T09:00:00Z"
    }
  ],
  "count": 2,
  "has_more": false
}

Notes

  • Requires posts:read permission
  • Merges TeamPostReview and RecurringPostReview records into one list
  • Each item includes a 'source' field: 'team' or 'recurring'
  • Results sorted by created_at descending (newest first)
  • Use has_more to determine if more results are available

Audit Log

1 endpoint

Export workspace activity logs for compliance, debugging, and monitoring. Combines post activity and admin audit events into a unified timeline.

GET
/api/v1/workspaces/{workspace_id}/audit-log
Export a unified audit log of workspace activity. Merges post activity events and admin audit records, sorted by timestamp. Requires admin or owner role.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/audit-log/?start_time=2025-01-01T00:00:00Z&end_time=2025-02-01T00:00:00Z&limit=100" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
4 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Optional Parameters
start_time
string (ISO 8601)
Optional

Filter events after this timestamp

end_time
string (ISO 8601)
Optional

Filter events before this timestamp

actor_filter
string
Optional

Filter by actor (user email or agent name)

limit
number
Optional

Number of events to return (default: 100, max: 500)

Response Example

{
  "events": [
    {
      "source": "post_activity",
      "action": "status_change",
      "actor": "agent: Content Bot",
      "resource_type": "post",
      "resource_id": "post_123",
      "details": {
        "previous_status": "Draft",
        "new_status": "Scheduled"
      },
      "timestamp": "2025-01-28T14:30:00Z"
    },
    {
      "source": "admin_audit",
      "action": "api_key_created",
      "actor": "user@example.com",
      "resource_type": "api_key",
      "resource_id": "key_456",
      "details": {
        "key_name": "Production Key"
      },
      "timestamp": "2025-01-28T10:00:00Z"
    }
  ],
  "count": 2,
  "has_more": false
}

Notes

  • Requires admin or owner role — other roles will get 403
  • Merges PostActivity and AdminAuditLog records
  • Each event includes a 'source' field: 'post_activity' or 'admin_audit'
  • Events sorted by timestamp descending (newest first)
  • Requires audit:export permission

Agent Architecture V2

15 endpoints

Agents are the primary automation entity. Create and manage agents, their jobs (scheduling and triggers), job runs, and hire from preset templates.

Authorizing agent orchestration

Every endpoint in this section is governed by the agents:manage scope. There is no separate "agent key" type — any API key that holds agents:manage can create, configure, run, and delete agents. To drive agents from your own code (e.g. BoltaClaw / OpenClaw, or any orchestrator), generate a regular API key with agents:manage:

  • It ships in the Admin and Full Access presets. The Read-Only and Content-Creator presets do not include it — it's a powerful scope, opt-in only.
  • Pair it with the scopes the agent's work actually needs (e.g. posts:write, ai:generate, voice:read), since job runs act under the calling key's scopes.
  • A key without it gets 403 with agents:manage named in the error message.

Agents vs. principals

A V2 agent is the automation entity you hire and schedule. Creating one auto-provisions a workspace principal + key behind the scenes, so you don't manage a separate credential per agent. An agent's role, key, and autonomy are managed in the Agents Hub in the dashboard — the API exposes the same controls via the PATCH endpoint below.

Same operations over MCP

Every operation here is also exposed as an MCP tool on the hosted server, so MCP-native agents (Claude Desktop, ChatGPT, BoltaClaw) can orchestrate without raw HTTP. Point your client at https://mcp.bolta.ai/mcp with Authorization: Bearer <key> — the same agents:manage scope applies. Each endpoint maps to a tool:

  • list-agents-v2GET …/agents-v2
  • create-agent-v2POST …/agents-v2
  • update-agent-v2 / delete-agent-v2PATCH / DELETE …/agents-v2/{id}
  • list-agent-jobs-v2 / create-agent-job-v2…/agents-v2/{id}/jobs
  • run-agent-job-now-v2POST …/agents-v2/{id}/jobs/{job_id}/runs
  • list-agent-job-runs-v2GET …/agents-v2/{id}/jobs/{job_id}/runs
  • hire-agent-preset-v2POST …/agents-v2/presets/{preset_id}/hire

See the MCP integration guide for client setup.

GET
/api/v1/workspaces/{workspace_id}/agents-v2
List all agents in a workspace (Agent Architecture V2). Returns agent name, type, role, config, status, and computed permissions.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

POST
/api/v1/workspaces/{workspace_id}/agents-v2
Hire a new agent (Agent Architecture V2). Agents replace flat API keys as the primary automation entity. Supported types: content_creator, engagement, acquisition, reviewer, analytics, moderator, custom. Roles: viewer | creator | editor | admin.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "The Hype Man",
    "type": "content_creator",
    "role": "creator",
    "description": "Specializes in high-energy trend-jacking content",
    "avatar": "🎯",
    "safe_mode": false
  }'
Parameters
3 required
5 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

name
string
Required

Agent display name, e.g. "The Hype Man"

Example: "The Hype Man"
type
string
Required

Agent type: content_creator | engagement | acquisition | reviewer | analytics | moderator | custom

Example: "content_creator"
Optional Parameters
role
string
Optional

Permission role: viewer | creator | editor | admin (default: creator)

Example: "creator"
description
string
Optional

Short description of the agent's focus

Example: "Specializes in high-energy trend-jacking content"
avatar
string
Optional

Emoji or image URL for the agent avatar

Example: "🎯"
config
object
Optional

Type-specific configuration JSON, e.g. {"content_style": "casual", "auto_hashtags": true}

safe_mode
boolean
Optional

When true, agent requires human approval even if role allows direct publish

GET
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}
Get details of a specific agent (Agent Architecture V2)
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
2 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

agent_id
string (UUID)
Required

The agent ID

PATCH
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}
Update an agent's name, type, role, description, avatar, config, safe_mode, or status (Agent Architecture V2). Partial updates supported.
bash
curl -X PATCH "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"name": "Updated Name", "status": "active"}'
Parameters
2 required
5 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

agent_id
string (UUID)
Required

The agent ID to update

Optional Parameters
name
string
Optional

New agent name

role
string
Optional

New role: viewer | creator | editor | admin

status
string
Optional

New status: active | paused | error

safe_mode
boolean
Optional

Toggle safe mode on/off

config
object
Optional

Updated type-specific config JSON

DELETE
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}
Delete an agent and pause all its jobs (Agent Architecture V2). Irreversible — use update-agent-v2 with status=paused for soft pause.
bash
curl -X DELETE "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
2 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

agent_id
string (UUID)
Required

The agent ID to delete

GET
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs
List all jobs for a specific agent (Agent Architecture V2). Jobs are the scheduling/automation binding layer that absorbs Template Loops.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
2 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

agent_id
string (UUID)
Required

The agent ID

POST
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs
Create a new job for an agent (Agent Architecture V2). Jobs bind an agent to voice profiles, social accounts, and a schedule. Triggers: scheduled | on_new_draft | on_new_mention | on_new_comment | keyword_match | manual.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Max\'s Twitter",
    "voice_profile_id": "voice-uuid",
    "account_ids": ["account-uuid"],
    "schedule": {"cron": "0 9 * * 1"},
    "trigger": "scheduled",
    "max_retries": 2
  }'
Parameters
3 required
6 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

agent_id
string (UUID)
Required

The agent this job belongs to

name
string
Required

Descriptive job name, e.g. "Max's Twitter"

Example: "Max's Twitter"
Optional Parameters
voice_profile_id
string (UUID)
Optional

Voice profile UUID for content generation (nullable for analytics/moderator)

account_ids
array of UUIDs
Optional

Social account UUIDs this job should target

schedule
object
Optional

Cron or interval config, e.g. {"cron": "0 9 * * 1"} or {"interval": "daily", "time": "09:00", "timezone": "America/New_York"}

trigger
string
Optional

What fires this job: scheduled (default) | on_new_draft | on_new_mention | on_new_comment | keyword_match | manual

Example: "scheduled"
trigger_config
object
Optional

Trigger-specific params, e.g. keywords[], subreddits[]

max_retries
integer
Optional

Max rejected-draft retries before escalating to inbox (default: 2)

Example: 2
GET
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}
Get details of a specific agent job (Agent Architecture V2). Returns job name, schedule, status, voice_profile_id, account_ids, run_instructions, and trigger configuration.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
3 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

agent_id
string (UUID)
Required

The agent ID

job_id
string (UUID)
Required

The job ID to retrieve

PATCH
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}
Update an agent job (Agent Architecture V2). Supports partial updates to job name, status, schedule, voice_profile_id, account_ids, run_instructions, and trigger configuration.
bash
curl -X PATCH "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"name": "Updated Job Name", "status": "active"}'
Parameters
3 required
6 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

agent_id
string (UUID)
Required

The agent ID

job_id
string (UUID)
Required

The job ID to update

Optional Parameters
name
string
Optional

Updated job name

status
string
Optional

Updated status: active | paused | error

schedule
object
Optional

Updated schedule configuration

run_instructions
string
Optional

Updated execution instructions for the agent

voice_profile_id
string (UUID)
Optional

Updated voice profile ID

account_ids
array of UUIDs
Optional

Updated target account IDs

DELETE
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}
Delete an agent job (Agent Architecture V2). Irreversible — use update-agent-job-v2 with status=paused for soft pause.
bash
curl -X DELETE "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
3 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

agent_id
string (UUID)
Required

The agent ID

job_id
string (UUID)
Required

The job ID to delete

GET
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}/runs
List execution history for an agent job (Agent Architecture V2). Returns run status, start/end time, duration, token usage, cost, and result summary. Ordered by most recent first.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}/runs/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
3 required
1 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

agent_id
string (UUID)
Required

The agent ID

job_id
string (UUID)
Required

The job ID

Optional Parameters
limit
number
Optional

Max results to return (default 50, max 200)

POST
/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}/runs
Trigger immediate execution of an agent job ('Run Now'). Creates a Run record and dispatches execution to the agentic engine. The agent will use its assigned tools to complete the job. Returns run_id and dispatched status (202 Accepted).
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/{agent_id}/jobs/{job_id}/runs/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{}'
Parameters
3 required
2 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

Workspace UUID

agent_id
string (UUID)
Required

Agent UUID

job_id
string (UUID)
Required

Job UUID

Optional Parameters
run_instructions
string
Optional

Override run instructions for this execution

account_id
string (UUID)
Optional

Target account UUID

GET
/api/v1/workspaces/{workspace_id}/agents-v2/presets
List available agent presets (marketplace templates). Returns preset metadata: id, name, type, emoji, tagline, description, persona, and default model tier.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/presets/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

Notes

  • Returns preset catalog with starter agent templates
  • Examples: Hype Man, Deep Diver, Hunter, Watchdog, etc.
GET
/api/v1/workspaces/{workspace_id}/agents-v2/presets/{preset_id}
Get full details for a specific agent preset, including persona and default job configuration.
bash
curl -X GET "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/presets/{preset_id}/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
2 required
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

preset_id
string
Required

Preset identifier (e.g. 'hype-man', 'deep-diver')

Notes

  • Returns full preset data including persona and default job config
  • Useful for previewing a preset before hiring it
POST
/api/v1/workspaces/{workspace_id}/agents-v2/presets/{preset_id}/hire
Create a new agent from a preset template ('hire' an agent). Creates both the Agent record and a default Job in a single transaction. Returns agent + job details.
bash
curl -X POST "https://platty.boltathread.com/api/v1/workspaces/{workspace_id}/agents-v2/presets/{preset_id}/hire/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{"name": "My Hype Man", "job_name": "Twitter Job", "voice_profile_id": "voice-uuid", "account_ids": ["account-uuid"]}'
Parameters
2 required
4 optional
ParameterTypeRequiredDescription
workspace_id
string (UUID)
Required

The workspace ID

preset_id
string
Required

Preset identifier (e.g. 'hype-man', 'deep-diver')

Optional Parameters
name
string
Optional

Optional override for the agent name

job_name
string
Optional

Optional override for the default job name

voice_profile_id
string (UUID)
Optional

Voice profile UUID override, required by some content presets

account_ids
string[]
Optional

Optional social account UUIDs to attach to the default job

Notes

  • Will create agent + default job from preset template
  • Presets defined in agents/presets.py module

Image Generation

1 endpoint

Generate brand-consistent AI images. Use the image_prompt from voice/generate for best results, with optional logo reference for visual identity.

POST
/api/v1/image/generate
Generate brand-consistent AI images. Pass a prompt (ideally the image_prompt field from voice/generate) and an optional logo reference URL. The model uses your brand visual identity to produce on-brand images. Credits are tracked per image generated (1 credit for standard models, 3 for high-end).
bash
curl -X POST "https://platty.boltathread.com/api/v1/image/generate/" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A professional headshot in a modern office setting",
    "reference_image_url": "https://example.com/logo.png",
    "num_images": 1,
    "image_size": "square_hd",
    "model": "fal-ai/nano-banana-2"
  }'
Parameters
1 required
4 optional
ParameterTypeRequiredDescription
prompt
string
Required

Image generation prompt. For best results, use the image_prompt field returned by /api/v1/voice/generate — it is crafted to match the post content.

Optional Parameters
reference_image_url
string
Optional

URL of brand logo or reference image. Anchors colors, style, and visual identity for brand-consistent output.

num_images
integer
Optional

Number of images to generate (1-10). Defaults to 1. Each costs 1 credit.

image_size
string
Optional

Image dimensions. Defaults to "square_hd". Options: square_hd, landscape_16_9, portrait_9_16.

model
string
Optional

AI model to use. Defaults to "fal-ai/nano-banana-2". High-end models (e.g. fal-ai/nano-banana-2, openai/gpt-image-2, flux/dev) cost 3 credits per image.

Notes

  • Requires ai:generate permission on API key
  • Credits deducted per image: 1 credit (standard), 3 credits (high-end models)
  • Use image_prompt from voice/generate for semantically matched visuals
  • reference_image_url should be a publicly accessible logo/brand image URL

Analytics

1 endpoint

Get insights into your content performance and platform growth.

GET
/api/v1/analytics/platform
Get aggregated platform metrics.
bash
curl -X GET "https://platty.boltathread.com/api/v1/analytics/platform?workspace_id={workspace_id}&range=30d" \
  -H "Authorization: Bearer bolta_sk_your_api_key_here"
Parameters
1 optional
ParameterTypeRequiredDescription
range
string
Optional

Time range (7d, 30d, 90d)

Response Example

{
  "total_impressions": 50000,
  "total_engagements": 2500,
  "growth_rate": 15.5
}

Integrations

Outbound webhooks for event notifications.

Webhooks — coming soon

Outbound webhooks (event callbacks like post.published / post.failed to a URL you control) are not yet available. There is currently no POST /api/v1/webhooks endpoint; calling it returns 404.

This page previously documented a POST /api/v1/webhooks route that was never built — it has been removed so you don't integrate against a dead endpoint.

Need event notifications today? Poll the relevant resource (e.g. scheduled posts via GET /api/v1/workspaces/{workspace_id}/posts/scheduled/) on an interval, or email support@bolta.ai to register interest so we prioritize the webhook build.

Agent Roles

Agent service accounts use role-based permissions. Each role grants a specific set of API scopes that determine which endpoints and skill planes are accessible.

Permission Matrix

PermissionViewerCreatorEditorAdmin
posts:readYesYesYesYes
posts:writeYesYesYes
posts:deleteYesYes
accounts:readYesYesYesYes
accounts:connectYes
recurring:manageYesYesYes
voice:readYesYesYesYes
voice:writeYesYesYes
ai:generateYesYesYes
content:bulkYesYes
workspace:readYesYesYesYes
review:submitYesYesYes
review:approveYesYes
audit:exportYesYes
team:manageYes
team:manage_keysYesYes
Total scopes491416

Skill Planes by Role

PlaneDescriptionSkillsMin Role
InitVoice bootstrap and training4Creator
ContentDrafting and content planning3Creator
AutomationScheduled generation and publishing2Creator
ReviewApproval workflows and triage3Viewer
ControlAudit, key rotation, and agent management4Viewer

Viewer unlocks 2 planes (Review, Control read-only). Creator unlocks all 5 planes. Editor adds approval and publishing skills. Admin adds agent management skills.

Rate Limits

API rate limits help ensure fair usage and system stability. All limits are tracked per API key.

Default Rate Limits
All API keys have the following default rate limits per API key
  • Per Minute
    100 requests per minute
  • Per Hour
    1,000 requests per hour
  • Per Day
    10,000 requests per day
Rate Limit Headers
Every API response includes rate limit information in headers
http
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1640995200
Rate Limit Exceeded
When you exceed a rate limit, you'll receive a 429 response
json
{
  "error": "Rate limit exceeded",
  "message": "API rate limit exceeded (per_minute: 100 requests). Limit resets at 2026-01-28T06:00:00.",
  "rate_limit": {
    "limit": 100,
    "limit_type": "per_minute",
    "reset_time": "2026-01-28T06:00:00"
  }
}

The response also includes a Retry-After header indicating when you can retry.

Requesting Higher Limits
Need higher rate limits? We're happy to help!

If you need higher rate limits for your use case, please contact our team:

  • Email: support@bolta.ai
  • Subject: API Rate Limit Increase Request

Include details about your use case, expected request volume, and API key ID (optional) for faster processing.

Error Responses

Common Status Codes
  • 200
    Success
  • 201
    Created - Resource successfully created
  • 204
    No Content - Successful deletion
  • 400
    Bad Request - Invalid request body or parameters
  • 401
    Unauthorized - Invalid API key
  • 403
    Forbidden - Insufficient permissions
  • 404
    Not Found
  • 409
    Conflict - Resource already exists
  • 422
    Unprocessable Entity - Validation failed
  • 429
    Too Many Requests - Rate limit exceeded
  • 500
    Internal Server Error
Bolta — Create a Week of Social Media Content in Minutes