---
title: "Uncensored image and video API: generations and polling"
canonical: https://uncensoredllm.ai/guides/media
generated: 2026-10-27T04:25:53.110Z
source: https://uncensoredllm.ai/guides/media
base_url: https://api.uncensoredllm.ai/v1
---

# 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](https://app.uncensoredllm.ai/console).

## Images: OpenAI’s image API

The smallest request on [Anime Image Uncensored](https://uncensoredllm.ai/media/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.

```bash
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](https://uncensoredllm.ai/media/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.

```bash
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}}'
```

```bash
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](https://uncensoredllm.ai/media/ltx-2.3-i2v-uncensored) takes the starting frame as a public URL in `image_urls`:

```bash
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.

```python
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](https://uncensoredllm.ai/media/anime-image-uncensored) | per image | $0.03 | resolution 1K |
| [Chroma Uncensored](https://uncensoredllm.ai/media/chroma-uncensored) | per image | $0.08 | any settings |
| [CyberRealistic XL Uncensored](https://uncensoredllm.ai/media/cyberrealistic-xl-uncensored) | per image | $0.0136 | size 512x512 |
| [Lustify SDXL Uncensored](https://uncensoredllm.ai/media/lustify-sdxl-uncensored) | per image | $0.0313 | any settings |
| [Qwen Edit Uncensored](https://uncensoredllm.ai/media/qwen-edit-uncensored) | per image | $0.08 | any settings |
| [Qwen Image 2.1 Uncensored](https://uncensoredllm.ai/media/qwen-image-2.1-uncensored) | per image | $0.0375 | resolution 1K |
| [Qwen Image 3 Uncensored](https://uncensoredllm.ai/media/qwen-image-3-uncensored) | per image | $0.08 | any settings |
| [Seedream 5.0 Lite Edit Uncensored](https://uncensoredllm.ai/media/seedream-5.0-lite-edit-uncensored) | per image | $0.0313 | any settings |
| [Vision Image Uncensored](https://uncensoredllm.ai/media/vision-image-uncensored) | per image | $0.04 | any settings |
| [Vision Pro Image Uncensored](https://uncensoredllm.ai/media/vision-pro-image-uncensored) | per image | $0.0938 | resolution 1K |
| [WAI Illustrious SDXL Uncensored](https://uncensoredllm.ai/media/illustrious-xl-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](https://uncensoredllm.ai/media/ltx-2.3-i2v-uncensored) | per second | $0.08 | resolution 480p |
| [Wan 3.0 Image-to-Video Uncensored](https://uncensoredllm.ai/media/wan-3.0-i2v-uncensored) | per second | $0.20 | resolution 480p |
| [Wan 3.0 Video Uncensored](https://uncensoredllm.ai/media/wan-3.0-video-uncensored) | per second | $0.20 | resolution 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](https://uncensoredllm.ai/acceptable-use) 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

### Does the OpenAI SDK’s image call work?

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.

### How do I generate video?

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.

### What happens if a generation fails?

It is given back in full. The generation reads failed, its charge shows refunded, and the balance gets the amount back.

### How long are the files kept?

Thirty days. Each result is a link under the API’s /v1/files path; download what you want to keep.

### Where are all the media prices?

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 key](https://app.uncensoredllm.ai/console) Prepaid 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.
