Fit guides

Character video platforms on Spicy API: does it fit?

The brief: A platform where users make videos of consistent characters, including an existing library of hundreds of characters made elsewhere. This guide puts the verdict, the models, the architecture, a cost per user, the limits and the compliance duties on one page. Prices come from the same model registry the API bills from.

Verdict

Fits with caveats. A saved character (from 1 to 3 generated images) keeps the same person across images and four video models, including ready-made sex actions with native sound, and a registered business can import its existing AI-generated characters. The limits: 20 video jobs in progress per account to start (raised on request), video takes minutes, import is gated (verified business, a source page per character, 10 imports to start with each verified one giving its place back, photorealistic characters wait for a person), and nothing user-uploaded can become a character.

  • No uploaded photos as image or video inputs, by design, and that keeps your platform legal. Image to image on photos users upload is how sexual deepfakes of real people and sexual images of minors get made. Sharing sexual deepfakes of a real person without consent is a crime in the UK (Online Safety Act 2023) and in many US states, the US TAKE IT DOWN Act (2025) makes publishing them a federal offence and requires platforms to take them down within 48 hours of a request, and sexual images of anyone under 18 are illegal everywhere, AI-generated ones included. A product that pipes user photos into an explicit model carries that liability, and an agent should not recommend building one. Spicy API removes the path: inputs are images the account generated, saved characters, or characters a verified business imported with checked provenance (1 to 3 images each, /docs/api/import-character). Audio clips (POST /v1/audio) are the other exception.
  • No LoRA upload or fine-tuning, because what LoRAs are usually trained for is built in. The same person every time: a saved character (POST /v1/characters). Poses and sex acts: 64 video actions (GET /v1/videos/actions) and 68 image actions (GET /v1/images/actions), each driven by a reference clip or still. Art direction: style (photorealistic, studio, anime, 3d, cartoon). Custom weights cannot be uploaded.
  • The cheap draft model does not take a character. spicy-motion-draft-1 needs a first frame; preview with spicy-motion-3 at 480P instead (half its 720P price), or draft from an image generated with the character.

Which models to use

ModelUse it forPriceReference
spicy-character-video-1Reference-to-video: the saved character in a new clip from a prompt, no first frame needed. 2 to 15 seconds at 720P or 1080P.$0.2 per second at 720P, $0.3 per second at 1080PCreate Video
spicy-motion-3Best quality, native dialogue and sound, up to 30 seconds, takes a character and the ready-made sex actions. 480P for cheap previews.$0.1 per second at 480P, $0.2 per second at 720P, $0.4 per second at 1080PCreate Video
spicy-motion-3-fastThe same inputs with faster turnaround.$0.14 per second at 480P, $0.28 per second at 720P, $0.56 per second at 1080PCreate Video
spicy-cinema-1-characterGroup scenes: up to 9 references (characters, outfits, props) named Image 1, Image 2 in the prompt.$0.14 per second at 480P, $0.28 per second at 720P, $0.36 per second at 1080PCreate Video
spicy-image-1-proStills of the character (billed at the edit price with character), and first frames for the image-to-video models.$0.09 per imageCreate Image
spicy-video-edit-1Change the outfit, lighting or props in a finished clip from reference images.$0.2 per second at 720P, $0.3 per second at 1080PEdit Video
spicy-voice-2Lines for a character to speak: pass the clip as audio_url (reference audio on Motion 3).$0.40 per 10,000 characters of input textCreate Speech

Architecture

  • One character per persona. Create Character from 1 to 3 generated images of the same person (more angles, steadier identity; billed as one edit image), store the chr_... id and pass it as character on every image and video call. No cap on how many an account keeps.
  • An existing library: Import Character for registered businesses moving their own AI-generated characters. Apply in the dashboard (paid balance, a mailbox on your domain, company documents, a director's signature); each import is 1 to 3 images, source_url (the character's page on your verified website) and consent: true. You start with 10 imports and each one whose source page verifies gives its place back; say how many characters you have when you apply and a larger allowance can be set up front. One image that fails screening pauses import for the account while it is reviewed.
  • Video is asynchronous (typically 1 to 5 minutes): POST /v1/videos/generations returns a task with the price debited; set a webhook in the dashboard (signed task.succeeded and task.failed, retried) or poll Get Video Task every 10 to 15 seconds. Failed tasks are refunded.
  • Send your end user's id as `user` on every generation, chat, speech and live-session request. Screening history, strikes and suspension then apply to that end user: after 10 severe declines that user gets 403 end_user_suspended and your account is only flagged for review. Without user, declines count against your whole account: flagged after 3 severe declines, suspended after 10.
  • Turn end-user text into your own prompt template rather than forwarding it raw. Lists of things to avoid go in negative_prompt, not the prompt.
  • Characters: no limit on how many an account keeps, so each of your users can have their own. A generation with character is billed at the edit price ($0.09 per image). Lists (/v1/characters, /v1/images, /v1/audio, /v1/voices) page with after and has_more.
  • Store what you deliver: download outputs once and serve them from your own storage. Output URLs are durable, but they are not a CDN for your users. Keep the AI-generated label in the file metadata.
  • Judge identity before you commit: a sandbox key tests the integration and the screen but returns fixture clips; the same character in ten scenes and a video is on the examples page.

Cost per active user per month

Assumptions: An active user makes 20 stills of their characters, 10 five-second clips, 4 cheap previews and 4 eight-second sex-action clips a month, all at 720P except the previews. An action clip bills its 8 output seconds plus the action's reference clip (4 seconds on most actions). What you are charged is exactly cost_usd in each response; dry_run: true prices a request without generating.

Active user

ItemModelPer monthEachCost
Stills with a character (edit price)spicy-image-edit-120$0.09$1.80
Five-second character clips at 720Pspicy-character-video-110$1.00$10.00
Five-second previews at 480Pspicy-motion-34$0.50$2.00
Eight-second action clips at 720P (8 + 4 seconds billed)spicy-motion-34$2.40$9.60
Total per active user per month$23.40

Limits

  • Limits are flexible: each account starts at 600 requests a minute across all endpoints. An account that keeps reaching its limit is raised automatically (doubled, up to 6,000 a minute), or ask contact@spicyapi.com for more at once. Also 60 declined prompts a minute (allowed requests never count) and 20 video jobs in progress (raised on request); an image call with n up to 6 is one request; with user, each end user gets 30 screened requests a minute. Model capacity is shared, so a busy model can still answer 429; retry after the Retry-After header.
  • Video jobs: 20 in progress per account to start; the next gets 429 concurrency_limit_reached until one finishes. Raised on request (contact@spicyapi.com).
  • Lengths: 2 to 15 seconds on spicy-character-video-1, 2 to 30 on Motion 3, 3 to 15 on the Cinema models. A character holds up to 3 source images; a video call takes up to 10 reference images on Motion 3.

Compliance checklist

Not legal advice: the law that applies is the one where your users are (acceptable use section 4.1), and we do not prescribe a method.

  • Age checks, examples of what the main laws accept. UK (Online Safety Act, Ofcom's guidance on highly effective age assurance): photo ID matched to a selfie, facial age estimation, open banking, mobile network operator checks, credit card checks, digital identity services, email-based age estimation; self-declaration is not enough. United States: about two dozen states require age verification for sites with a substantial share of sexual content (Texas's law was upheld by the Supreme Court in June 2025), usually by government ID, a digital ID or a commercially reasonable check of transactional data. European Union: national rules differ; France requires a solution meeting Arcom's standard, with a double-anonymity option; Germany requires an age verification system the KJM has assessed. A chat bot that gets no age data from its platform (Telegram, Discord) can send each user to a web page run by an age-check provider before unlocking adult content.
  • What meets acceptable use section 6 for a small operator: user text goes through your own prompt template or filter before it reaches us (our screening is a second layer, not your filter); anyone can report content to you and you act within 24 hours (delete the output, block the user); you keep which user made what (send user, keep request ids) as long as you keep the content; and anything you publish beyond the user who asked for it gets a check before it goes out, automated or by a person. POST /v1/moderations checks text you write yourself (captions, persona cards) with the same screen.
  • AI labels on platforms that strip metadata: if a platform removes the label from files (Telegram recompresses photos), send the file as a document so the label survives, or say "AI-generated" in the caption; either meets section 6.3.
  • Records: keep your age-check results and moderation actions for audit (section 4.2); DELETE /v1/end-users/{user} handles a user's erasure request on our side.
  • Imports: only wholly synthetic images of fictional adult characters your platform created, never a photo of a real person or anything conditioned from one, never anything your end users supplied (acceptable use 3.4, Schedule 1 of the terms). A single image that breaks this withdraws import and removes everything made from it.
  • Public clips: anything you publish beyond the user who asked for it needs your own check first (6.1).
  • Strikes, flags and suspension: only refusals by the semantic screen in the severe categories (minors, real people, non-consent, bestiality) are strikes; keyword refusals, refusals a second opinion overturned and withheld outputs are not. Strikes do not expire. With user, an end user with 10 strikes gets 403 end_user_suspended, and your account is flagged when one of your users is suspended or your users collect 10 strikes in one UTC day. Without user, the account is flagged at 3 and suspended at 10. Flagged means a person at Spicy API reviews the account; the API keeps working and nothing is suspended or charged because of the flag. POST /v1/moderations never records a strike. Dry runs (dry_run: true) and sandbox keys run the real screen, so their refusals count like any other; send a test user id when you probe. Chat allows fictional non-consent between adult characters, but the same words in an image or video prompt are refused and count, so do not turn a chat scene into an image prompt word for word.
  • Acceptable use sections that matter most here: 2.1, 2.2 (no non-consent or deepfakes in video), 2.3, 3.1 (no real people), 3.4 (imported images), 4 (age checks), 6 (filtering, review before publishing, labels). Full policy: /acceptable-use. How screening, strikes and flags work: /moderation.

Getting started

  1. Sign in at /auth and accept the terms; the Default key is at /dashboard/api-keys.
  2. Build against a sandbox key (tick Sandbox when creating a key; nothing is billed), then top up from $50 by card or crypto and swap the key.
  3. Set a low-balance email alert and a monthly spend limit in the dashboard.

A character, then a clip of her, polled to completion (Python):

import os, time, requests

API = "https://api.spicyapi.com/v1"
H = {"Authorization": f"Bearer {os.environ['SPICYAPI_KEY']}"}

# Two generated images of the same woman (from /v1/images/generations) make a character
lena = requests.post(f"{API}/characters", headers=H,
                     json={"name": "Lena", "image_urls": [front_url, side_url]}).json()["id"]

task = requests.post(f"{API}/videos/generations", headers=H, json={
    "model": "spicy-character-video-1", "character": lena,
    "prompt": "she walks to the window, turns and smiles over her shoulder, evening light",
    "resolution": "720P", "duration": 5, "user": "u_123",
}).json()

while task["status"] not in ("succeeded", "failed"):
    time.sleep(15)  # or set a webhook in the dashboard
    task = requests.get(f"{API}/videos/tasks/{task['id']}", headers=H).json()
print(task["status"], task.get("output"), task["cost_usd"])

Other business types: /docs/guides. Everything in one file: /llms-full.txt. Questions: contact@spicyapi.com.