概述

使用 API Key 通过简单的 HTTP 接口编辑或转换现有图片。积分将根据处理的图片数量自动扣减。

接口地址

  • 方法: POST
  • URL: https://api.nanobananaapi.dev/v1/images/edit

身份验证

Authorization 请求头中包含您的 API Key:

Authorization: Bearer YOUR_API_KEY
Content-Type: application/json

请求体

{
  "prompt": "将这个风景图转换成冬季雪景",
  "image": "https://example.com/image.jpg",
  "num": 1,
  "model": "gemini-3-pro-image-preview",
  "image_size": "16:9"
}

参数说明

  • prompt (必填): 描述期望的转换效果
  • image (必填): 源图片 URL 或 base64 数据 URL。可以是单个字符串或字符串数组
  • num (可选): 生成变体的数量 (默认: 1, 最大: 9)
  • model (可选): 使用的 AI 模型 (默认: gemini-3-pro-image-preview)
  • image_size (可选): 输出图片的宽高比
  • mask (可选): 用于选择性编辑的蒙版图片 URL

批量处理

一次请求可以处理多张图片:

{
  "prompt": "让天空更有戏剧性",
  "image": [
    "https://example.com/image1.jpg",
    "https://example.com/image2.jpg"
  ],
  "num": 2,
  "model": "gemini-3-pro-image-preview"
}

支持的 model 值:

  • gemini-3-pro-image-preview
  • gemini-3-pro-image-preview-2k
  • gemini-3-pro-image-preview-4k

支持的 image_size 值:

  • 1:1
  • 16:9
  • 9:16
  • 4:3
  • 3:4
  • 2:3
  • 3:2

积分扣减

  • gemini-2.5-flash-image: 每张图片 2 积分
  • gemini-2.5-flash-image-hd: 每张图片 5 积分
  • gemini-3-pro-image-preview: 每张图片 10 积分
  • gemini-3-pro-image-preview-2k: 每张图片 10 积分
  • gemini-3-pro-image-preview-4k: 每张图片 20 积分
  • 如果积分不足,API 将返回错误。

响应格式

所有响应使用统一的 JSON 格式:

{
  "code": 0,
  "message": "ok",
  "data": {
    "url": "https://api.nanobananaapi.dev/v1/images/1234567890.png"
  }
}

num 大于 1 时,API 返回多个图片 URL:

{
  "code": 0,
  "message": "ok",
  "data": {
    "url": [
      "https://api.nanobananaapi.dev/v1/images/1234567890.png",
      "https://api.nanobananaapi.dev/v1/images/0987654321.png"
    ]
  }
}

错误响应:

{
  "code": 400,
  "message": "Parameter \"image\" is required for image editing"
}

常见错误信息:

  • 400: 参数错误
  • 401: 未授权
  • 500: 服务器错误

调用示例

curl

curl -X POST "https://api.nanobananaapi.dev/v1/images/edit" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "将这个风景图转换成冬季雪景",
    "image": "https://example.com/image.jpg",
    "num": 1,
    "model": "gemini-3-pro-image-preview",
    "image_size": "16:9"
  }'

Node.js

async function editImage() {
  const res = await fetch('https://api.nanobananaapi.dev/v1/images/edit', {
    method: 'POST',
    headers: {
      Authorization: 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      prompt: '将这个风景图转换成冬季雪景',
      image: 'https://example.com/image.jpg',
      num: 1,
      model: 'gemini-3-pro-image-preview',
      image_size: '16:9',
    }),
  });

  const result = await res.json();
  if (result.code !== 0) throw new Error(result.message);
  return result.data;
}

Python

import requests


def edit_image():
  url = 'https://api.nanobananaapi.dev/v1/images/edit'
  headers = {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  }
  payload = {
    'prompt': '将这个风景图转换成冬季雪景',
    'image': 'https://example.com/image.jpg',
    'num': 1,
    'model': 'gemini-3-pro-image-preview',
    'image_size': '16:9',
  }

  res = requests.post(url, headers=headers, json=payload, timeout=60)
  res.raise_for_status()
  result = res.json()
  if result.get('code') != 0:
    raise Exception(result.get('message'))
  return result.get('data')


print(edit_image())

Go

package main

import (
  "bytes"
  "encoding/json"
  "fmt"
  "io"
  "net/http"
  "time"
)

func main() {
  url := "https://api.nanobananaapi.dev/v1/images/edit"
  payload := map[string]any{
    "prompt":     "将这个风景图转换成冬季雪景",
    "image":      "https://example.com/image.jpg",
    "num":        1,
    "model":      "gemini-3-pro-image-preview",
    "image_size": "16:9",
  }

  bodyBytes, err := json.Marshal(payload)
  if err != nil {
    panic(err)
  }

  req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(bodyBytes))
  if err != nil {
    panic(err)
  }
  req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
  req.Header.Set("Content-Type", "application/json")

  client := &http.Client{Timeout: 60 * time.Second}
  resp, err := client.Do(req)
  if err != nil {
    panic(err)
  }
  defer resp.Body.Close()

  respBody, err := io.ReadAll(resp.Body)
  if err != nil {
    panic(err)
  }

  fmt.Println(string(respBody))
}

Java

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;

public class Main {
  public static void main(String[] args) throws Exception {
    String json = "{\n" +
      "  \"prompt\": \"将这个风景图转换成冬季雪景\",\n" +
      "  \"image\": \"https://example.com/image.jpg\",\n" +
      "  \"num\": 1,\n" +
      "  \"model\": \"gemini-3-pro-image-preview\",\n" +
      "  \"image_size\": \"16:9\"\n" +
      "}";

    HttpClient client = HttpClient.newBuilder()
      .connectTimeout(Duration.ofSeconds(10))
      .build();

    HttpRequest request = HttpRequest.newBuilder()
      .uri(URI.create("https://api.nanobananaapi.dev/v1/images/edit"))
      .timeout(Duration.ofSeconds(60))
      .header("Authorization", "Bearer YOUR_API_KEY")
      .header("Content-Type", "application/json")
      .POST(HttpRequest.BodyPublishers.ofString(json))
      .build();

    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    System.out.println(response.body());
  }
}