Uncensored image and video API guide

OpenAI’s image API for the image models and one generations endpoint for video: the request, the settings that set the price, polling from Python, what an image and a clip cost at the live price, and the refund rule.

Steps checked October 26, 2026 · prices as of October 27, 2026

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 request
prompt 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 generation
status, 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
1curl https://api.uncensoredllm.ai/v1/images/generations \
2 -H "Authorization: Bearer sk-ullm-live-…" \
3 -H "Content-Type: application/json" \
4 -d '{"model": "anime-image-uncensored", "prompt": "a lighthouse keeper on a storm-bound island, oil painting", "response_format": "url"}'
python
1from openai import OpenAI
2
3client = OpenAI(base_url="https://api.uncensoredllm.ai/v1", api_key="sk-ullm-live-…")
4result = client.images.generate(
5 model="anime-image-uncensored",
6 prompt="a lighthouse keeper on a storm-bound island, oil painting",
7 response_format="url",
8)
9print(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
1curl https://api.uncensoredllm.ai/v1/generations \
2 -H "Authorization: Bearer sk-ullm-live-…" \
3 -H "Content-Type: application/json" \
4 -d '{"model": "wan-3.0-video-uncensored", "input": {"prompt": "waves breaking on granite at dusk, slow camera push", "duration": 5}}'
curl
1curl https://api.uncensoredllm.ai/v1/generations/gen_<id> \
2 -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
1curl https://api.uncensoredllm.ai/v1/generations \
2 -H "Authorization: Bearer sk-ullm-live-…" \
3 -H "Content-Type: application/json" \
4 -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.

poll.py
1import time, requests
2
3H = {"Authorization": "Bearer sk-ullm-live-…"}
4gen = requests.post("https://api.uncensoredllm.ai/v1/generations", headers=H, json={
5 "model": "wan-3.0-video-uncensored",
6 "input": {"prompt": "waves breaking on granite at dusk, slow camera push"},
7}).json()
8
9while gen["status"] not in ("succeeded", "failed"):
10 time.sleep(5)
11 gen = requests.get(f"https://api.uncensoredllm.ai/v1/generations/{gen['id']}", headers=H).json()
12
13print(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.

ModelUnitFromLowest tier
Anime Image Uncensoredper image$0.03resolution 1K
Chroma Uncensoredper image$0.08any settings
CyberRealistic XL Uncensoredper image$0.0136size 512x512
Lustify SDXL Uncensoredper image$0.0313any settings
Qwen Edit Uncensoredper image$0.08any settings
Qwen Image 2.1 Uncensoredper image$0.0375resolution 1K
Qwen Image 3 Uncensoredper image$0.08any settings
Seedream 5.0 Lite Edit Uncensoredper image$0.0313any settings
Vision Image Uncensoredper image$0.04any settings
Vision Pro Image Uncensoredper image$0.0938resolution 1K
WAI Illustrious SDXL Uncensoredper image$0.0136size 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.

ModelUnitFromLowest tier
LTX-2.3 Image-to-Video Uncensoredper second$0.08resolution 480p
Wan 3.0 Image-to-Video Uncensoredper second$0.20resolution 480p
Wan 3.0 Video Uncensoredper second$0.20resolution 480p

Settings that set the price

  • size, aspect_ratio and resolution pick the tier on most models; the model page’s price table names which values move it.
  • n makes several images or clips in one request; each one is billed at the unit price.
  • duration on video is the number of seconds billed.
  • enable_safety_checker defaults to off on 8 of the 14 listed models; sending true turns 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/files path 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.

Get a keyPrepaid from $10, no subscription.

New models and price changes, once a month.

New uncensored builds with their prices, price moves, and what the daily model check found.