# 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, https://www.spicyapi.com/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

| 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](https://www.spicyapi.com/docs/api/create-video) |
| `spicy-motion-3` | Best quality, native dialogue and sound, up to 30 seconds, takes a `character` and the ready-made sex `action`s. 480P for cheap previews. | $0.1 per second at 480P, $0.2 per second at 720P, $0.4 per second at 1080P | [Create Video](https://www.spicyapi.com/docs/api/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](https://www.spicyapi.com/docs/api/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](https://www.spicyapi.com/docs/api/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](https://www.spicyapi.com/docs/api/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](https://www.spicyapi.com/docs/api/create-video-edit) |
| `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](https://www.spicyapi.com/docs/api/create-speech) |

## Architecture

- **One character per persona.** [Create Character](https://www.spicyapi.com/docs/api/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](https://www.spicyapi.com/docs/api/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](https://www.spicyapi.com/docs/api/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](https://www.spicyapi.com/examples#evidence).

## 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 `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: https://www.spicyapi.com/acceptable-use. How screening, strikes and flags work: https://www.spicyapi.com/moderation.

## Getting started

1. Sign in at https://www.spicyapi.com/auth and accept the terms; the Default key is at https://www.spicyapi.com/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):

```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: https://www.spicyapi.com/docs/guides. Everything in one file: https://www.spicyapi.com/llms-full.txt. Questions: contact@spicyapi.com.
