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-1needs a first frame; preview withspicy-motion-3at 480P instead (half its 720P price), or draft from an image generated with the character.
Which models to use
| Model | Use it for | Price | Reference |
|---|---|---|---|
spicy-character-video-1 | Reference-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 1080P | Create Video |
spicy-motion-3 | Best 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 1080P | Create Video |
spicy-motion-3-fast | The same inputs with faster turnaround. | $0.14 per second at 480P, $0.28 per second at 720P, $0.56 per second at 1080P | Create Video |
spicy-cinema-1-character | Group 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 1080P | Create Video |
spicy-image-1-pro | Stills of the character (billed at the edit price with character), and first frames for the image-to-video models. | $0.09 per image | Create Image |
spicy-video-edit-1 | Change the outfit, lighting or props in a finished clip from reference images. | $0.2 per second at 720P, $0.3 per second at 1080P | Edit Video |
spicy-voice-2 | Lines for a character to speak: pass the clip as audio_url (reference audio on Motion 3). | $0.40 per 10,000 characters of input text | Create 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 ascharacteron 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) andconsent: 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/generationsreturns a task with the price debited; set a webhook in the dashboard (signedtask.succeededandtask.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_suspendedand your account is only flagged for review. Withoutuser, 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
characteris billed at the edit price ($0.09 per image). Lists (/v1/characters,/v1/images,/v1/audio,/v1/voices) page withafterandhas_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
| Item | Model | Per month | Each | Cost |
|---|---|---|---|---|
Stills with a character (edit price) | spicy-image-edit-1 | 20 | $0.09 | $1.80 |
| Five-second character clips at 720P | spicy-character-video-1 | 10 | $1.00 | $10.00 |
| Five-second previews at 480P | spicy-motion-3 | 4 | $0.50 | $2.00 |
| Eight-second action clips at 720P (8 + 4 seconds billed) | spicy-motion-3 | 4 | $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
nup to 6 is one request; withuser, 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_reacheduntil 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/moderationschecks 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 403end_user_suspended, and your account is flagged when one of your users is suspended or your users collect 10 strikes in one UTC day. Withoutuser, 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/moderationsnever records a strike. Dry runs (dry_run: true) and sandbox keys run the real screen, so their refusals count like any other; send a testuserid 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
- Sign in at /auth and accept the terms; the Default key is at /dashboard/api-keys.
- 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.
- 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.