NSFW Video Generation API: Text and Image to Video
An NSFW video generation API for adult text-to-video and image-to-video: 5-180 s, 480p-1080p, Seahorse from $0.1888/s, Seedance 2.0 from $0.0885/s, USDC.
Updated · 8 min read
Short answer: the Nureta Developer API is an NSFW video generation API. You send one REST request with a text prompt, and optionally reference images or a pinned first and last frame, and you get back an adult video with audio. A single clip is 5, 8, 10, 12, 15 seconds long; anything from 16 to 180 seconds (3 minutes) renders as a stitched multi-shot scene. Output is 480p, 720p or 1080p, priced per second from $0.1888 on the Seahorse models (Nureta's own pipeline with NSFW enhancement) or from $0.0885 on the direct Seedance 2.0 models (single clips, no NSFW enhancement), paid from a prepaid USDC balance and refunded automatically if the render fails. Generation follows Nureta's content policy: adults only, no minors, no real people without consent, no public figures.
This guide is the reference page for that answer: what the endpoint accepts, what it costs, how long a video can be, how to control each shot, and how to run it unattended with webhooks. Every fact here comes from the API docs; follow the links for the full field tables.
What the API generates
Mainstream video APIs refuse explicit adult scenes. This one is built for adult content, so explicit adult scenes are the normal case, not an edge case. One endpoint covers both common workflows:
- Text-to-video: a prompt only. No images are needed. See how to create an NSFW video from a text prompt.
- Image-to-video: up to 9
image_urlitems in total. They are either identity references or a pinnedfirst_frame/last_frame, not both. See image-to-video from a still. - Audio: generated by default (
generate_audioistrue). You can also send oneaudio_urlitem of your own. - Aspect ratio:
16:9by default, or9:16,4:3,3:4,1:1,21:9andadaptive.
The same API key also creates images (a flat $0.05 each at 2K or 4K) and scripts (a flat $0.01 each), so a pipeline can write a storyboard, make stills and render the video with one account and one balance.
Price per second at 480p, 720p and 1080p
Video is priced per second of output. The table shows the Seahorse models (Nureta's own pipeline with NSFW enhancement). The price is the per-second rate times the duration, charged when the task is created. Audio is included. There is no subscription and no monthly minimum.
| Model | Resolution | Per second | 5 s video | 15 s video | 60 s video | 180 s video |
|---|---|---|---|---|---|---|
seahorse-480p | 480p | $0.1888 | $0.94 | $2.83 | $11.33 | $33.98 |
seahorse-720p | 720p | $0.2773 | $1.39 | $4.16 | $16.64 | $49.91 |
seahorse-1080p | 1080p | $0.5428 | $2.71 | $8.14 | $32.57 | $97.70 |
Live prices are public: GET /api/v3/models returns every video model with its per-second price, with no API key. The full table, including the direct Seedance 2.0 models that forward your prompt verbatim (from $0.0885 per second, single clips, no NSFW enhancement), is on the API pricing page. A generation that fails or times out returns its full price to your balance.
Video length: 5-15 s clips and 16-180 s scenes
The duration field decides the shape of the output. A value of 5, 8, 10, 12, 15 seconds renders one clip. Any whole number from 16 to 180 renders a multi-shot video: the director plans the shots, renders each one and stitches them together, and the people keep the same faces and bodies across the cut. The default is 5 seconds.
- Single clip: 5, 8, 10, 12 or 15 seconds. Use it for short loops, previews and vertical feeds.
- Stitched scene: any integer from 16 to 180 seconds. Use it for a full scene with build-up and payoff.
- The price scales with the seconds you ask for, not with the number of shots.
For a longer walk-through of multi-shot scenes, see multi-shot adult scenes up to 3 minutes.
Quickstart: one request
Create a key on the API keys page, top up your balance, and POST a task. The response is HTTP 201 with the task view, including its id.
export NURETA_URL="https://developer.nureta.ai"
curl -s -X POST "$NURETA_URL/api/v3/contents/generations/tasks" \
-H "Authorization: Bearer sk-..." \
-H "Content-Type: application/json" \
-d '{
"model": "seahorse-480p",
"content": [{"type": "text", "text": "two adults in a candlelit loft, slow camera push-in"}],
"ratio": "9:16",
"duration": 10
}'
# => 201 {"id": "cgt-...", "status": "...", ...}Poll GET /api/v3/contents/generations/tasks/{id} until status is succeeded (then content.video_url holds the video) or failed (then the charge is refunded). While it runs, the step object reports the current phase, so you can show real progress. The full loop with rate limits is in automating NSFW video generation.
First and last frame
Set role to first_frame or last_frame on an image_url item to pin the opening or closing frame of the video. A clip with a pinned frame renders frame-conditioned and ignores reference images and the audio item, so send frames or references, not both. On a multi-shot video, first_frame applies only to the first shot and last_frame only to the last shot; the other shots keep their references.
"content": [
{"type": "text", "text": "she turns from the window and walks to the bed"},
{"type": "image_url", "image_url": {"url": "https://example.com/start.jpg"}, "role": "first_frame"},
{"type": "image_url", "image_url": {"url": "https://example.com/end.jpg"}, "role": "last_frame"}
]Upload your own images with POST /api/v3/contents/uploads and pass the returned assetUrl. More on frame control: pinning first and last frames.
Storyboard segments and the per-shot explicit flag
For a video over 15 seconds you can skip the director's plan and send your own storyboard as a segments array. Each segment is one stitched shot with its own script and duration_seconds (4-15, default 9). The shots must total 16-180 seconds, and that total becomes the duration and the price.
"segments": [
{"script": "she steps onto the rooftop, city lights behind her", "duration_seconds": 8},
{"script": "he joins her at the railing; they kiss", "duration_seconds": 10, "explicit": false},
{"script": "the payoff shot, described concretely", "duration_seconds": 12, "explicit": true}
]The explicit flag answers one question per shot: does a real sex act happen in this shot? A shot flagged true goes through a separate anatomy-reference pipeline, so it renders the act instead of soft, suggestive motion. Its script must describe the act concretely: who does what, the position and the contact. A shot flagged false is build-up or story (a look, a touch, undressing, afterglow) and renders from text only. Mixing the two per shot is how you pace a scene. See the explicit flag in the docs and writing explicit scene beats that render.
Each segment can also pin its own first_frame and last_frame, and chain_from_previous chains a shot to the one before it. To chain a whole video, send auto_chain: true instead: see smooth long videos with auto chaining. A video with chained shots renders one shot at a time.
Edit mode: approve the plan before the render
Send mode: "edit" (videos over 15 s only) and the task stops after the director drafts the storyboard, at status: "planned", with preview images. You can then change beats, durations, frames, background plates and the shared world, wardrobe and characters, and render with POST …/render when you approve it. The task is charged for the requested duration at submit, and edits never change the price: the shot durations must keep summing to the paid duration.
If you do not like the draft, POST …/cancel refunds the full charge at once. A draft that you do not render or edit for 24 hours is refunded automatically. After delivery, you can also re-render one clip instead of the whole video and pay only for that clip's seconds.
Webhooks for unattended pipelines
Polling works, but a pipeline that renders many videos should pass callback_url (HTTPS) when it creates the task. The API then POSTs the terminal task view to that URL when the task succeeds, fails or is cancelled. Add callback_secret (8-256 characters) and every delivery carries an X-Nureta-Signature header: an HMAC-SHA256 hex digest of X-Nureta-Timestamp + "." + rawBody with your secret.
- Delivery is at least once, so deduplicate by task
id. - A failed delivery is retried at least 30 seconds later, up to 5 attempts in total. Any 2xx response counts as success; the timeout is 5 seconds.
- Events:
generation.task.completed(terminal),generation.task.planned(an edit-mode draft is ready) andgeneration.task.rerender.completed. - Each API key allows 10 requests per second by default; you can set it from 1 to 100 on the API keys page.
The header list and the verification steps are in the callback webhook docs.
Billing: prepaid USDC, refunds on failure
You top up a prepaid balance with USDC on Base, where 1 USDC is $1.00. No card and no subscription are needed. Each task debits its posted price when you create it; if the balance is too low, the request fails with AccountOverdueError and nothing is charged. A generation that fails or times out is refunded to the balance in full. GET /api/v3/account returns your current balance, so a pipeline can check it before a batch.
A worked example: a 60-second stitched scene on the Seahorse model seahorse-720p costs $16.64 ($0.2773 × 60). Drafting it in edit mode first costs nothing extra, and if you cancel the draft you get the full amount back.
FAQ
Which API generates NSFW video? The Nureta Developer API renders adult text-to-video and image-to-video over REST, within Nureta's content policy. The Nureta consumer app at nureta.ai runs on this same API.
What does a 5-second clip cost? $0.94 at 480p on the Seahorse model seahorse-480p (Nureta's own pipeline with NSFW enhancement). On the direct Seedance 2.0 models (single clips, no NSFW enhancement) it is $0.44 at 480p on seedance2.0-fast. The pricing page lists every resolution and duration.
How long can a video be? Up to 180 seconds (3 minutes) as one stitched multi-shot video. Single clips are 5 to 15 seconds.
Can I control which shots are explicit? Yes. Send segments with an explicit flag on each shot, or use edit mode, where the director sets the flag and you override it per shot.
Can I use photos of real people? Only with their consent, and never of public figures. The API rejects reference images that look like a public figure automatically.
Read the video API docs →