- Supports text-to-image, image-to-image, and inpainting generation modes
- Supports transparent backgrounds, multiple output formats, and quality tiers
- Generate up to 4 images per request, with up to 15 reference images
Request example
curl --request POST \
--url https://api.openveer.com/v1/images/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"model": "gpt-image-1-official",
"prompt": "An ancient castle under a starry sky",
"size": "1:1",
"quality": "auto",
"n": 1
}'import requests
url = "https://api.openveer.com/v1/images/generations"
payload = {
"model": "gpt-image-1-official",
"prompt": "An ancient castle under a starry sky",
"size": "1:1",
"quality": "auto",
"n": 1
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())const url = "https://api.openveer.com/v1/images/generations";
const payload = {
model: "gpt-image-1-official",
prompt: "An ancient castle under a starry sky",
size: "1:1",
quality: "auto",
n: 1,
};
const headers = {
Authorization: "Bearer <token>",
"Content-Type": "application/json",
};
fetch(url, {
method: "POST",
headers: headers,
body: JSON.stringify(payload),
})
.then((response) => response.json())
.then((data) => console.log(data))
.catch((error) => console.error("Error:", error));package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
func main() {
url := "https://api.openveer.com/v1/images/generations"
payload := map[string]interface{}{
"model": "gpt-image-1-official",
"prompt": "An ancient castle under a starry sky",
"size": "1:1",
"quality": "auto",
"n": 1,
}
jsonData, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
req.Header.Set("Authorization", "Bearer <token>")
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
}import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
public class Main {
public static void main(String[] args) throws Exception {
String url = "https://api.openveer.com/v1/images/generations";
String payload = """
{
"model": "gpt-image-1-official",
"prompt": "An ancient castle under a starry sky",
"size": "1:1",
"quality": "auto",
"n": 1
}
""";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}<?php
$url = "https://api.openveer.com/v1/images/generations";
$payload = [
"model" => "gpt-image-1-official",
"prompt" => "An ancient castle under a starry sky",
"size" => "1:1",
"quality" => "auto",
"n" => 1
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: Bearer <token>",
"Content-Type: application/json"
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>require 'net/http'
require 'json'
require 'uri'
url = URI("https://api.openveer.com/v1/images/generations")
payload = {
model: "gpt-image-1-official",
prompt: "An ancient castle under a starry sky",
size: "1:1",
quality: "auto",
n: 1
}
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 = payload.to_json
response = http.request(request)
puts response.bodyimport Foundation
let url = URL(string: "https://api.openveer.com/v1/images/generations")!
let payload: [String: Any] = [
"model": "gpt-image-1-official",
"prompt": "An ancient castle under a starry sky",
"size": "1:1",
"quality": "auto",
"n": 1
]
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("Bearer <token>", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try? JSONSerialization.data(withJSONObject: payload)
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("Error: \(error)")
return
}
if let data = data, let responseString = String(data: data, encoding: .utf8) {
print(responseString)
}
}
task.resume()using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var url = "https://api.openveer.com/v1/images/generations";
var payload = @"{
""model"": ""gpt-image-1-official"",
""prompt"": ""An ancient castle under a starry sky"",
""size"": ""1:1"",
""quality"": ""auto"",
""n"": 1
}";
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer <token>");
var content = new StringContent(payload, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, content);
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
}
}import 'dart:convert';
import 'package:http/http.dart' as http;
void main() async {
final url = Uri.parse('https://api.openveer.com/v1/images/generations');
final payload = {
'model': 'gpt-image-1-official',
'prompt': 'An ancient castle under a starry sky',
'size': '1:1',
'quality': 'auto',
'n': 1,
};
final response = await http.post(
url,
headers: {
'Authorization': 'Bearer <token>',
'Content-Type': 'application/json',
},
body: jsonEncode(payload),
);
print(response.body);
}library(httr)
library(jsonlite)
url <- "https://api.openveer.com/v1/images/generations"
payload <- list(
model = "gpt-image-1-official",
prompt = "An ancient castle under a starry sky",
size = "1:1",
quality = "auto",
n = 1
)
response <- POST(
url,
add_headers(
Authorization = "Bearer <token>",
`Content-Type` = "application/json"
),
body = toJSON(payload, auto_unbox = TRUE),
encode = "raw"
)
cat(content(response, "text"))Response example
{
"code": 200,
"data": [
{
"status": "submitted",
"task_id": "task_01KXXXXXXXXXXXXXXX"
}
]
}{
"error": {
"code": 400,
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": 401,
"message": "Authentication failed, please check your API key",
"type": "authentication_error"
}
}{
"error": {
"code": 402,
"message": "Insufficient balance, please top up and try again",
"type": "payment_required"
}
}{
"error": {
"code": 403,
"message": "Access forbidden, you do not have permission to access this resource",
"type": "permission_error"
}
}{
"error": {
"code": 429,
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}{
"error": {
"code": 500,
"message": "Internal server error, please try again later",
"type": "server_error"
}
}{
"error": {
"code": 502,
"message": "Bad gateway, server temporarily unavailable",
"type": "bad_gateway"
}
}Supported Models
| Model | Description | Modes | Image-to-Image | Max Images | Billing |
|---|---|---|---|---|---|
gpt-image-1-official |
Stability-first, suitable for general image generation | Text-to-Image / Image-to-Image | Supported | 4 | Size x Quality |
gpt-image-1.5-official |
New version, suitable for higher quality and complex editing | Text-to-Image / Image-to-Image | Supported | 4 | Size x Quality |
Authorizations
Authorization stringAll API requests require Bearer Token authentication
Get your API Key:
Visit the API Key management page to obtain your API Key
Add the following to your request headers:
Authorization: Bearer YOUR_API_KEYBody
model stringModel name
gpt-image-1-official- Stability-first, suitable for general image generationgpt-image-1.5-official- New version, suitable for higher quality and complex editing
nsfw_check booleanWhether to run content moderation before submitting the image task.
true: useomni-moderation-latestto review prompts and input imagesfalseor omitted: do not send a moderation request, adding no moderation cost or latency (default)
prompt stringText description for image generation, supports both Chinese and English
size stringAspect ratio
Supported ratios:
1:1- Square (default)3:2- Landscape2:3- Portrait
n integerNumber of images to generate
Range: 1-4
- Values ≤ 0 will be treated as
1 - Values > 4 will be treated as
4
Warning: Must be a plain number (e.g. 1), do not add quotes, otherwise it will cause an error
quality stringImage quality
auto- Auto quality selection (default)low- Faster, more economicalmedium- Balance between quality and costhigh- Higher quality, higher cost
background stringBackground mode
auto- Auto background (default)opaque- Opaque backgroundtransparent- Transparent background, recommended withpngoutput format
background: transparent cannot be used with output_format: jpeg simultaneously
moderation stringModeration level
auto- Default moderation levellow- More lenient moderation
output_format stringOutput format
png- Default format, suitable for transparent backgroundsjpeg- Smaller file size, suitable for general image output
background: transparent cannot be used with output_format: jpeg simultaneously
output_compression integerOutput compression level, range 0-100
- Recommended only for
jpeg - Not recommended for
png
image_urls arrayArray of reference image URLs, enables image-to-image mode when provided
* 1 image for single reference editing
* 2-15 images for multi-reference fusion editing
* More than 15 images will be rejected
* Must be publicly accessible, stable image URLs
Limit: Up to 15 reference images
mask_url stringMask image URL for inpainting
- Must be used together with
image_urls - Will be submitted via the official editing API
1. Before uploading the mask image, please confirm that the image Alpha channel is "Yes".
2. The mask image size must match the first reference image.
Size Reference
Aspect ratios are used externally; the system automatically maps them to official dimensions internally.
| Ratio | Actual Size | Description |
|---|---|---|
1:1 |
1024x1024 | Square |
2:3 |
1024x1536 | Portrait |
3:2 |
1536x1024 | Landscape |
Usage Examples
Text-to-Image (minimal)
{
"model": "gpt-image-1-official",
"prompt": "An ancient castle under a starry sky"
}Text-to-Image (full parameters)
{
"model": "gpt-image-1-official",
"prompt": "A flat icon of a glass bottle with no background",
"size": "2:3",
"quality": "high",
"background": "transparent",
"moderation": "low",
"output_format": "png",
"n": 1
}Image-to-Image (single reference)
{
"model": "gpt-image-1.5-official",
"prompt": "Convert the reference image to illustration style, preserving the main outline",
"size": "1:1",
"quality": "auto",
"image_urls": [
"https://your-cdn.com/input.png"
],
"n": 1
}Image-to-Image (multi-reference fusion)
{
"model": "gpt-image-1.5-official",
"prompt": "Merge two reference images into an illustration poster, preserving the main outlines",
"size": "1:1",
"quality": "auto",
"background": "transparent",
"image_urls": [
"https://your-cdn.com/input-a.png",
"https://your-cdn.com/input-b.png"
],
"moderation": "low",
"output_format": "png",
"n": 1
}Multiple images (n > 1)
{
"model": "gpt-image-1-official",
"prompt": "Four minimalist poster variations of a red fox",
"size": "1:1",
"quality": "low",
"output_format": "png",
"n": 4
}Response
code integerResponse status code
data arraystatus stringTask status
* submitted - Submitted
task_id stringUnique task identifier
Notes
- Asynchronous processing: After submission, a
task_idis returned. Poll/v1/tasks/{task_id}to get results - Model selection: Use
gpt-image-1-officialfor general image generation; usegpt-image-1.5-officialfor high-quality editing and complex image-to-image tasks - Image URL requirements: For image-to-image, use publicly accessible and stable image URLs
- Billing: Charged per successfully generated image; no charge for failures
This documentation is built and hosted on Mintlify, a developer documentation platform.