Spicy API
Uncensored image, image-to-video and chat generation for adult apps (18+). OpenAI-compatible REST API plus 15 MCP tools: model prices, cost estimates, generation with per-spend approval, jobs, usage, top-up links and a monthly spend limit. Prompts are screened before billing and sandbox keys bill nothing.
Hosted MCP Server
npx add-mcp 'https://www.spicyapi.com/api/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Spicy API documentation
Spicy API is one REST API for uncensored image, image-editing, video and chat generation, sold per generation from a prepaid US-dollar balance: no subscription, no GPUs to run. It is OpenAI-compatible (point the OpenAI SDK at https://api.spicyapi.com/v1 with a Spicy API key) and includes our own POV video fine-tunes. Not to be confused with spicyapi.ai, an unrelated model aggregator.
Base URL https://api.spicyapi.com. Authenticate with Authorization: Bearer sk-spicy-... (keys from https://www.spicyapi.com/dashboard/api-keys, shown once, stored hashed). Check your balance with GET /v1/account.
Quickstart
from openai import OpenAI
client = OpenAI(api_key="sk-spicy-...", base_url="https://api.spicyapi.com/v1")
# Images: the OpenAI SDK's images.generate maps onto POST /v1/images/generations
img = client.images.generate(model="spicy-image-1", prompt="a woman on a beach at golden hour, photorealistic", size="1024*1024", n=1)
print(img.data[0].url) # durable CDN URL, reusable as image_url for edits and video
# Chat: fully compatible, streaming included
stream = client.chat.completions.create(model="spicy-chat-1", messages=[{"role": "user", "content": "hey"}], stream=True)
curl https://api.spicyapi.com/v1/videos/generations \
-H "Authorization: Bearer $SPICYAPI_KEY" -H "Content-Type: application/json" \
-d '{"model": "spicy-motion-2", "prompt": "slow build, steady rhythm", "image_url": "<a URL from /v1/images/generations>", "resolution": "720P", "duration": 5}'
# 202 {"id": "sj_...", "status": "queued", "cost_usd": 0.875} then poll every 10 to 15 seconds:
curl https://api.spicyapi.com/v1/videos/tasks/sj_... -H "Authorization: Bearer $SPICYAPI_KEY"
Models
| Model | Kind | Price | Limits |
|---|---|---|---|
spicy-pov-missionary-1 | video | $0.175 per second at 720P, $0.29 per second at 1080P | resolutions 720P, 1080P; 2 to 15 seconds; needs image_url (one of your generated images) |
spicy-pov-doggystyle-1 | video | $0.175 per second at 720P, $0.29 per second at 1080P | resolutions 720P, 1080P; 2 to 15 seconds; needs image_url (one of your generated images) |
spicy-pov-blowjob-1 | video | $0.175 per second at 720P, $0.29 per second at 1080P | resolutions 720P, 1080P; 2 to 15 seconds; needs image_url (one of your generated images) |
spicy-image-1 | image | $0.06 per image | sizes 10241024, 8321216, 1216*832; up to 4 outputs per call |
spicy-image-1-pro | image | $0.09 per image | sizes 10241024, 8321216, 1216*832; up to 2 outputs per call |
spicy-image-edit-1 | image-edit | $0.15 per image | sizes 10241024, 8321216, 1216*832; up to 1 output per call; needs image_url (one of your generated images) |
spicy-motion-1 | video | $0.175 per second at 720P, $0.29 per second at 1080P | resolutions 720P, 1080P; 2 to 10 seconds; needs image_url (one of your generated images) |
spicy-motion-2 | video | $0.175 per second at 720P, $0.29 per second at 1080P | resolutions 720P, 1080P; 2 to 15 seconds; needs image_url (one of your generated images) |
spicy-video-1 | video | $0.175 per second at 720P, $0.29 per second at 1080P | resolutions 720P, 1080P; 2 to 15 seconds |
spicy-motion-3 | video | $0.1 per second at 480P, $0.2 per second at 720P, $0.4 per second at 1080P | resolutions 480P, 720P, 1080P; 2 to 30 seconds; image_url optional (text-to-video without it) |
spicy-motion-3-fast | video | $0.14 per second at 480P, $0.28 per second at 720P, $0.56 per second at 1080P | resolutions 480P, 720P, 1080P; 2 to 30 seconds; image_url optional (text-to-video without it) |
spicy-chat-1 | chat | $0.575 per 1M tokens (minimum $0.0005 per request) |
Endpoints
Core
GET /v1/models: List every model available to your account. Reference: https://www.spicyapi.com/docs/api/list-models.mdGET /v1/account: Read your balance and account status. Reference: https://www.spicyapi.com/docs/api/get-account.md
Images
POST /v1/images/generations: Generate one or more images from a text prompt. Reference: https://www.spicyapi.com/docs/api/create-image.mdPOST /v1/images/edits: Edit an image you generated earlier, guided by a prompt. Reference: https://www.spicyapi.com/docs/api/edit-image.mdGET /v1/images: List the images your account has generated. Reference: https://www.spicyapi.com/docs/api/list-images.md
Video
POST /v1/videos/generations: Start a video generation. Returns a task to poll. Reference: https://www.spicyapi.com/docs/api/create-video.mdGET /v1/videos/tasks/{id}: Check a video task and collect the finished clip. Reference: https://www.spicyapi.com/docs/api/get-video-task.md
Chat
POST /v1/chat/completions: OpenAI-compatible uncensored chat, with streaming. Reference: https://www.spicyapi.com/docs/api/chat-completions.md
Input images: no uploads, by design
Image editing and image-to-video accept only URLs returned by /v1/images/generations or /v1/images/edits on the same account (GET /v1/images lists them). Uploads and third-party URLs are rejected before any charge. This keeps real-person and minor imagery out of the pipeline and is a legal-compliance requirement, not a limitation we plan to lift.
Video is asynchronous
POST /v1/videos/generations returns 202 with a task id and the price already debited. Poll GET /v1/videos/tasks/{id} every 10 to 15 seconds until status is succeeded (then output.video_url) or failed (refunded). Or set a webhook URL in the dashboard: we POST {"event": "task.succeeded" | "task.failed", "data": {...}} with an X-SpicyAPI-Signature header (hex HMAC-SHA256 of the raw body with your signing secret).
POV fine-tunes
spicy-pov-missionary-1, spicy-pov-doggystyle-1 and spicy-pov-blowjob-1 are our own image-to-video fine-tunes. Give them a first frame already in position; the activation token is injected for you. Same price as spicy-motion-2.
Errors and limits
401 bad key, 402 insufficient balance (top up at https://www.spicyapi.com/dashboard/account), 400 invalid parameters, 422 prompt blocked by moderation (never charged), 429 model at capacity (retry in a few seconds), 502 upstream unavailable (refunded). Shape: {"error": {"message": "...", "type": "insufficient_balance"}}. Acceptable use: https://www.spicyapi.com/acceptable-use.
Sandbox
Create a key with Sandbox ticked: every endpoint returns fixture output flagged sandbox: true after the same validation and keyword screening, nothing is billed, video tasks report processing for a few seconds then succeeded with an example clip.
For AI agents
Machine-readable overview: https://www.spicyapi.com/llms.txt. OpenAPI: https://www.spicyapi.com/openapi.json. MCP endpoint: https://www.spicyapi.com/api/mcp (Claude Code: claude mcp add --transport http spicyapi https://www.spicyapi.com/api/mcp --header "Authorization: Bearer sk-spicy-..."). Skills: https://www.spicyapi.com/skills/index.json. A sandbox key answers everything from fixtures with nothing billed.
Full reference as one file: https://www.spicyapi.com/llms-full.txt.