Skip to content

For developers

An NSFW image API that renders the prompt your code sent

An NSFW image API, an uncensored image generation API, accepts adult prompts from your own software and returns the render without rewriting the wording first, which matters because a rewritten prompt fails silently: the call succeeds, the response looks normal, and the picture is not the one you asked for. Vellria exposes its whole catalog behind one REST shape with Bearer keys, asynchronous jobs you poll, and prepaid credits that refund automatically when a run fails.

23 image models, from 2 credits per image (100 credits = $1.00). New accounts created with Google get 20 credits as a gift, valid for 7 days. Is there a free option?

Why integrations break on the moderation layer

Most image APIs sit behind a rewriting step you cannot see. Your text is edited into something the provider considers safer, the edited version renders, and the response carries no field telling you the substitution happened. From inside your application everything reports success, which is the worst possible failure mode: nothing to catch, nothing to retry, and a queue of outputs that quietly do not match their inputs.

The second failure is the refusal that arrives as an error at an unpredictable rate. A prompt that worked yesterday returns a policy error today, because the moderation model changed underneath you rather than because your request did. Retrying does not help, the error is not deterministic, and code written against it accumulates special cases for a boundary nobody published.

Neither of those is a rate limit or an outage, so neither shows up in the places you would normally look. They show up as a slow loss of confidence in your own pipeline, and the usual response is a defensive layer of prompt-mangling heuristics that makes the output worse for a problem that was never yours.

See what the models make

Real outputs from the models on this page, each shown with the exact prompt that produced it. Copy a prompt, or open the model and run it yourself.

  • Natural light portrait of a freckled woman in her thirties with auburn curls and green eyes, wearing an oversized knit sweater, sitting by a rainy cafe window, gentle smile, soft bokeh, photorealistic

    Qwen 3 Pro UncensoredText to image

    Natural light portrait of a freckled woman in her thirties with auburn curls and green eyes, wearing an oversized knit sweater, sitting by a rainy cafe window, gentle smile, soft bokeh, photorealistic

    Try this prompt
  • Flat vector illustration of a woman in her thirties doing yoga on a rooftop garden at sunrise, limited warm palette, clean geometric shapes, editorial magazine style, no text

    Bria FIBO 1.5 UncensoredText to image

    Flat vector illustration of a woman in her thirties doing yoga on a rooftop garden at sunrise, limited warm palette, clean geometric shapes, editorial magazine style, no text

    Try this prompt
  • Cinematic interior of a 1960s jazz club, a sultry singer in her thirties in a sequined emerald gown at a vintage microphone, smoky haze, a single spotlight, band silhouettes behind her, warm tungsten film look

    Qwen 3 Pro UncensoredText to image

    Cinematic interior of a 1960s jazz club, a sultry singer in her thirties in a sequined emerald gown at a vintage microphone, smoky haze, a single spotlight, band silhouettes behind her, warm tungsten film look

    Try this prompt
  • Evening-wear fashion shot of a Black woman in her thirties in a backless gold sequin gown, looking over her shoulder on a grand marble staircase, warm chandelier light

    Bria FIBO 1.5 UncensoredText to image

    Evening-wear fashion shot of a Black woman in her thirties in a backless gold sequin gown, looking over her shoulder on a grand marble staircase, warm chandelier light

    Try this prompt
  • Mechanical wristwatch with a deep blue dial floating above rippling water, splash frozen in motion, high-speed studio product photography, no text, no logo

    Seedream 5 Flash UncensoredText to image

    Mechanical wristwatch with a deep blue dial floating above rippling water, splash frozen in motion, high-speed studio product photography, no text, no logo

    Try this prompt
  • Skincare serum bottle in frosted amber glass with a dropper, placed on a wet river stone among green leaves, soft natural light, commercial product photography, no text, no logo

    Bria FIBO 1.5 UncensoredText to image

    Skincare serum bottle in frosted amber glass with a dropper, placed on a wet river stone among green leaves, soft natural light, commercial product photography, no text, no logo

    Try this prompt
  • Qwen 3 Pro Uncensored cover art

    Image

    Qwen 3 Pro Uncensored

    The Pro tier for the image you mean to keep; edit with up to 3 reference images.

    10 credits
  • Bria FIBO 1.5 Uncensored cover art

    Image

    Bria FIBO 1.5 Uncensored

    4MP images in seven shapes, one price for all; edit with up to 4 references at no extra cost.

    10 credits

The models for this, side by side

ModelSamplePriceMax sizeReference images
Seedream 5 Pro UncensoredSample output from Seedream 5 Pro Uncensored10 credits1536×1536Up to 10
Qwen 3 UncensoredSample output from Qwen 3 Uncensored8 credits2048×2048Up to 3
Qwen 3 Pro UncensoredSample output from Qwen 3 Pro Uncensored10 credits1440×1440Up to 3
Qwen Image Edit 2511 UncensoredSample output from Qwen Image Edit 2511 Uncensored6 credits1280×960Up to 3
Qwen Image 2.1 UncensoredSample output from Qwen Image 2.1 Uncensoredfrom 7 credits1184×896Up to 10
Seedream 5 Lite UncensoredSample output from Seedream 5 Lite Uncensored8 credits4704×2016Up to 10
Seedream 4.5 UncensoredSample output from Seedream 4.5 Uncensored9 credits2848×1600Up to 10
Seedream 4 UncensoredSample output from Seedream 4 Uncensored7 credits2816×1584Up to 10
Wan 2.7 UncensoredSample output from Wan 2.7 Uncensored8 credits2KUp to 9
Bria FIBO 2.0 UncensoredSample output from Bria FIBO 2.0 Uncensored10 credits2048×2048Up to 4
Bria FIBO 1.5 UncensoredSample output from Bria FIBO 1.5 Uncensored10 credits2048×2048Up to 4
MiniMax H3 Image UncensoredSample output from MiniMax H3 Image Uncensored8 credits1184×896Up to 9
Seedream 5 Flash UncensoredSample output from Seedream 5 Flash Uncensored8 credits2816×1584Up to 10
Z-Image Turbo UncensoredSample output from Z-Image Turbo Uncensored2 credits2048×2048None
Anima UncensoredSample output from Anima Uncensored5 credits1024×1024Up to 1
Vellria Anime Pro Spicy UncensoredSample output from Vellria Anime Pro Spicy Uncensored10 credits1536×1536Up to 10
Pruna P-Image UncensoredSample output from Pruna P-Image Uncensored4 credits1024×1024Up to 5
Flux 2 Klein 9B UncensoredSample output from Flux 2 Klein 9B Uncensored5 credits1024×1024Up to 3
Moss Image UncensoredSample output from Moss Image Uncensored5 credits1024×1024None
Jib Mix Qwen Image UncensoredSample output from Jib Mix Qwen Image Uncensored5 credits1024×1024None
Z-Image Spicy UncensoredSample output from Z-Image Spicy Uncensored4 credits1152×1536None
Z-Image Spicy Pro UncensoredSample output from Z-Image Spicy Pro Uncensored5 credits1680×2520None
Qwen Image Edit Spicy UncensoredSample output from Qwen Image Edit Spicy Uncensored10 credits1KUp to 3

Prices and limits come from the live model catalog.

The request shape

Keys are minted in the console and travel as a Bearer token. One endpoint opens a job: name the model, hand it the prompt, add whatever that model takes. What comes back is an identifier, not a picture — the socket closes immediately, because a thirty-second render held inside an HTTP request is a timeout waiting to happen and every integration that tried it learned the same lesson.

From there you ask about the job rather than wait on it. A plain GET against that identifier answers with where the work stands: still queued, mid-render, done, or failed. Your process can die and restart between those calls without losing anything, since the job belongs to the server and not to the connection that opened it.

One habit is worth forming early: ask the catalog endpoint what exists instead of writing model identifiers into a constants file. That endpoint is what the site itself renders from and what the ledger bills against, so it moves the instant anything changes. A hard-coded list does not move, and you find out weeks later through a rejected call naming a dimension that was retired. Each model's own page reads from that endpoint as well and shows the id to send with the sizes and costs it accepts: the Seedream API, Qwen image API and MiniMax H3 image API pages are three of them.

Reference images and rate limits

Every image model in the catalog reads both ways: a prompt alone generates from scratch, and adding one or more reference images switches that same model id to editing instead. There is no separate editing-only id to look up and no text-only id that declines an attachment by mistake.

References travel through their own endpoint first. Send the file, keep the address it hands back, and name that address when you open the job. Anyone holding the address can fetch it without a session, and that is deliberate: the machine doing the rendering lives outside your account and still has to read the bytes.

Throttling is counted per account, and the rejection tells you the number of seconds to hold off. That figure exists so your retry logic can read it, which is a different design goal from a log line a human squints at after the fact.

Billing that a failed job does not punish

The ledger moves at the start of a job rather than at its end, since that is the moment the work gets commissioned. What follows from that is the part automated callers should care about: a job that dies inside the provider hands its credits straight back when it lands in the failed state. Nothing to file, nobody to email.

Nothing about pay-as-you-go credits renews on their own — an optional monthly plan is the one exception, and you choose it. A service that fires twenty calls one week and none the next pays for twenty calls if it sticks to prepaid credits, because there is no floor underneath them. Every package buys credits at the same rate, and a package buys balance and nothing else — no key is faster, no key reaches models another key cannot.

Compared with general API marketplaces

If you are weighing the fal.ai API, the Replicate API or ModelsLab for adult image work, the comparison that matters is not a feature grid but what each one does by default, as its own documents put it on 12 September 2026. fal's published schema for its FLUX.1 [dev] endpoint sets enable_safety_checker to true; switching it off needs authorization on the account, a request without that authorization is always checked, and a flagged image comes back black. ModelsLab's text-to-image reference likewise defaults safety_checker to true and swaps a flagged picture for a blank one, while its terms of service, dated 24 June 2023, hold only a general clause against illegal or harmful use and nothing written about adult content as such.

The policy documents diverge further than the parameters do. Novita's Acceptable Use Policy, in force since 5 August 2026, lists sexually explicit output among prohibited uses and describes no opt-in for adult work. Replicate's terms, last updated 1 April 2026, rule out non-consensual nudity and illegal sexual material, and section 8.6 states outright that the services can generate graphic adult content, with responsibility for it resting on the customer. Read those clauses before writing integration code, since they decide what that platform permits. Venice AI's image API, with its own safety default, is read against ours in the Venice AI alternative.

Billing is shaped differently as well. ModelsLab sells monthly plans that vary by call volume and concurrency rather than by which models you may use; fal's model page advertises no subscription or minimum commitment and prices that image model per megapixel; Novita is pay as you go and charges per image on the image models we read. Vellria sits nearest the last two: a prepaid balance, a per-image credit price listed on each model's page, and nothing that renews unless you choose one of its two optional monthly plans.

What Vellria lacks, stated as plainly. There is no SDK, so an adult image API call here is plain HTTPS with a JSON body from whatever language you write. The image and video endpoints are not OpenAI-compatible, so an OpenAI client will not drive them by swapping the base URL; the one OpenAI-compatible endpoint is chat, for the Uncensored Chat model. There are no outbound webhooks; you learn how a job ended by polling. If one of those is a requirement, Vellria is the wrong fit for that part of your stack; and if the requirement is weights you run yourself, open-source NSFW models or a hosted API sets out what that route costs.

The boundary, stated once

Nothing rewrites the prompt, and the space that opens up is genuinely wide — fictional adult work included. Some things stay shut regardless of key, balance or endpoint: identifiable real people who never agreed to appear, and the categories the terms rule out even in fiction, such as bestiality, incest, non-consent and extreme gore. Cross that line and the account goes, keys with it.

The automatic checks do not look for ordinary real people. The prompt check refuses a prompt it recognizes as sexualising a minor and keeps no list of famous names, so a well-known person is not caught either. Reference images are not screened for content: no picture is refused for who or what it shows, and there is no image_blocked refusal on this path. So the rule on ordinary real people is one to enforce inside your own product; the API will not detect it for you. The page on what an NSFW AI image generator allows carries the policy in full, and the API reference has the request bodies, status codes and error shapes. For clips rather than stills, the NSFW video API takes the same keys and the same polling.

FAQ ( 6 )

Frequently asked questions

Does the API rewrite or moderate my prompt?

No. What your code sends is exactly what the model renders. What is left is an automatic check on the prompt for sexual content involving minors, never for tone or explicitness, and a request it catches comes back as an outright error before any credit moves instead of being silently substituted, so your application can handle it as an error rather than discovering it in the output.

Is it synchronous or do I need to poll?

You poll. Starting a generation returns a record id straight away, and you keep reading that record until the job has finished or failed. Nothing is lost if your process restarts or a connection drops, because the job lives on the server rather than inside the request that created it.

What happens to my credits when a generation fails?

The reversal is automatic. Charging happens as the job opens, and a provider-side failure hands that charge back the moment the job lands in its failed state. The credit comes back to your balance by itself, so nothing downstream has to reconcile a discrepancy by hand.

Can I send reference images from code?

Yes, via a separate upload step. The file goes up, you keep the address that comes back, and that address names the picture when you open a job. It needs no session to fetch, since the rendering machine sits outside your account.

Are there separate keys or plans for higher volume?

No tiers. Keys are issued from the console and every one of them reaches the whole catalog on the same terms; volume is a question of balance rather than of plan. Rate limits apply per account, and a throttled response carries the number of seconds to hold off.

Is there an SDK or an OpenAI-compatible endpoint?

No SDK, and the image endpoints are not OpenAI-compatible. Requests are ordinary HTTPS with a JSON body and a Bearer key, so any HTTP client works, but there is no official library to install, and an OpenAI client pointed at a different base URL will not drive image generation. The one OpenAI-compatible endpoint is chat, for Uncensored Chat. Image results arrive through polling, not a webhook. The step-by-step integration guide shows the whole loop in code.