Video from code
NSFW video API
An NSFW video API, also called an uncensored video generation API, takes an adult scene from your own software and renders it as a clip without editing the prompt first. On Vellria that is a single POST to /v1/generate/video with a model id, the prompt, a duration and a resolution, signed with a Bearer vll_... key; it answers with a job id at once, you poll GET /v1/generations/{id} until the clip is ready, and each second of footage is paid for from prepaid credits.
What one request carries
Every clip is opened by one JSON body. The model field takes an id from the table below, prompt holds the scene, duration is a whole number of seconds and resolution is one of the labels that model lists. Models that offer aspect ratios also read ratio, and image-to-video models want their opening frame as an https address inside image_urls. Anything outside the catalog's range for that model, such as a duration that is too long or a resolution it does not render, is answered with a 400 naming the offending field, and that happens before a single credit is taken.
The reply is immediate: status 202, a generation id, a status of processing and the credit cost of the take. The render goes on without your connection. Ask GET /v1/generations/{id} for the record, leave a growing, slightly random gap between asks, and stop once the status reads completed or failed; a completed record carries output_url, the address of the finished file. There is no callback to register. The service follows each job with the provider itself and settles it whether your code is polling or not, so a crashed worker or a dropped socket costs you nothing but the wait.
Authentication is one header, Authorization: Bearer vll_..., sent on every call including the polling ones. Keys are created on the API Keys page of the console and shown in full only once; a missing or revoked key gets 401 with the code authentication_required.
Video model ids and prices
| Model | Model id | Type | Price |
|---|---|---|---|
| Seedance 2.5 Video | vellria-seedance-2-5-video | Text to video | from 28 credits / s |
| Seedance 2.5 Image Video | vellria-seedance-2-5-image-video | Image to video | from 28 credits / s |
| Seedance 2.0 Fast Video | vellria-seedance-2-0-fast-video | Text to video | from 5 credits / s |
| Seedance 2.0 Fast Image Video | vellria-seedance-2-0-fast-image-video | Image to video | from 5 credits / s |
| MiniMax H3 Video | vellria-minimax-h3-video | Text to video | from 5 credits / s |
| MiniMax H3 Image Video | vellria-minimax-h3-image-video | Image to video | from 5 credits / s |
| MiniMax H3 Max Video | vellria-minimax-h3-max-video | Text to video | from 8 credits / s |
| MiniMax H3 Max Image Video | vellria-minimax-h3-max-image-video | Image to video | from 8 credits / s |
| HappyHorse 1.1 Video | vellria-happyhorse-1-1-video | Text to video | from 11 credits / s |
| HappyHorse 1.1 Image Video | vellria-happyhorse-1-1-image-video | Image to video | from 11 credits / s |
| Wan 3.0 Video | vellria-wan-3-video | Text to video | from 8 credits / s |
| Wan 3.0 Image Video | vellria-wan-3-image-video | Image to video | from 8 credits / s |
| Wan 3.0 Pro Video | vellria-wan-3-pro-video | Text to video | from 11 credits / s |
| Wan 3.0 Pro Image Video | vellria-wan-3-pro-image-video | Image to video | from 11 credits / s |
These rows come from GET /v1/models, the same catalog the API checks every request against, so an id or price shown here is one the endpoint accepts today. Have your code read that endpoint rather than copying this list; the API reference documents each field.
Example request
Seedance 2.5 Video with its catalog defaults. Swap the model field for any id in the table, and keep duration and resolution within what that model lists.
curl https://vellria.com/v1/generate/video \
-H "Authorization: Bearer vll_..." \
-H "Content-Type: application/json" \
-d '{
"model": "vellria-seedance-2-5-video",
"prompt": "…",
"duration": 4,
"resolution": "480p"
}'Models
Picking a family, and paying for seconds
Each family in the table ships as a pair of ids: a text-to-video model that starts from the prompt alone and an image-to-video model that also needs one starting frame. Sending a picture to the text-only id, or nothing to the image one, is refused rather than guessed at. The family pages show the exact body each model accepts next to its limits: the Seedance API, the Wan 3.0 API and the MiniMax H3 API are three of them, and every other row above links to its own.
A take costs the per-second rate of the chosen resolution multiplied by its duration, and the whole amount is taken when the job opens. If the provider fails the job, those credits come back automatically and both movements stay in your history. Nothing renews: there is no subscription and no monthly floor, only a balance topped up by card or another method available at checkout, and the pricing page lists the packages. Test a prompt at the shortest duration and the lowest resolution a model offers, and keep the expensive settings for the take you mean to deliver.
What the endpoint refuses
Fictional adult content is allowed. An automatic filter screens prompts and refuses the ones it identifies as sexual content with a minor in it — what's allowed and what isn't has the full policy. Depicting real people without their consent is prohibited by the terms. The first refusal is a 400 with the code content_blocked, returned before any credit moves; the second is not something the endpoint can see, so it is yours to enforce inside your product.
The provider hosting each model also moderates on its own terms. When it stops a render, the job ends as failed with an error code, and the credits return as they do for any other failure. For stills rather than clips, the NSFW image API covers the image endpoints; to make clips in the browser instead of from code, see NSFW video generation.
Frequently asked questions
Does the video API accept explicit prompts?
Yes, for fictional adults. The prompt reaches the model as your code wrote it. The only automatic check looks for minors, and a prompt it catches is refused with an error instead of being rewritten into something tamer.
Is there a webhook, or do I have to poll?
You poll. There is no callback URL to register for your own jobs; the record at GET /v1/generations/{id} is the source of truth, and it reaches completed or failed on its own because the service reconciles every job with the provider in the background.
Can I start a clip from my own image?
Yes, with an image-to-video id. Upload the file to POST /v1/uploads, keep the address it returns and pass it in image_urls; an address you host yourself works too if it is public https. The guide to calling the API from your code walks through the whole loop, uploads included.
Is there a free tier or trial credit for the API?
No. Creating a key costs nothing, but every run is paid from a credit balance, and API calls draw on the same balance at the same per-second prices as Studio. The uncensored AI video generator is the browser route to the same models.



