ABCD Studio — Anybody Can Direct
DEVELOPER API REFERENCE

Build on ABCD Studio

ABCD Studio is an AI film studio. Developers reach every studio — image, video, character vault and publishing — through one MCP (Model Context Protocol) JSON-RPC endpoint, so you can drive ABCD from your own apps, agents (Claude, ChatGPT, Cursor) and pipelines.

Platform overview

  • One endpoint: POST https://abcdstudio.ai/api/mcp speaks JSON-RPC 2.0.
  • Tools, not resources: you call named tools (generate_image, generate_video, poll_job, …) rather than REST resources.
  • Async by design: generation tools return a job_id; poll it with poll_job until status: "complete".
  • Scoped keys: each API key is limited to the scopes you grant it.

Supported use cases

Batch image/video generation, agent-driven film pipelines, character-consistent asset lookup from your Vault, and auto-publishing finished reels to the public feed.

Authentication

Create a key in your Developer Portal. Keys look like mcp_live_… and are shown once — store it securely. Send it on every request:

http
POST /api/mcp HTTP/1.1
X-API-Key: mcp_live_YOUR_KEY
Content-Type: application/json

Keys carry scopes that gate which tools they can call:

ScopeUnlocks
image_gengenerate_image, poll_job
video_gengenerate_video, poll_job
vault_readsearch_vault, get_character
publishpublish_asset
film_pipeline, audio_editadvanced pipeline & audio tools

Quick start

  1. Create an ABCD account and sign in.
  2. Open the Developer Portal and generate an API key with the image_gen scope.
  3. Make your first call:
bash
curl -sS -X POST 'https://abcdstudio.ai/api/mcp' \
  -H 'Content-Type: application/json' \
  -H 'X-API-Key: mcp_live_YOUR_KEY' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"generate_image","arguments":{"prompt":"cinematic still: neon-lit rainy alley","aspect_ratio":"16:9"}}}'

Sample response:

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": { "job_id": "job_abc123", "status": "queued" }
}

Then poll until it's done:

json
{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "status": "complete",
    "progress": 100,
    "assets": [{ "asset_id": "asset_abc123", "url": "https://.../image.png", "kind": "image" }]
  }
}

Tools reference

List all tools and their schemas at runtime with the tools/list method. Each tool below is called via tools/call.

generate_imagescope: image_gen

Start an image generation job. Returns a job_id you poll with poll_job.

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "generate_image",
    "arguments": {
      "prompt": "cinematic still: neon-lit rainy alley, wide lens",
      "aspect_ratio": "16:9"
    }
  }
}
generate_videoscope: video_gen

Start a video generation job. Returns a job_id.

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "generate_video",
    "arguments": {
      "prompt": "slow dolly-in on a rusting spacecraft, dust motes in a sunbeam",
      "duration_seconds": 5,
      "aspect_ratio": "16:9"
    }
  }
}
poll_jobscope: image_gen / video_gen

Poll a job. Returns status, progress and (on completion) an assets array.

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "poll_job",
    "arguments": {
      "job_id": "job_abc123"
    }
  }
}
search_vaultscope: vault_read

Full-text search across your Vault. Filter by kind = image | video.

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "search_vault",
    "arguments": {
      "query": "spaceship",
      "kind": "image",
      "limit": 5
    }
  }
}
get_characterscope: vault_read

Fetch a single character asset — portrait, sheet and style notes.

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "get_character",
    "arguments": {
      "character_id": "char_abc123"
    }
  }
}
publish_assetscope: publish

Publish a Vault asset to the public feed.

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "publish_asset",
    "arguments": {
      "asset_id": "asset_abc123",
      "title": "My cinematic reel",
      "visibility": "public"
    }
  }
}

Rate limits

Each key has a per-minute request cap (RPM). The default is 60 RPM; higher limits are available per key. Every response carries live budget headers:

http
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-RateLimit-Reset: 1718000000

Exceeding the cap returns HTTP 429 with a Retry-After header. Back off and retry after the reset window.

Error handling

Errors follow the JSON-RPC 2.0 error shape:

json
{
  "jsonrpc": "2.0",
  "id": 1,
  "error": { "code": -32602, "message": "Invalid params: 'prompt' is required" }
}
SituationSignal
Missing / invalid keyHTTP 401
Key lacks the tool's scopeHTTP 403
Bad paramsJSON-RPC -32602
Unknown method/toolJSON-RPC -32601
Rate limitedHTTP 429 + Retry-After

Webhooks

Register webhook endpoints in the Developer Portal to be notified when long-running jobs finish. Events:

  • job_completed_image — an image job finished
  • job_completed_video — a video job finished
  • job_failed — a job failed
  • webhook.test — a test ping you trigger from the portal

Each delivery includes an X-ABCD-Event header and an X-ABCD-Signature: sha256=… HMAC of the raw body. Failed deliveries retry up to 3 times at 15s intervals. Verify the signature:

python
import hashlib, hmac

def verify(secret: str, body: bytes, header: str) -> bool:
    expected = "sha256=" + hmac.new(secret.encode(), body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, header or "")

# In your handler: verify(WEBHOOK_SECRET, raw_body, request.headers["X-ABCD-Signature"])

MCP integration guide

ABCD is a standards-compliant MCP server, so any MCP client can connect. Point your client at https://abcdstudio.ai/api/mcp and authenticate with your key.

Claude Desktop

json
{
  "mcpServers": {
    "abcd-studio": {
      "url": "https://abcdstudio.ai/api/mcp",
      "headers": { "X-API-Key": "mcp_live_YOUR_KEY" }
    }
  }
}

The Developer Portal auto-generates ready-to-paste configs for Claude Desktop, the OpenAI Responses API and Codex. Prefer a personal, zero-config URL? Use the Connect flow for a tokenised MCP URL.

Client SDKs

Official SDKs wrap the JSON-RPC calls so you never hand-write a request. All three expose the same methods: generate_image, generate_video, poll_job, wait_for_job, search_vault, get_character, publish_asset.

Python

bash
pip install abcd-studio

Node.js (Node 18+)

bash
npm install @abcd-studio/sdk

C# / .NET (.NET 8+)

bash
dotnet add package AbcdStudio

Source for all SDKs lives in the repo under /sdks/python, /sdks/node and /sdks/dotnet — installable from source today, and from PyPI / npm / NuGet once published.

Best practices

  • Security: keep keys server-side, never in client bundles. Rotate keys periodically and revoke unused ones from the portal.
  • Rate limits: read X-RateLimit-Remaining and back off on 429 with exponential retry.
  • Scopes: mint the narrowest scope set a key needs.
  • Polling: poll poll_job every 2–5s rather than tight loops; prefer webhooks for completion.
  • Production: handle both HTTP-level (401/403/429) and JSON-RPC-level errors; log the id you sent for correlation.

Ready to build?

Generate a key and fire your first call in minutes.

Open Developer Portal →