API Documentation

Build custom integrations with the BlackOps Center REST API to access your content library, voice profiles, and content endpoints.

Build custom integrations with the BlackOps Center REST API. Access your content library, voice profiles, and AI generation features programmatically.

Authentication

The API uses token-based authentication for extension endpoints. Include your API token in the Authorization header of each request.

# Include in all requests
Authorization: Bearer YOUR_API_TOKEN

Get Your API Token

Generate an API token from the Browser Extension settings page in your admin dashboard. Keep this token secure and never share it publicly.

Base URL

https://blackopscenter.com/api

Content Library API

POST /ext/content-library

Save content to your Content Library. Supports articles, tweets, links, and blog posts.

Request Body

{
  "url": "https://example.com/article",
  "title": "Article Title",
  "content_type": "article",
  "excerpt": "Brief description...",
  "author": "Author Name",
  "tags": ["tag1", "tag2"],
  "notes": "Personal notes about this content"
}

Response

{
  "success": true,
  "id": "uuid-of-saved-content",
  "message": "Content saved successfully"
}

GET /ext/content-library

Retrieve saved content from your library with optional filtering.

Query Parameters

| Parameter | Description | |---|---| | content_type | Filter by type: article, tweet, link, blog_post | | tag | Filter by tag | | search | Full-text search query | | limit | Number of results (default: 50) |

OpenClaw Integration

Control BlackOps Center with AI

The BlackOps Center skill for OpenClaw lets you manage your content through natural language conversations or CLI commands. Create posts, publish drafts, and manage multiple sites without touching the web interface.

View Skill on GitHub

Installation

# Via ClawdHub (recommended)
clawdhub install blackops-center

# Or manual clone
git clone https://github.com/BlackOpsCenter/clawdbot-skill.git ~/.openclaw/skills/blackops-center

Configure with your API token from the Browser Extension settings page.

Natural Language Usage

  • "Create a blog post about AI content strategy" — OpenClaw generates the post and returns a preview link
  • "Publish post abc123" — OpenClaw publishes the draft and shows the live URL
  • "Route these 5 blog posts to the correct sites" — OpenClaw intelligently routes posts to different sites based on content

CLI Commands

# List all sites
blackops-center list-sites

# Create a draft post
blackops-center create-post \
  --title "Post Title" \
  --content "$(cat post.md)" \
  --tags "ai,automation"

# Create on specific site
blackops-center create-post \
  --domain "blog.vitalwall.com" \
  --title "Site-Specific Post" \
  --content "..."

# Publish a draft
blackops-center update-post <id> --status published

# List draft posts
blackops-center list-posts --status draft

# Get your AI-analyzed voice profile
blackops-center get-voice --domain benenewton.com

Preview & Published URLs (v1.1.0+)

The skill automatically outputs shareable URLs when creating or publishing posts:

$ blackops-center create-post --title "Test" --content "..."

✓ Post created: draft
Preview: https://blackopscenter.com/preview/test?token=abc123

$ blackops-center update-post abc123 --status published

✓ Post published
Live URL: https://blackopscenter.com/test

JSON responses go to stdout for programmatic use, while human-readable messages go to stderr. This means you can pipe the JSON to jq while still seeing helpful status messages.

Twitter API

POST /ext/twitter/compose-tweet

Generate a tweet using your voice profile. Returns AI-generated content matching your style.

Request Body

{
  "topic": "Content topic or idea",
  "context": "Additional context or requirements",
  "tone": "optional tone override"
}

POST /ext/twitter/generate-reply

Generate a contextual reply to a tweet. Uses your voice profile and considers the original tweet's content.

Request Body

{
  "tweet_text": "Text of the tweet to reply to",
  "tweet_author": "Author's username",
  "intent": "agree, challenge, add_value, ask_question"
}

Voice Profile API

AI-Analyzed Writing Voice

BlackOps Center analyzes your published blog posts to extract your authentic writing voice: tone scores, style features, expertise areas, and common patterns. This isn't a marketing persona you configure, it's a data-driven fingerprint of how you actually write.

GET /ext/sites/{siteId}/voice

Retrieve the AI-analyzed voice profile for a site. Returns tone scores, style features, expertise areas, common writing patterns, and a ready-to-use prompt for AI content generation. Uses API token authentication.

Path Parameters

| Parameter | Description | |---|---| | siteId | UUID of the site (get from /ext/sites) |

Response

{
  "voice_profile": {
    "tone_scores": {
      "casual": 0.5,
      "friendly": 0.62,
      "humorous": 0.23,
      "technical": 0.76,
      "analytical": 0.69,
      "professional": 0.72,
      "authoritative": 0.68,
      "conversational": 0.61
    },
    "style_features": [
      "technical_density",
      "personal_anecdotes",
      "avg_sentence_length",
      "code_examples_usage",
      "paragraph_structure"
    ],
    "expertise_areas": [
      "software development",
      "AI integration",
      "DevOps",
      "frontend architecture"
    ],
    "common_patterns": [
      "What if",
      "Here's how",
      "The problem was",
      "Sound familiar?"
    ],
    "compiled_prompt": "Writing style: technical, professional...",
    "sample_size": 10
  },
  "examples": [],
  "analysis_count": 10
}

Voice Profile Fields

| Field | Description | |---|---| | tone_scores | Numeric breakdown of writing tone on a 0–1 scale (casual, technical, authoritative, etc.) | | style_features | Structural characteristics: sentence length, paragraph structure, use of code examples | | expertise_areas | Topics and domains extracted from published content | | common_patterns | Phrases, hooks, and rhetorical patterns you frequently use | | compiled_prompt | Ready-to-use prompt string for AI models: feed this directly to generate content in your voice | | analysis_count | Number of posts analyzed to build the profile (more posts = more accurate voice) |

Subscribers API (v2)

Grow a site's newsletter list from your own application. Both endpoints live under https://blackopscenter.com/api/v2 and authenticate with your API key (Authorization: Bearer YOUR_API_KEY). Target the site with a domain (or site_id) field.

Every add runs the full double opt-in: the subscriber lands as pending and receives a confirmation email, joining the list only after clicking it. There is intentionally no way to skip confirmation, and the site must have a verified sending domain or the request is rejected with sender_unavailable.

POST /subscribers

Add a subscriber — for example, when a user signs up for your product.

{
  "domain": "blog.yourdomain.com",
  "email": "reader@example.com",
  "name": "Optional Name"
}

Response (201 on a new signup, 200 on resend/already-subscribed):

{
  "success": true,
  "data": {
    "status": "verification_sent",
    "message": "Please check your email to confirm your subscription",
    "requires_verification": true
  }
}

status is one of verification_sent, verification_resent, or already_subscribed. A 409 with code sender_unavailable means the site's sending domain isn't verified yet.

GET /subscribers/stats

Aggregate list health — active, pending, and unsubscribed counts plus signups in the last 30 days. This is deliberately the only read surface: the API never returns individual email addresses.

{
  "success": true,
  "data": {
    "stats": { "active": 412, "pending": 9, "unsubscribed": 33, "total": 454, "new_last_30d": 57 }
  }
}

Browser forms (no API key)

For a subscribe form on any external site, skip the API entirely: the public endpoint on the site's own domain accepts cross-origin requests with no auth. See the embed snippet in the Newsletter docs.

POST https://blog.yourdomain.com/api/newsletter/subscribe
Content-Type: application/json

{ "email": "reader@example.com" }

Error Handling

The API returns standard HTTP status codes and JSON error responses:

| Status | Meaning | |---|---| | 400 | Bad Request - Invalid parameters | | 401 | Unauthorized - Invalid or missing token | | 403 | Forbidden - Insufficient permissions | | 404 | Not Found - Resource doesn't exist | | 429 | Too Many Requests - Rate limit exceeded | | 500 | Server Error - Something went wrong |

Rate Limits

API requests are rate limited to ensure fair usage:

  • Extension API: 100 requests per minute
  • Content Generation: 10 requests per minute
  • Bulk Operations: 5 requests per minute

Rate limit headers are included in all responses: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Example: Save Content from Node.js

const response = await fetch('https://blackopscenter.com/api/ext/content-library', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_TOKEN',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    url: 'https://example.com/great-article',
    title: 'Great Article Title',
    content_type: 'article',
    tags: ['inspiration', 'content-ideas']
  })
});

const result = await response.json();
console.log(result);
Want this page as machine-readable markdown? GET /docs/developer/api.md