import Foundationlet url = URL(string: "https://api.apimart.ai/v1/images/generations")!let payload: [String: Any] = [ "model": "seedream-5-0-flash", "prompt": "Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах", "size": "16:9", "resolution": "2K"]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.apimart.ai/v1/images/generations"; var payload = @"{ ""model"": ""seedream-5-0-flash"", ""prompt"": ""Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах"", ""size"": ""16:9"", ""resolution"": ""2K"" }"; 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); }}
(* Requires cohttp and yojson libraries *)open Lwtopen Cohttpopen Cohttp_lwt_unixlet url = "https://api.apimart.ai/v1/images/generations"let payload = {|{ "model": "seedream-5-0-flash", "prompt": "Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах", "size": "16:9", "resolution": "2K"}|}let () = let headers = Header.init () |> fun h -> Header.add h "Authorization" "Bearer <token>" |> fun h -> Header.add h "Content-Type" "application/json" in let body = Cohttp_lwt.Body.of_string payload in let response = Client.post ~headers ~body (Uri.of_string url) >>= fun (resp, body) -> body |> Cohttp_lwt.Body.to_string >|= fun body_str -> print_endline body_str in Lwt_main.run response
import 'dart:convert';import 'package:http/http.dart' as http;void main() async { final url = Uri.parse('https://api.apimart.ai/v1/images/generations'); final payload = { 'model': 'seedream-5-0-flash', 'prompt': 'Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах', 'size': '16:9', 'resolution': '2K' }; 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.apimart.ai/v1/images/generations"payload <- list( model = "seedream-5-0-flash", prompt = "Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах", size = "16:9", resolution = "2K")response <- POST( url, add_headers( Authorization = "Bearer <token>", `Content-Type` = "application/json" ), body = toJSON(payload, auto_unbox = TRUE), encode = "raw")cat(content(response, "text"))
import Foundationlet url = URL(string: "https://api.apimart.ai/v1/images/generations")!let payload: [String: Any] = [ "model": "seedream-5-0-flash", "prompt": "Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах", "size": "16:9", "resolution": "2K"]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.apimart.ai/v1/images/generations"; var payload = @"{ ""model"": ""seedream-5-0-flash"", ""prompt"": ""Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах"", ""size"": ""16:9"", ""resolution"": ""2K"" }"; 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); }}
(* Requires cohttp and yojson libraries *)open Lwtopen Cohttpopen Cohttp_lwt_unixlet url = "https://api.apimart.ai/v1/images/generations"let payload = {|{ "model": "seedream-5-0-flash", "prompt": "Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах", "size": "16:9", "resolution": "2K"}|}let () = let headers = Header.init () |> fun h -> Header.add h "Authorization" "Bearer <token>" |> fun h -> Header.add h "Content-Type" "application/json" in let body = Cohttp_lwt.Body.of_string payload in let response = Client.post ~headers ~body (Uri.of_string url) >>= fun (resp, body) -> body |> Cohttp_lwt.Body.to_string >|= fun body_str -> print_endline body_str in Lwt_main.run response
import 'dart:convert';import 'package:http/http.dart' as http;void main() async { final url = Uri.parse('https://api.apimart.ai/v1/images/generations'); final payload = { 'model': 'seedream-5-0-flash', 'prompt': 'Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах', 'size': '16:9', 'resolution': '2K' }; 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.apimart.ai/v1/images/generations"payload <- list( model = "seedream-5-0-flash", prompt = "Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах", size = "16:9", resolution = "2K")response <- POST( url, add_headers( Authorization = "Bearer <token>", `Content-Type` = "application/json" ), body = toJSON(payload, auto_unbox = TRUE), encode = "raw")cat(content(response, "text"))
import Foundationlet url = URL(string: "https://api.apimart.ai/v1/images/generations")!let payload: [String: Any] = [ "model": "seedream-5-0-flash", "prompt": "Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах", "size": "16:9", "resolution": "2K"]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.apimart.ai/v1/images/generations"; var payload = @"{ ""model"": ""seedream-5-0-flash"", ""prompt"": ""Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах"", ""size"": ""16:9"", ""resolution"": ""2K"" }"; 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); }}
(* Requires cohttp and yojson libraries *)open Lwtopen Cohttpopen Cohttp_lwt_unixlet url = "https://api.apimart.ai/v1/images/generations"let payload = {|{ "model": "seedream-5-0-flash", "prompt": "Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах", "size": "16:9", "resolution": "2K"}|}let () = let headers = Header.init () |> fun h -> Header.add h "Authorization" "Bearer <token>" |> fun h -> Header.add h "Content-Type" "application/json" in let body = Cohttp_lwt.Body.of_string payload in let response = Client.post ~headers ~body (Uri.of_string url) >>= fun (resp, body) -> body |> Cohttp_lwt.Body.to_string >|= fun body_str -> print_endline body_str in Lwt_main.run response
import 'dart:convert';import 'package:http/http.dart' as http;void main() async { final url = Uri.parse('https://api.apimart.ai/v1/images/generations'); final payload = { 'model': 'seedream-5-0-flash', 'prompt': 'Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах', 'size': '16:9', 'resolution': '2K' }; 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.apimart.ai/v1/images/generations"payload <- list( model = "seedream-5-0-flash", prompt = "Городской ночной пейзаж в стиле киберпанк, неоновые огни отражаются на мокрых улицах", size = "16:9", resolution = "2K")response <- POST( url, add_headers( Authorization = "Bearer <token>", `Content-Type` = "application/json" ), body = toJSON(payload, auto_unbox = TRUE), encode = "raw")cat(content(response, "text"))
Все конечные точки API требуют аутентификации Bearer TokenПолучите свой API Key:Перейдите на страницу управления API ключами, чтобы получить свой API KeyДобавьте его в заголовок запроса:
Authorization: Bearer YOUR_API_KEY
Модель одиночных изображений: seedream-5-0-flash создаёт только 1 изображение за запрос (кроме декомпозиции на слои). Следующие параметры отклоняются (HTTP 400, задача не создаётся, оплата не списывается):
n > 1
sequential_image_generation (групповая генерация не поддерживается)
stream (потоковая передача не поддерживается)
tools (веб-поиск не поддерживается)
более 10 элементов в image_urls
Интерактивное редактирование
Используйте координаты <point> / <bbox> в промпте или загрузите изображение с рукописными пометками, чтобы точно указать область редактирования.
Координаты точки: <point>x y</point> (задают одну точку; модель определяет область воздействия)
Координаты ограничивающей рамки: <bbox>x1 y1 x2 y2</bbox> (задают координаты левого верхнего и правого нижнего углов для точного управления размером области редактирования)
Декомпозиция на слои
Разделите одно изображение на базовое изображение и до 16 прозрачных PNG-слоёв с данными о позиции и порядке наложения.
Текстовое описание для генерации изображенияНеобязателен при layer_decomposition: true; если опущен, модель автоматически определит и разделит основные элементы изображения.Помимо китайского и английского, нативная генерация текста поддерживает русский, арабский, филиппинский, тайский, турецкий, корейский, малайский, испанский, португальский, индонезийский, французский, немецкий, вьетнамский и японский языки.
Совет: не более 600 английских слов; слишком длинное описание может привести к потере деталей.
Уровень можно указать непосредственно в size или через поле расширения API Mart resolution:
{ "size": "2K" }
{ "resolution": "2K" }
Эти форматы эквивалентны. Если задан только уровень, опишите желаемую компоновку в промпте (например, “вертикальный плакат” или “горизонтальная обложка”) и позвольте модели выбрать соотношение сторон.
transparent доступен только для запросов image-to-image с ровно одним входным изображением, уже содержащим альфа-канал; также требуется output_format: "png".
Указывает, нужно ли разложить изображение на слои. При включении модель возвращает одно базовое изображение и до 16 PNG-слоёв с альфа-каналами.Требуется ровно одно изображение PNG или JPEG. Оно должно содержать от [262144, 36000000] пикселей и иметь размер не более 30 МБ. size принимает только 1K, 1.5K, 2K или auto; по умолчанию — auto. output_format управляет только форматом базового изображения; слои всегда возвращаются в PNG.
Также можно использовать координаты <bbox>, нормализованные к 0–1000, чтобы точно указать извлекаемые элементы:
{ "model": "seedream-5-0-flash", "prompt": "Точно раздели изображение на слои. Текст находится в <bbox>180 64 812 198</bbox>; попугай — в <bbox>347 305 642 997</bbox>.", "image_urls": ["https://example.com/poster.png"], "layer_decomposition": true}
Опишите рукописные пометки на изображении естественным языком:
{ "model": "seedream-5-0-flash", "prompt": "Отредактируй изображение по эскизу. Добавь стопку журналов в отмеченной области слева внизу и чашку кофе в отмеченной области справа. Удали все линии эскиза и сохрани композицию.", "image_urls": ["https://example.com/sketch.png"], "size": "2K", "output_format": "png"}
Или точно укажите позиции через <point> / <bbox>:
{ "model": "seedream-5-0-flash", "prompt": "Помести объект из изображения 1 в <bbox>179 283 796 986</bbox> на изображение 2 в позицию <bbox>118 331 933 871</bbox>.", "image_urls": [ "https://example.com/a.png", "https://example.com/b.png" ]}
Полный пример: отправка задачи и получение изображения
Скрипт ниже показывает полный цикл: отправку асинхронной задачи, опрос её статуса, обработку ошибок и чтение итогового URL изображения. Перед запуском замените YOUR_API_KEY.
Python
import timeimport requestsAPI_KEY = "YOUR_API_KEY"BASE_URL = "https://api.apimart.ai"headers = { "Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json",}# 1. Отправка задачи генерацииcreate_response = requests.post( f"{BASE_URL}/v1/images/generations", headers=headers, json={ "model": "seedream-5-0-flash", "prompt": "Водный город Цзяннань в стиле тушевой живописи, лёгкий утренний туман", "resolution": "1.5K", "size": "16:9", "output_format": "png", }, timeout=30,)create_response.raise_for_status()task_id = create_response.json()["data"][0]["task_id"]print(f"Задача отправлена: {task_id}")# 2. Опрос статуса задачиwhile True: task_response = requests.get( f"{BASE_URL}/v1/tasks/{task_id}", headers=headers, timeout=30, ) task_response.raise_for_status() task = task_response.json() status = task["status"] print(f"Статус: {status}; прогресс: {task.get('progress', 0)}%") if status == "success": image = task["result"]["images"][0] print("URL изображения:", image["url"][0]) print("Размер изображения:", image["sizes"][0]) print("Формат изображения:", image["output_formats"][0]) break if status in {"failed", "cancelled"}: raise RuntimeError(task.get("error", f"Задача {status}")) time.sleep(5)
Возвращаемые изображения зеркалируются в хранилище под управлением платформы. Всё равно своевременно скачайте и сохраните их в своей системе; не считайте URL результата постоянным хранилищем.
Накладывайте слои в порядке возрастания z_index. Для реконструкции на базовом выходном изображении по абсолютным координатам:
x = lefty = topw = right - lefth = bottom - top
Для реконструкции на любом холсте W × H используйте нормализованные координаты:
x = left / 1000 × Wy = top / 1000 × Hw = (right - left) / 1000 × Wh = (bottom - top) / 1000 × H
Декомпозиция на слои оплачивается за каждое изображение. При отправке задачи предавторизуется до 17 изображений. После завершения каждому выходу назначается уровень по фактическому числу пикселей и он оплачивается отдельно; излишек предавторизации возвращается автоматически. Баланс должен покрывать предавторизацию 17 изображений, а size: "auto" предавторизуется на уровне 2K.
Поскольку при отправке задачи конечное число и размеры слоёв неизвестны, предавторизация использует консервативные правила по параметрам запроса:
Точные пиксели: уровень по запрошенной площади в пикселях.
1K / 1.5K: предавторизация на уровне 1K.
2K: предавторизация на уровне 2K.
auto: может выводить до 2K, поэтому предавторизуется на уровне 2K.
После завершения базовое изображение и каждый фактический слой отдельно классифицируются и суммируются по реальной площади в пикселях. Излишек предавторизации возвращается автоматически. Слои обычно намного меньше базового изображения, поэтому даже задача, предавторизованная на уровне 2K, может полностью рассчитаться на уровне 1K.
Пример: вход 1080×1080 разлагается на 10 изображений. Задача предавторизуется как 17 изображений × уровень 2K. Если все 10 итоговых изображений содержат не более 2,61 млн пикселей, расчёт идёт как 10 изображений × уровень 1K, а остаток средств возвращается автоматически.
Не 1K / 1.5K / 2K / auto, не поддерживаемое соотношение сторон и не допустимые размеры в пикселях → 400
Сумма точных пикселей вне диапазона
Должно быть в [921600, 4624220]
Соотношение точных пикселей вне диапазона
Должно быть в [1/16, 16]
n > 1 / параметры групповых изображений
Отклоняется моделью одиночных изображений
Более 10 референсных изображений
Rejected
Декомпозиция без изображения или с несколькими изображениями
Требуется ровно одно изображение
Декомпозиция с соотношением сторон или точными пикселями
size поддерживает только 1K / 1.5K / 2K / auto
Прозрачный фон для text-to-image или нескольких входов
Требуется ровно одно входное изображение с альфа-каналом
Прозрачный фон с JPEG
Установите output_format: "png"
stream / tools
Не поддерживается этой моделью; возвращает 400
Недопустимый режим оптимизации промпта
Поддерживается только standard
⏱️ Более медленная генерация: около 90 с для 1K и 160 с для 2K (приоритет качества). Опрашивайте статус задачи каждые 5–10 секунд и установите тайм-аут клиента на 5 минут. Своевременно сохраняйте созданные результаты.