API
Wan 3.0 API
VideoWan 3.0 API generates 2–30 second videos at 480p / 720p / 1080p, using text, first/last frames, or multimodal references. Reference mode accepts up to 10 images, 5 videos and 5 audio files. Each image must be no larger than 30 MB.
Body
application/jsonmodelstringrequiredwan-3-0input.promptstringrequiredDescribe the subject, action, scene, lighting, camera movement, and timing. Leading and trailing whitespace is trimmed.
input.frames_imagesstring[]optionalA list of one or two publicly accessible HTTPS image URLs: first frame, then optional last frame. This is a separate generation mode and cannot be combined with reference_images, reference_videos or reference_audios.
Maximum URLs: 2.
Maximum size per image: 30 MB.
Example: ["https://example.com/first-frame.png","https://example.com/last-frame.png"]
input.reference_imagesstring[]optionalA list of publicly accessible HTTPS reference image URLs. May be combined with reference_videos and reference_audios, but never with frames_images. Send URL strings, not uploaded file objects or base64.
Maximum URLs: 10.
Maximum size per image: 30 MB.
Example: ["https://example.com/your-image.png"]
input.reference_videosstring[]optionalA list of publicly accessible HTTPS reference video URLs. Cannot be combined with frames_images. Providing videos changes credit consumption; see the reference-video pricing row and billing formula below.
Maximum URLs: 5.
Example: ["https://example.com/your-video.mp4"]
input.reference_audiosstring[]optionalA list of publicly accessible HTTPS reference audio URLs. May be combined with other reference_* lists, but never with frames_images.
Maximum URLs: 5.
Example: ["https://example.com/your-audio.mp3"]
input.reference_video_durationnumberoptionalTotal duration of all supplied reference videos in seconds. Required when reference_videos is provided. Billing rounds this total up to whole seconds and caps the additional billed duration at 15 seconds. Omit when no reference videos are supplied.
input.durationintegeroptionalVideo duration in whole seconds, from 2 to 30. Defaults to 5. Credit usage scales with this duration.
Default: 5
input.resolutionstringoptionalOutput video resolution. Use a lowercase value from the list below. Resolution changes the credit rate.
Default: 720p
input.aspect_ratiostringoptionalOutput width-to-height ratio. Defaults to 16:9. Frame inputs can guide the final composition.
Default: 16:9
input.soundbooleanoptionalWhether to generate audio alongside the video. Defaults to false. Send a JSON boolean, not a string.
Default: false
Request examples
Choose one generation mode: omit all media for text-to-video; use frames_images for first/last-frame generation; or combine reference_images, reference_videos and reference_audios for reference-guided generation. frames_images cannot be combined with any reference_* media list. All resources are lists of publicly accessible HTTPS URLs, not file objects or base64. Replace example.com URLs before use. Save data.task_id and poll POST /api/v1/check until completed or failed.
POST /api/v1/createcurl -X POST https://nanobanana.io/api/v1/create \
-H "Authorization: Bearer sk_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"model": "wan-3-0",
"input": {
"prompt": "A red vintage car drives along a coastal road at sunset. The camera tracks smoothly beside the car as warm light reflects on the ocean.",
"duration": 5,
"aspect_ratio": "16:9",
"resolution": "720p",
"sound": false
}
}'POST /api/v1/create · HTTP 201{
"data": {
"task_id": "task_example",
"model": "wan-3-0",
"status": "processing",
"credits": 600
}
}Poll this endpoint using the returned task ID until the task is completed or failed. We recommend polling every 5 seconds to check the latest task status.
POST /api/v1/check{
"task_id": "task_example"
}Response
Task status returned by POST /api/v1/check. The IDs, URLs, and timestamps below are illustrative.
idstringrequiredTask identifier in data.id, matching the task_id used in the check request.
statusstringrequiredfailed_reasonstringoptionalOnly returned when status is failed, to explain the failure. This field is omitted for completed and processing.
Completed · completed
The download URLs are in data.data.results.
POST /api/v1/check · HTTP 200{
"data": {
"id": "task_example",
"created_at": 1791244800,
"model": "wan-3-0",
"status": "completed",
"data": {
"results": [
"https://example.com/generated.mp4"
],
"processing_time": 120
}
}
}Other statuses
For processing or failed, data.data is null. This example shows failed: only failed includes failed_reason. Continue polling for processing; stop polling for failed.
POST /api/v1/check · HTTP 200{
"data": {
"id": "task_example",
"created_at": 1791244800,
"model": "wan-3-0",
"status": "failed",
"data": null,
"failed_reason": "Generation failed."
}
}Credit usage
Credits per billable second, by resolution and reference-video mode.
| Generation | 480P | 720P | 1080P |
|---|---|---|---|
| Without reference videos | 60 | 120 | 240 |
| With reference videos | 60 | 120 | 240 |
Each request generates one video. Omitted duration and resolution use the defaults above. Reference-video requests may consume more credits; use the matching row and formula.
Without reference videos: generated seconds × rate. With reference videos: (generated seconds + min(15, ceil(reference_video_duration))) × rate. The per-second rate is unchanged; the reference-video duration adds billable seconds.
The credits field returned by POST /api/v1/create shows the amount charged for the task.
