Перейти к основному содержанию
POST
/
v1
/
images
/
generations
cURL
curl 'https://www.bettertoken.ai/v1/images/generations' \
  -H 'Authorization: Bearer sk-***REDACTED***' \
  -H 'Content-Type: application/json' \
  --data '{
    "model": "gpt-image-2",
    "prompt": "一张未来感 AI 产品海报,浅色背景,玻璃质感,干净构图,高级科技感",
    "n": 1,
    "size": "1024x1024",
    "response_format": "b64_json",
    "output_format": "png"
  }'
import requests

url = "https://www.bettertoken.ai/v1/images/generations"

payload = {
    "model": "gpt-image-2",
    "prompt": "一张未来感 AI 产品海报,浅色背景,玻璃质感,干净构图,高级科技感",
    "n": 1,
    "size": "1024x1024",
    "response_format": "b64_json",
    "output_format": "png"
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: JSON.stringify({
    model: 'gpt-image-2',
    prompt: '一张未来感 AI 产品海报,浅色背景,玻璃质感,干净构图,高级科技感',
    n: 1,
    size: '1024x1024',
    response_format: 'b64_json',
    output_format: 'png'
  })
};

fetch('https://www.bettertoken.ai/v1/images/generations', options)
  .then(res => res.json())
  .then(res => console.log(res))
  .catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://www.bettertoken.ai/v1/images/generations",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
    'model' => 'gpt-image-2',
    'prompt' => '一张未来感 AI 产品海报,浅色背景,玻璃质感,干净构图,高级科技感',
    'n' => 1,
    'size' => '1024x1024',
    'response_format' => 'b64_json',
    'output_format' => 'png'
  ]),
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer <token>",
    "Content-Type: application/json"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://www.bettertoken.ai/v1/images/generations"

	payload := strings.NewReader("{\n  \"model\": \"gpt-image-2\",\n  \"prompt\": \"一张未来感 AI 产品海报,浅色背景,玻璃质感,干净构图,高级科技感\",\n  \"n\": 1,\n  \"size\": \"1024x1024\",\n  \"response_format\": \"b64_json\",\n  \"output_format\": \"png\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://www.bettertoken.ai/v1/images/generations")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"model\": \"gpt-image-2\",\n  \"prompt\": \"一张未来感 AI 产品海报,浅色背景,玻璃质感,干净构图,高级科技感\",\n  \"n\": 1,\n  \"size\": \"1024x1024\",\n  \"response_format\": \"b64_json\",\n  \"output_format\": \"png\"\n}")
  .asString();
require 'uri'
require 'net/http'

url = URI("https://www.bettertoken.ai/v1/images/generations")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"model\": \"gpt-image-2\",\n  \"prompt\": \"一张未来感 AI 产品海报,浅色背景,玻璃质感,干净构图,高级科技感\",\n  \"n\": 1,\n  \"size\": \"1024x1024\",\n  \"response_format\": \"b64_json\",\n  \"output_format\": \"png\"\n}"

response = http.request(request)
puts response.read_body
{
  "created": 1710000000,
  "data": [
    {
      "b64_json": "iVBORw0KGgoAAAANSUhEUgAA...(truncated)"
    }
  ]
}
{
  "error": {
    "message": "invalid request",
    "type": "invalid_request_error",
    "code": "invalid_request"
  },
  "message": "insufficient quota"
}
{
  "error": {
    "message": "invalid request",
    "type": "invalid_request_error",
    "code": "invalid_request"
  },
  "message": "insufficient quota"
}
{
  "error": {
    "message": "invalid request",
    "type": "invalid_request_error",
    "code": "invalid_request"
  },
  "message": "insufficient quota"
}
{
  "error": {
    "message": "invalid request",
    "type": "invalid_request_error",
    "code": "invalid_request"
  },
  "message": "insufficient quota"
}
{
  "error": {
    "message": "invalid request",
    "type": "invalid_request_error",
    "code": "invalid_request"
  },
  "message": "insufficient quota"
}
POST /v1/images/generations Endpoint text-to-image использует тело запроса application/json. Передайте prompt, держите HTTP-запрос открытым и прочитайте готовое изображение из data[0].b64_json в том же ответе.
Используйте https://www.bettertoken.ai/v1 как Base URL. API Key BetterToken передается через Authorization: Bearer YOUR_API_KEY.
В Playground справа можно заполнить Authorization и тело запроса, а затем отправить запрос напрямую на https://www.bettertoken.ai/v1/images/generations.
Не помещайте API keys во frontend-код браузера, Git-репозитории, тикеты, скриншоты или логи. Для server-side proxy calls храните ключи только в переменных окружения сервера или secret manager.

Рекомендуемые значения

Передавайте эти поля явно в каждом запросе:
{
  "model": "gpt-image-2",
  "n": 1,
  "response_format": "b64_json",
  "output_format": "png"
}
Чтобы сгенерировать несколько изображений, отправляйте несколько независимых запросов. Не рассчитывайте на один запрос с n > 1.

Рекомендуемые размеры

sizeСоотношениеСценарий
autoAutoАвтоматический выбор размера
1024x10241:1Квадратные изображения, аватары, обложки, assets
1536x10243:2Landscape-постеры, баннеры, сцены
1024x15362:3Portrait-обложки для мобильных и постеры
1536x11524:3Стандартные landscape-изображения, product images, content graphics
1152x15363:4Стандартные portrait-изображения, mobile covers, vertical posters
2048x20481:1High-resolution квадратные изображения
2048x115216:9High-resolution landscape-изображения
3840x216016:94K landscape-изображения
2160x38409:164K portrait-изображения
size задает ожидаемое соотношение сторон и уровень размера. Фактические пиксели в ответе могут быть сопоставлены или скорректированы сервером. Используйте размеры декодированного изображения, а не принудительную обрезку до запрошенного значения.

Сохранение изображения

Успешный ответ следует OpenAI-совместимой форме image response:
{
  "created": 1710000000,
  "data": [
    {
      "b64_json": "iVBORw0KGgoAAAANSUhEUgAA...(truncated)"
    }
  ]
}
Прочитайте data[0].b64_json и сохраните его как base64 image content. Ответ может содержать дополнительные поля, например revised_prompt; клиент должен разрешать такие поля. Всегда задавайте output_format: "png". Затем сохраняйте декодированное изображение как .png без проверки file headers.
import base64
import json
from pathlib import Path

response = json.loads(Path("response.json").read_text(encoding="utf-8"))
b64_json = response["data"][0]["b64_json"]

if "," in b64_json and "base64" in b64_json.split(",", 1)[0]:
    b64_json = b64_json.split(",", 1)[1]

image_bytes = base64.b64decode(b64_json)
Path("output.png").write_bytes(image_bytes)
Не рассчитывайте, что output_format: "jpeg" или output_format: "webp" сразу вернет JPEG или WebP-файл. Текущий endpoint может по-прежнему вернуть PNG. Если продукту нужен JPEG или WebP, сначала получите PNG и конвертируйте его в своем коде.

Поток ответа

Endpoint синхронный. После отправки POST /images/generations держите текущий HTTP-запрос открытым до ответа сервера. При успешной генерации содержимое изображения возвращается в data[0].b64_json. Endpoint не возвращает task_id; отдельного status query или endpoint для скачивания результата нет.

Timeout и повторные попытки

  • Задавайте timeout HTTP-клиента в несколько минут.
  • Повторяйте transport errors, 408, 409, 425, 429 и 5xx.
  • Не повторяйте автоматически 400, 401, отсутствующие параметры и некорректные запросы.
  • Используйте exponential backoff, например 3s, 8s, 15s.
  • Если дубли изображений недопустимы, записывайте собственный request ID перед retry.

Смежные документы

Авторизации

Authorization
string
header
обязательно

Use your BetterToken API Key as a bearer token. Do not expose API keys in frontend browser code, screenshots, logs, tickets, or Git repositories.

Тело

application/json
model
enum<string>
по умолчанию:gpt-image-2
обязательно

固定使用 gpt-image-2。

Доступные опции:
gpt-image-2
Пример:

"gpt-image-2"

prompt
string
обязательно

图片生成提示词。

Пример:

"一张未来感 AI 产品海报,浅色背景,玻璃质感,干净构图,高级科技感"

n
integer
по умолчанию:1

推荐固定为 1。多张图片建议发起多次独立请求。

Требуемый диапазон: 1 <= x <= 1
Пример:

1

size
enum<string>
по умолчанию:1024x1024

图片尺寸和比例档位。auto 为自动;1024x1024 和 2048x2048 为 1:1;1536x1024 为 3:2;1024x1536 为 2:3;1536x1152 为 4:3;1152x1536 为 3:4;2048x1152 和 3840x2160 为 16:9;2160x3840 为 9:16。实际返回像素可能由服务端映射或调整,客户端应以解码后的真实图片尺寸为准。

Доступные опции:
auto,
1024x1024,
1536x1024,
1024x1536,
1536x1152,
1152x1536,
2048x2048,
2048x1152,
3840x2160,
2160x3840
Пример:

"1024x1024"

response_format
enum<string>
по умолчанию:b64_json

推荐固定为 b64_json,便于稳定保存图片。

Доступные опции:
b64_json
Пример:

"b64_json"

output_format
enum<string>
по умолчанию:png

推荐固定为 png。不要依赖 jpeg 或 webp 直接返回对应格式。

Доступные опции:
png
Пример:

"png"

Ответ

Image generation result.

OpenAI-compatible image response. Clients should read data[0].b64_json and allow additional fields such as revised_prompt.

created
integer
Пример:

1710000000

data
object[]