← acaption.com
API Documentation
Overview

The Acaption API generates explicit, conversion-optimised captions for adult content images and videos. Send a base64-encoded image or a raw video file — receive three caption variants instantly. No filters, no refusals.

The API is designed for direct integration into creator tools, agency platforms (Clawbot, SuperCreator, etc.), and custom automation pipelines. Authentication uses a static API key passed in a header — no OAuth, no sessions.

POST https://acaption.com/.netlify/functions/acaption
Authentication

API Key

Pass your API key in the X-Api-Key request header. Keys are prefixed ac_. You receive your key by email after subscribing at acaption.com/#pricing.

HTTP Header
X-Api-Key: ac_your_api_key_here
Omit the header to use the demo mode — limited to 3 requests per IP address, no subscription required. Demo responses are identical to authenticated responses.
Request

Content-Type

All requests must use Content-Type: application/json.

Image

Send one base64-encoded image. Supported MIME types: image/jpeg, image/png, image/webp, image/gif.

FieldTypeRequiredDescription
imageData string required Base64-encoded image bytes (no data: prefix).
imageType string required MIME type of the image, e.g. "image/jpeg".
JSON
{
  "imageData": "/9j/4AAQSkZJRgABAQAA...",
  "imageType": "image/jpeg"
}

Video

POST https://api.acaption.com/caption

Video captioning uses a dedicated endpoint. Send your raw video file as multipart/form-data — Acaption handles all processing server-side and returns three captions reflecting the full content of the video.

Supported formats: video/mp4, video/quicktime, video/x-msvideo. Available on Pro and Agency plans. Contact hello@acaption.com to enable video access on your key.

# Video — multipart/form-data
curl -s -X POST https://api.acaption.com/caption \
  -H "X-Api-Key: YOUR_API_KEY" \
  -F "video=@/path/to/video.mp4"
Response

200 OK — Success

FieldTypeDescription
captions array Array of 3 caption objects, each with label and text.
captions[].label string Caption style: "Raw & Direct", "Sensual & Teasing", or "Bold & Provocative".
captions[].text string The generated caption text.
demo boolean true if the request was unauthenticated (demo mode), false otherwise.
JSON
{
  "captions": [
    {
      "label": "Raw & Direct",
      "text": "She's pinned against the wall, dress barely covering anything."
    },
    {
      "label": "Sensual & Teasing",
      "text": "There's something about the way the light hits that lace..."
    },
    {
      "label": "Bold & Provocative",
      "text": "Not here for your comfort zone. Tap if you can handle it."
    }
  ],
  "demo": false
}
Error Codes
401
Unauthorized — API key is missing, invalid, or the subscription is inactive. Check the key value and your account status at acaption.com/account.
422
Prohibited Content — The image contains content that cannot be processed (e.g. minors detected). The file is not charged against your quota.
429
Limit Reached — Monthly file quota exceeded (Essential plan: 200/month) or demo limit reached (3 requests per IP). Quota resets on your billing anniversary date.
502
Upstream Error — Caption generation failed (upstream AI error). Retry the request. If it persists, contact hello@acaption.com.
500
Internal Error — Unexpected server error. Retry the request.

All error responses follow this shape:

JSON
{ "error": "Human-readable error message" }
Code Examples
bash
# Encode image and send
IMAGE_B64=$(base64 -i /path/to/photo.jpg)

curl -s -X POST https://acaption.com/.netlify/functions/acaption \
  -H "Content-Type: application/json" \
  -H "X-Api-Key: ac_your_api_key_here" \
  -d "{\"imageData\":\"$IMAGE_B64\",\"imageType\":\"image/jpeg\"}"
python
import base64, requests

# Load and encode image
with open("/path/to/photo.jpg", "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode()

# Call Acaption API
response = requests.post(
    "https://acaption.com/.netlify/functions/acaption",
    headers={
        "Content-Type": "application/json",
        "X-Api-Key": "ac_your_api_key_here",
    },
    json={
        "imageData": image_b64,
        "imageType": "image/jpeg",
    },
)

data = response.json()

if response.status_code == 200:
    for caption in data["captions"]:
        print(f"{caption['label']}: {caption['text']}")
else:
    print("Error:", data.get("error"))
javascript
const fs = require("fs");

// Load and encode image
const imageBuffer = fs.readFileSync("/path/to/photo.jpg");
const imageB64 = imageBuffer.toString("base64");

// Call Acaption API
const response = await fetch(
  "https://acaption.com/.netlify/functions/acaption",
  {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "X-Api-Key": "ac_your_api_key_here",
    },
    body: JSON.stringify({
      imageData: imageB64,
      imageType: "image/jpeg",
    }),
  }
);

const data = await response.json();

if (response.ok) {
  data.captions.forEach(c => console.log(`${c.label}: ${c.text}`));
} else {
  console.error("Error:", data.error);
}
Pricing

B2B / Agency API access is priced individually based on your volume and integration needs. Plans start from €149 / month, invoiced as a B2B SaaS licence via Stripe or bank transfer.

Each API call (image or video) counts as 1 file against your agreed monthly quota. Dedicated rate limits and multi-client key management included on all plans.

Contact hello@acaption.com to discuss your requirements and receive a quote.

Integration Tips

Image size — Images do not need to be full resolution. Resize to 1024px on the longest side before encoding to keep payloads small and latency low. JPEG quality 80 is sufficient.

Video — Send the raw file. Frame extraction is handled server-side — no preprocessing required on your end.

Retry on 502/500 — Upstream AI errors are transient. Implement an exponential backoff retry (3 attempts, starting at 2 s delay).

Base64 encoding — Encode raw image bytes only. Do not include the data:image/jpeg;base64, data-URI prefix — the API expects a bare base64 string.


Ready to integrate?

Get your API key in minutes. No onboarding call, no approval process.

Get API Access →