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.
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);