import Foundationlet url = URL(string: "https://api.apimart.ai/v1/images/generations")!let payload: [String: Any] = [ "model": "seedream-5-0-pro", "prompt": "Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah", "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-pro"", ""prompt"": ""Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah"", ""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-pro", "prompt": "Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah", "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-pro', 'prompt': 'Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah', '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-pro", prompt = "Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah", 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-pro", "prompt": "Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah", "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-pro"", ""prompt"": ""Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah"", ""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-pro", "prompt": "Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah", "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-pro', 'prompt': 'Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah', '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-pro", prompt = "Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah", 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-pro", "prompt": "Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah", "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-pro"", ""prompt"": ""Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah"", ""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-pro", "prompt": "Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah", "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-pro', 'prompt': 'Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah', '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-pro", prompt = "Pemandangan malam kota bergaya cyberpunk, lampu neon memantul di jalanan yang basah", 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"))
Semua endpoint API memerlukan autentikasi Bearer TokenDapatkan API Key Anda:Kunjungi Halaman Manajemen API Key untuk mendapatkan API Key AndaTambahkan ke header permintaan:
Authorization: Bearer YOUR_API_KEY
Model gambar tunggal: seedream-5-0-pro hanya menghasilkan 1 gambar per permintaan (kecuali dekomposisi layer). Parameter berikut ditolak (HTTP 400, tanpa tugas, tanpa biaya):
n > 1
sequential_image_generation (pembuatan grup tidak didukung)
stream (streaming tidak didukung)
tools (pencarian web tidak didukung)
lebih dari 10 item di image_urls
Pengeditan interaktif
Gunakan koordinat <point> / <bbox> dalam prompt, atau unggah gambar dengan anotasi gambar tangan, untuk menentukan lokasi pengeditan secara presisi.
Koordinat titik: <point>x y</point> (menentukan satu titik; model menentukan area yang terpengaruh)
Koordinat kotak pembatas: <bbox>x1 y1 x2 y2</bbox> (menentukan koordinat kiri atas dan kanan bawah untuk mengontrol ukuran area pengeditan secara presisi)
Dekomposisi layer
Pisahkan satu gambar menjadi gambar dasar dan hingga 16 layer PNG transparan, lengkap dengan informasi posisi dan urutan tumpukan.
Deskripsi teks untuk pembuatan gambarOpsional ketika layer_decomposition: true; jika dihilangkan, model otomatis mengenali dan memisahkan elemen utama dalam gambar.Selain bahasa Mandarin dan Inggris, pembuatan teks native mendukung bahasa Rusia, Arab, Filipina, Thai, Turki, Korea, Melayu, Spanyol, Portugis, Indonesia, Prancis, Jerman, Vietnam, dan Jepang.
Tips: batasi hingga 600 kata bahasa Inggris; deskripsi terlalu panjang dapat kehilangan detail.
Tingkat dapat dituliskan langsung di size, atau diberikan melalui kolom ekstensi API Mart resolution:
{ "size": "2K" }
{ "resolution": "2K" }
Kedua format ini setara. Jika hanya tingkat yang ditentukan, jelaskan tata letak yang diinginkan dalam prompt (misalnya, “poster potret” atau “sampul lanskap”) dan biarkan model memilih rasio aspek.
transparent hanya tersedia untuk permintaan gambar-ke-gambar dengan tepat satu gambar input yang sudah memiliki kanal alfa; output_format: "png" juga wajib.
Menentukan apakah gambar akan didekomposisi menjadi layer. Jika diaktifkan, model mengembalikan satu gambar dasar dan hingga 16 layer PNG dengan kanal alfa.Diperlukan tepat satu gambar PNG atau JPEG. Jumlah pikselnya harus berada dalam [262144, 36000000] dan ukurannya tidak boleh lebih dari 30 MB. size hanya menerima 1K, 1.5K, 2K, atau auto, dengan default auto. output_format hanya mengontrol format gambar dasar; layer hasil dekomposisi selalu PNG.
{ "model": "seedream-5-0-pro", "prompt": "Pemandangan malam kota cyberpunk, pantulan neon di jalan basah", "resolution": "2K", "size": "2:1", "output_format": "png"}
{ "model": "seedream-5-0-pro", "prompt": "Ganti pakaian di gambar 1 dengan pakaian di gambar 2", "image_urls": [ "https://example.com/person.jpg", "https://example.com/dress.jpg" ], "resolution": "2K", "size": "auto"}
Anda juga dapat menggunakan koordinat <bbox> yang dinormalisasi ke 0–1000 untuk menentukan elemen yang akan diekstrak secara presisi:
{ "model": "seedream-5-0-pro", "prompt": "Pisahkan gambar menjadi layer yang presisi. Teks berada di <bbox>180 64 812 198</bbox>; burung beo berada di <bbox>347 305 642 997</bbox>.", "image_urls": ["https://example.com/poster.png"], "layer_decomposition": true}
Jelaskan anotasi gambar tangan pada gambar menggunakan bahasa alami:
{ "model": "seedream-5-0-pro", "prompt": "Edit gambar sesuai sketsa. Tambahkan setumpuk majalah di area bertanda di kiri bawah dan secangkir kopi di area bertanda di sebelah kanan. Hapus semua garis sketsa dan pertahankan komposisinya.", "image_urls": ["https://example.com/sketch.png"], "size": "2K", "output_format": "png"}
Atau tentukan lokasi dengan tepat menggunakan <point> / <bbox>:
{ "model": "seedream-5-0-pro", "prompt": "Tempatkan subjek dari gambar 1 di <bbox>179 283 796 986</bbox> ke gambar 2 pada posisi <bbox>118 331 933 871</bbox>.", "image_urls": [ "https://example.com/a.png", "https://example.com/b.png" ]}
Skrip berikut menunjukkan alur lengkap: mengirim tugas asinkron, memeriksa statusnya, menangani status kegagalan, dan membaca URL gambar akhir. Ganti YOUR_API_KEY sebelum menjalankannya.
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. Kirim tugas pembuatancreate_response = requests.post( f"{BASE_URL}/v1/images/generations", headers=headers, json={ "model": "seedream-5-0-pro", "prompt": "Kota air Jiangnan bergaya lukisan tinta dengan kabut tipis di pagi hari", "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"Tugas dikirim: {task_id}")# 2. Periksa status tugaswhile 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: {status}; progres: {task.get('progress', 0)}%") if status == "success": image = task["result"]["images"][0] print("URL gambar:", image["url"][0]) print("Ukuran gambar:", image["sizes"][0]) print("Format gambar:", image["output_formats"][0]) break if status in {"failed", "cancelled"}: raise RuntimeError(task.get("error", f"Tugas {status}")) time.sleep(5)
Jika berhasil, endpoint kueri tugas mengembalikan:
Gambar yang dikembalikan disalin ke penyimpanan yang dikelola platform. Anda tetap harus segera mengunduh dan menyimpannya secara permanen di sistem sendiri; jangan menganggap URL hasil sebagai penyimpanan permanen.
Array url, sizes, output_formats, dan layers saling bersesuaian berdasarkan indeks; indeks 0 selalu merupakan gambar dasar:
{ "result": { "images": [{ "url": [ "https://cdn.example.com/images/image_task_xxx_0.jpeg", "https://cdn.example.com/images/image_task_xxx_1.png", "https://cdn.example.com/images/image_task_xxx_2.png" ], "sizes": ["2048x2048", "1273x265", "492x98"], "output_formats": ["jpeg", "png", "png"], "layer_decomposition": true, "layers": [ { "z_index": 0, "size": "2048x2048", "output_format": "jpeg" }, { "z_index": 1, "size": "1273x265", "output_format": "png", "name": "Teks judul", "description": "Teks judul kuning besar dengan jenis huruf serif", "bounding_box": { "absolute": [383, 120, 1655, 384], "normalized": [187, 59, 808, 188] } }, { "z_index": 2, "size": "492x98", "output_format": "png", "name": "Tagline kiri atas", "description": "Tagline bahasa Inggris dua baris berwarna putih", "bounding_box": { "absolute": [140, 451, 631, 548], "normalized": [68, 220, 308, 268] } } ] }] }}
Gabungkan layer dalam urutan z_index menaik. Untuk merekonstruksinya pada gambar dasar keluaran dengan koordinat absolut:
x = lefty = topw = right - lefth = bottom - top
Untuk merekonstruksinya pada kanvas W × H apa pun, gunakan koordinat yang dinormalisasi:
x = left / 1000 × Wy = top / 1000 × Hw = (right - left) / 1000 × Wh = (bottom - top) / 1000 × H
Dekomposisi layer ditagih per gambar. Hingga 17 gambar dipraotorisasi saat tugas dikirim. Setelah selesai, setiap keluaran diberi tingkat berdasarkan jumlah piksel aktual dan diselesaikan secara terpisah; kelebihan praotorisasi dikembalikan otomatis. Saldo Anda harus cukup untuk praotorisasi 17 gambar, dan size: "auto" dipraotorisasi pada tingkat 2K.
Karena jumlah dan dimensi akhir layer belum diketahui saat tugas dikirim, praotorisasi menggunakan aturan konservatif berdasarkan permintaan:
Piksel tepat: tingkat ditentukan berdasarkan area piksel yang diminta.
1K / 1.5K: dipraotorisasi pada tingkat 1K.
2K: dipraotorisasi pada tingkat 2K.
auto: dapat menghasilkan hingga 2K, sehingga dipraotorisasi pada tingkat 2K.
Setelah selesai, gambar dasar dan setiap layer aktual ditentukan tingkatnya dan dijumlahkan satu per satu berdasarkan area piksel sebenarnya. Kelebihan praotorisasi dikembalikan otomatis. Layer biasanya jauh lebih kecil daripada gambar dasar, sehingga tugas yang dipraotorisasi pada tingkat 2K pun dapat diselesaikan sepenuhnya pada tingkat 1K.
Contoh: input 1080×1080 didekomposisi menjadi 10 gambar. Tugas dipraotorisasi sebagai 17 gambar × tingkat 2K. Jika kesepuluh gambar akhir tidak melebihi 2,61 juta piksel, penyelesaian menggunakan 10 gambar × tingkat 1K dan sisa kredit dikembalikan otomatis.
Bukan 1K / 1.5K / 2K / auto, rasio aspek yang didukung, maupun dimensi piksel yang valid → 400
Total piksel tepat di luar rentang
Harus dalam [921600, 4624220]
Rasio piksel tepat di luar rentang
Harus dalam [1/16, 16]
n > 1 / parameter gambar berkelompok
Ditolak oleh model gambar tunggal
Lebih dari 10 gambar referensi
Rejected
Dekomposisi layer tanpa gambar atau dengan beberapa gambar
Diperlukan tepat satu gambar
Dekomposisi layer dengan rasio atau piksel tepat
size hanya mendukung 1K / 1.5K / 2K / auto
Latar transparan untuk teks-ke-gambar atau beberapa input
Diperlukan tepat satu gambar input dengan kanal alfa
Latar transparan dengan JPEG
Atur output_format: "png"
stream / tools
Tidak didukung oleh model ini; mengembalikan 400
Mode pengoptimalan prompt tidak valid
Hanya standard yang didukung
⏱️ Pembuatan lebih lambat: sekitar 90 detik untuk 1K dan 160 detik untuk 2K (mengutamakan kualitas). Periksa Status Tugas setiap 5–10 detik dan atur batas waktu klien menjadi 5 menit. Segera simpan hasil yang dibuat.