
Vellria Lite Image
The cheapest image model in the catalog. Prompt only: it takes no reference image.
For developers
An NSFW image 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.
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.

The cheapest image model in the catalog. Prompt only: it takes no reference image.

The flagship image model, focused on detail and composition. 2K output only.

The flagship editing model. Takes up to ten references and preserves identity and lighting.

Strong on long, complex prompts; stays faithful to scene composition and text.

Edits using the images you provide as references, preserving character and scene.

The higher-priced Qwen tier. Prompt only, and every output shape costs the same.

The higher-priced Qwen editing tier. Images past the first add to what a run costs.

Fast, cheap Seedream. Reaches 4K and is good at typography and poster work.

Takes up to fourteen references and redraws the images you provide.

Prompt only, from a fixed list of output shapes that includes this family's widest.

Edits from up to four reference images, and none of them adds to what the run costs.
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.
Editing models need a picture to work on, and pictures 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 — deliberately, because the machine doing the rendering lives outside your account and still has to read the bytes — and the address stops working on the same clock that clears finished output.
The catalog does not blur the line between model kinds. Hand a reference model nothing to look at and it declines; hand a text-only model an attachment and it declines that too, instead of quietly proceeding as though the upload were decoration. The alternative would bill you for an image the render never opened and report success while doing it.
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.
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, and both entries stay in the history where your reconciliation can find them.
Nothing about the account renews. A service that fires twenty calls one week and none the next pays for twenty calls, because there is no plan underneath collecting a floor. Card and cryptocurrency top-ups come in different bundles, but a bundle buys balance and nothing else — no key is faster, no key reaches models another key cannot.
Output does not live forever, while its ledger entry does. Once a file ages past its window the bytes go and the record stays, so a cost lookup still answers long after the picture stopped existing. Asking for a file past that point returns an expired answer rather than a bare not-found, since code on the other end has to tell an eviction apart from a bad identifier.
Nothing rewrites the prompt, and the space that opens up is genuinely wide — fictional adult work included. Two things stay shut regardless of key, balance or endpoint: minors, in any depiction whatsoever, and identifiable real people who never agreed to appear. Cross either and the account goes, keys with it.
Two rules is few enough to enforce inside your own product rather than learn from a pattern of rejected calls. The rules page carries the policy in full, and the API documentation has the request bodies, status codes and error shapes.
No. The text your code sends is the text that renders. What remains is a narrow refusal over the prohibited categories rather than over tone or explicitness, and a request that hits one is refused outright instead of silently substituted, so your application can handle it as an error rather than discovering it in the output.
You poll. Starting a generation returns a record id straight away, and you read that record until it reaches a terminal state. 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.
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. Both movements appear in the history, so nothing downstream has to reconcile a discrepancy by hand.
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, and it ages out on the same clock as finished output.
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 the response tells you how long to wait when you cross one.
No subscription. Add credits and pay for what you use.