The 14 image and video models on this catalog answer two routes: OpenAI’s image API for the image models, and one generations endpoint with polling for video and anything that takes longer. This page has both calls, the settings that set the price, a Python poll loop and the refund rule, with every price read from the live catalog.
Two routes
- POST /v1/images/generations
- OpenAI’s image requestprompt at the top level, other settings inside input; waits up to 100 seconds and answers in OpenAI’s shape
- POST /v1/generations
- { model, input }every setting in input; answers 202 with a generation to poll
- GET /v1/generations/{id}
- the generationstatus, files with URL, type and size, and the charge with its units
The image route exists so the OpenAI SDK’s image call works unchanged. Video, image-to-video and any job that may take longer than the image route waits go through the generations route. Both take the same key from the console.
Images: OpenAI’s image API
The smallest request on Anime Image Uncensored. response_format is url or b64_json; a job still running after 100 seconds answers 504 generation_pending with the generation id to fetch.
curl https://api.uncensoredllm.ai/v1/images/generations \ -H "Authorization: Bearer sk-ullm-live-…" \ -H "Content-Type: application/json" \ -d '{"model": "anime-image-uncensored", "prompt": "a lighthouse keeper on a storm-bound island, oil painting", "response_format": "url"}'from openai import OpenAI client = OpenAI(base_url="https://api.uncensoredllm.ai/v1", api_key="sk-ullm-live-…")result = client.images.generate( model="anime-image-uncensored", prompt="a lighthouse keeper on a storm-bound island, oil painting", response_format="url",)print(result.data[0].url)Settings OpenAI’s shape has no field for (the safety checker, the sampler, a seed) go inside input. Each model page lists its settings with their defaults.
Video: generations and polling
Submit on Wan 3.0 Video Uncensored, then poll until the status reads succeeded or failed. A clip is billed per second; duration runs from 2 to 30 seconds.
curl https://api.uncensoredllm.ai/v1/generations \ -H "Authorization: Bearer sk-ullm-live-…" \ -H "Content-Type: application/json" \ -d '{"model": "wan-3.0-video-uncensored", "input": {"prompt": "waves breaking on granite at dusk, slow camera push", "duration": 5}}'curl https://api.uncensoredllm.ai/v1/generations/gen_<id> \ -H "Authorization: Bearer sk-ullm-live-…"Image-to-video on LTX-2.3 Image-to-Video Uncensored takes the starting frame as a public URL in image_urls:
curl https://api.uncensoredllm.ai/v1/generations \ -H "Authorization: Bearer sk-ullm-live-…" \ -H "Content-Type: application/json" \ -d '{"model": "ltx-2.3-i2v-uncensored", "input": {"prompt": "the figure turns and walks out of frame", "image_urls": ["https://example.com/frame.png"]}}'Polling from Python
Five seconds between polls is plenty; a generation that fails reads failed with the reason and its charge refunded.
import time, requests H = {"Authorization": "Bearer sk-ullm-live-…"}gen = requests.post("https://api.uncensoredllm.ai/v1/generations", headers=H, json={ "model": "wan-3.0-video-uncensored", "input": {"prompt": "waves breaking on granite at dusk, slow camera push"},}).json() while gen["status"] not in ("succeeded", "failed"): time.sleep(5) gen = requests.get(f"https://api.uncensoredllm.ai/v1/generations/{gen['id']}", headers=H).json() print(gen["status"], gen.get("charge"), [f["url"] for f in gen.get("files", [])])What an image costs
Each image model’s starting price and the settings that tier applies to, read from the media catalog at render. The model page lists every tier.
| Model | Unit | From | Lowest tier |
|---|---|---|---|
| Anime Image Uncensored | per image | $0.03 | resolution 1K |
| Chroma Uncensored | per image | $0.08 | any settings |
| CyberRealistic XL Uncensored | per image | $0.0136 | size 512x512 |
| Lustify SDXL Uncensored | per image | $0.0313 | any settings |
| Qwen Edit Uncensored | per image | $0.08 | any settings |
| Qwen Image 2.1 Uncensored | per image | $0.0375 | resolution 1K |
| Qwen Image 3 Uncensored | per image | $0.08 | any settings |
| Seedream 5.0 Lite Edit Uncensored | per image | $0.0313 | any settings |
| Vision Image Uncensored | per image | $0.04 | any settings |
| Vision Pro Image Uncensored | per image | $0.0938 | resolution 1K |
| WAI Illustrious SDXL Uncensored | per image | $0.0136 | size 512x512 |
What a video costs
Video bills per second of output at the tier the resolution and settings land in; a 5-second clip costs five times the per-second price of its tier.
| Model | Unit | From | Lowest tier |
|---|---|---|---|
| LTX-2.3 Image-to-Video Uncensored | per second | $0.08 | resolution 480p |
| Wan 3.0 Image-to-Video Uncensored | per second | $0.20 | resolution 480p |
| Wan 3.0 Video Uncensored | per second | $0.20 | resolution 480p |
Settings that set the price
size,aspect_ratioandresolutionpick the tier on most models; the model page’s price table names which values move it.nmakes several images or clips in one request; each one is billed at the unit price.durationon video is the number of seconds billed.enable_safety_checkerdefaults to off on 8 of the 14 listed models; sendingtrueturns it on for a request.
Billing and refunds
- A generation that fails is given back in full: its charge reads refunded and the balance gets the amount back.
- Files stay under the API’s
/v1/filespath for 30 days; download what you want to keep. - Any prompt that puts a minor in the picture is refused before it is priced or sent, with HTTP 400
content_not_allowed. An edit that undresses or sexualizes a picture runs only on an image this API generated, never on an uploaded photo. The acceptable use policy has the full list. - A non-streamed answer carries its charge in the generation; the console’s usage page lists every request with its units.
Questions
Yes, with base_url set to https://api.uncensoredllm.ai/v1: client.images.generate with a model id from the media page. Settings OpenAI has no field for go in input.
POST /v1/generations with the model and an input object, then GET the generation until it reads succeeded. The guide above has the call and a Python poll loop.
It is given back in full. The generation reads failed, its charge shows refunded, and the balance gets the amount back.
Thirty days. Each result is a link under the API’s /v1/files path; download what you want to keep.
Every listed image and video model with its starting price is on the media page, 14 models at render; each model page lists its tiers. See the media page.