● nureta

Image-to-Video: Turn a Nude Still into an NSFW Clip

Animate a nude still with the NSFW image-to-video API: use it as an identity reference or pin it as the first frame, and when to use each.

Updated · 3 min read

Already have a still you like — a nude you generated or a character portrait — and want it to move? Nureta takes an image as input two different ways, and they are not interchangeable. One uses the image for identity; the other makes it the literal opening frame of the clip.

Consent first: reference photos may only show adults who have consented to being used in adult content. Real people without consent, public figures and minors (including fictional minors) are prohibited: use is governed by Nureta's content policy; reference images that look like a public figure are rejected automatically.

This guide covers both, the one rule that keeps them from clashing, and when to reach for each. If you need a still first, start with how to generate NSFW images with AI.

Get your image a URL

The API takes images by URL. If yours is already hosted at a public HTTPS URL, use that. If not, upload it: ask the upload endpoint for a short-lived signed URL, PUT the bytes to it, and use the returned assetUrl. Uploading is free — you are billed only when you create a generation. Presigning is capped at 30 requests per minute per key.

# 1. Ask for a signed upload URL.
UPLOAD=$(curl -s -X POST "$NURETA_URL/api/v3/contents/uploads" \
  -H "Authorization: Bearer sk-..." \
  -H "Content-Type: application/json" \
  -d '{"fileName": "nude.jpg", "contentType": "image/jpeg"}')
ASSET_URL=$(echo "$UPLOAD" | jq -r .assetUrl)

# 2. PUT the bytes to the signed URL (same Content-Type, no auth header).
UPLOAD_URL=$(echo "$UPLOAD" | jq -r .uploadUrl)
curl -s -X PUT "$UPLOAD_URL" -H "Content-Type: image/jpeg" --data-binary @nude.jpg
# ASSET_URL is now usable as an image_url in a generation task.

Option A: use it as a reference image

Pass the image as a plain image_url item with no role and it becomes an identity reference: the clip renders a fresh scene and motion, but the person looks like your still. Choose this when you want the character but a new composition. Up to nine reference images per task — stack angles of the same person for stronger identity. Getting identity to hold is covered in reference images for consistent faces.

Option B: pin it as the first frame

Set role: "first_frame" on the image item and the clip literally opens on that still, then animates forward from it. The render is frame-conditioned — the motion grows out of the exact composition in your image. Use role: "last_frame" to pin the closing frame instead, or as well. Frame control is covered in depth in pinning first and last frames.

The one rule: a frame OR references, not both

A pinned frame is mutually exclusive with reference images. When you send a first_frame or last_frame, the request renders frame-conditioned and any role-less reference images (and preset assets) are ignored. Send a frame or send references — never both in the same task.

The practical consequence: if you pin a frame, that frame is the only identity source for the render — your reference images will not apply. So pin a frame that already shows the right person, or drop the frame and let reference images hold identity instead.

Which one to use

  • Want the same person in a brand-new shot and motion → reference image.
  • Want the clip to start from this exact picture → first_frame.
  • Continuing where a previous clip ended → pin that clip's final frame as the next clip's first_frame.
  • Have several angles of one character → stack them as reference images for stronger identity.

Full example

Reference-image version — the still supplies identity, the prompt supplies the act:

curl -s -X POST "$NURETA_URL/api/v3/contents/generations/tasks" \
  -H "Authorization: Bearer sk-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seahorse-720p",
    "duration": 8,
    "content": [
      { "type": "text", "text": "she lies back on the bed and touches herself, slow, nude, soft light" },
      { "type": "image_url", "image_url": { "url": "https://.../nude.jpg" } }
    ]
  }'

Swap the plain image_url for one carrying "role": "first_frame" to open on that exact still instead — but then drop any other reference images, per the rule above. Every field is in the generation API docs.

Open the playground →