Images

February 17, 2026

Table of contents

  1. Model Comparison
  2. Request Headers
  3. Request Body
  4. Responses
  5. Model
  6. Examples
  7. Try It

Unified image generation endpoint supporting multiple Runway models: Nano Banana (nano-banana), Nano Banana Pro (nano-banana-pro), Gen-4 (gen4), and Gen-4 Turbo (gen4-turbo).

Nano Banana and Nano Banana Pro support image references of famous people and minors, unlike Google Flow.

Each model has different capabilities, reference image limits, resolution options, and optional parameters.

Accounts with a Runway Unlimited plan can set exploreMode to true to generate images without using credits. Explore mode generations are queued at lower priority and may take significantly longer — expect 5–15 minutes compared to 10–30 seconds for regular generations.

Model Comparison
Feature Nano Banana Nano Banana Pro Gen-4 Gen-4 Turbo
Reference images 0–3 0–14 0–3 1–3 (required)
Resolution 1K, 2K, 4K 1080p, 720p 1080p
diversity
seed
style

Please be aware that Runway’s moderation system analyzes your image and text prompts and may fail task with moderation message if the prompt is determined to be offensive. Runway monitors the rate and the number of moderated tasks, which may result in your account being suspended when the internal threshold is exceeded.

The account you use to upload asset(s) via POST /assets will also be used to execute the generation. Uploading an asset to a specific account ensures that generation with that asset will occur under the same account.

https://api.useapi.net/v1/runwayml/images/create

Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
Request Body
{
    "model": "nano-banana-pro",
    "email": "Optional Runway API account email",
    "text_prompt": "Required text prompt",
    "aspect_ratio": "16:9",
    "resolution": "1K",
    "num_images": 4,
    "imageAssetId1": "user:user_id-runwayml:account_email-asset:asset_uuid",
    "exploreMode": true,
    "replyUrl": "Place your call back URL here",
    "replyRef": "Place your reference id here",
    "maxJobs": 5
}
  • model is required. Supported values: nano-banana, nano-banana-pro, gen4, gen4-turbo. See model comparison for details.

  • email is optional, if not provided API will randomly select available account.

  • text_prompt is required. Describe your image in detail. Maximum length 5000 characters.

  • aspect_ratio is optional. Supported values: 16:9 (default), 9:16, 1:1, 4:3, 3:4, 21:9.

  • resolution is optional. Available resolutions depend on model.
    • Gen-4: 1080p (default), 720p
    • Gen-4 Turbo: 1080p
    • Nano Banana Pro: 1K (default), 2K, 4K
    • Nano Banana: not supported
  • num_images is optional. Supported values: 1 (default), 4.

  • imageAssetId1 through imageAssetId14 are optional. Specify the assetIds of reference images. Use GET /assets/?mediaType=image to see the list of image assets. To upload a new image asset use POST /assets. Parameters can be referred in the prompt as @IMG_1, @IMG_2, etc. Maximum number of reference images depends on model — see model comparison.

  • diversity is optional. Aesthetic Range, higher values increase the creative variation between generations in a set. Only supported by Gen-4. When using reference images, defaults to 2. Valid range: 1…5.

  • seed is optional. Only supported by Gen-4 and Gen-4 Turbo. Valid range 1…4294967294.

  • style is optional. Supported by Gen-4 and Gen-4 Turbo. Supported values: vivid, vivid-warm, vivid-cool, high-contrast, high-contrast-warm, high-contrast-cool, bw, bw-contrast, muted-pastel, dreamscape, nordic-minimal, light-anime, dark-anime, painted-anime, 3d-cartoon, sketch, low-angle, in-motion, terracotta.

  • exploreMode is optional. Set to true if you have a Runway Unlimited plan and wish to execute relaxed generation. You are not charged credits for Explore mode generations.

  • replyUrl is optional, if not provided value from useapi.net account will be used. Place here your callback URL. API will call the provided replyUrl once Runway task completed or failed. Maximum length 1024 characters. We recommend using sites like webhook.site to test callback URL functionality.

  • replyRef is optional, place here your reference id which will be stored and returned along with this Runway task response / result. Maximum length 1024 characters.

  • maxJobs is optional, if not provided value for referenced by image assetId account will be used. Valid range: 1…10. Runway has dynamic query capacity and guarantees that, for a given account, at least one job will run — often two, and very rarely, three. If you have a single account linked, keep adding new jobs until you receive a 429 response. Once you get a 429, wait for xx seconds or until at least one job completes, then try again. If you need to run more jobs in parallel, simply add more Runway accounts.
Responses
  • 200 OK

    Use returned taskId to retrieve task status and results using GET /tasks/taskId. The generated images can be found in the artifacts array of the task with the status SUCCEEDED.

    If you specify the optional parameter replyUrl the API will call the provided replyUrl with task progress updates until the task is complete or fails.

    {
        "task": {
            "id": "<uuid>",
            "name": "nano-banana-pro <your text prompt>",
            "image": null,
            "createdAt": "2026-02-17T23:58:27.296Z",
            "updatedAt": "2026-02-17T23:58:27.423Z",
            "taskType": "gemini_image",
            "options": {
                "name": "nano-banana-pro <your text prompt>",
                "text_prompt": "<your text prompt>",
                "reference_images": [
                    {
                        "tag": "IMG_1",
                        "assetId": "<asset uuid>",
                        "url": "<asset CDN url>"
                    }
                ],
                "aspect_ratio": "9:16",
                "image_size": "1K",
                "num_images": 1,
                "assetGroupId": "<uuid>",
                "creationSource": "tool-mode",
                "model": "gemini-3-pro-image-preview",
                "exploreMode": false,
                "recordingEnabled": true
            },
            "status": "PENDING",
            "error": null,
            "progressText": null,
            "progressRatio": "0",
            "estimatedTimeToStartSeconds": 0,
            "artifacts": [],
            "sharedAsset": null,
            "sourceAssetId": null,
            "taskId": "user:user_id-runwayml:account_email-task:task_uuid",
            "code": 200
        }
    }
    
  • 400 Bad Request

    {
      "error": "<Error message>",
      "code": 400
    }
    
  • 401 Unauthorized

    {
      "error": "Unauthorized",
      "code": 401
    }
    
  • 412 Insufficient credits

    You do not have enough credits to run this task.

    {
        "error": "You do not have enough credits to run this task."
    }
    
  • 429 Too Many Requests

    Wait in a loop for at least 10..30 seconds and retry again.

    When exploreMode is true and another explore mode job is still running, the new job will not start until the current one completes. Since explore mode generations can take 5–15 minutes, you may need to wait significantly longer before retrying.

    There are two possible cases for API response 429:

    {
        "error": "Account <Runway account email> is busy executing <Account maxJobs> tasks",
        "runningTasks": {
            "<Runway account email>": [
                {
                    "email": "<Runway account email>",
                    "taskId": "user:user_id-runwayml:account_email-task:task_#1_uuid",
                    "id": "<uuid>",
                    "replyUrl": "<replyUrl if provided>",
                    "replyRef": "<replyRef if provided>"
                }
            ]
        },
        "code": 429
    }
    
    • The API received an HTTP response status 429 from Runway. Runway has dynamic query management and may limit the number of simultaneously executed tasks based on internal service load and policies.
    {
        "error": "You have too many tasks running or pending. Please wait for some of them to finish before starting more."
    }
    
Model
{ // TypeScript, all fields are optional
  taskId: string,
  id: string,
  name: string,
  image: string,
  createdAt: string,
  updatedAt: string,
  taskType: string,
  options: {
        name: string,
        text_prompt: string,
        aspect_ratio: string,
        num_images: number,
        exploreMode: boolean,
        seed: number,
        diversity: number,
        style: string,
        width: number,
        height: number,
        flip: boolean,
        model: string,
        image_size: string,
        reference_images: { assetId: string, url: string, tag: string }[],
        creationSource: string,
        assetGroupId: string,
        recordingEnabled: boolean
  },
  status: string,
  progressText: string,
  progressRatio: number,
  estimatedTimeToStartSeconds: number,
  artifacts: any[],
  sharedAsset: any,
  error: {
    errorMessage: string,
    reason: string,
    message: string,
    moderation_category: string,
    tally_asimov: boolean
  },
  code: number,
  replyUrl: string,
  replyRef: string
}
Examples
  • curl -H "Accept: application/json" \
         -H "Content-Type: application/json" \
         -H "Authorization: Bearer …" \
         -X POST "https://api.useapi.net/v1/runwayml/images/create" \
         -d '{"model": "nano-banana-pro", "text_prompt": "…"}'
    
  • const model = "nano-banana-pro";
    const text_prompt = "text prompt";
    const apiUrl = `https://api.useapi.net/v1/runwayml/images/create`;
    const token = "API token";
    const data = {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${token}`,
        'Content-Type': 'application/json' }
    };
    data.body = JSON.stringify({
      model,
      text_prompt
    });
    const response = await fetch(apiUrl, data);
    const result = await response.json();
    console.log("response", {response, result});
    
  • import requests
    model = "nano-banana-pro"
    text_prompt = "text prompt"
    apiUrl = f"https://api.useapi.net/v1/runwayml/images/create"
    token = "API token"
    headers = {
        "Content-Type": "application/json",
        "Authorization" : f"Bearer {token}"
    }
    body = {
        "model": f"{model}",
        "text_prompt": f"{text_prompt}"
    }
    response = requests.post(apiUrl, headers=headers, json=body)
    print(response, response.json())
    
Try It