from magic_hour import Client
from os import getenv
client = Client(token=getenv("API_TOKEN"))
res = client.v1.ai_image_editor.generate(
assets={"image_file_path": "/path/to/1234.png"},
style={"prompt": "Give me sunglasses"},
name="Ai Image Editor image",
wait_for_completion=True,
download_outputs=True,
download_directory="."
)import { Client } from "magic-hour";
const client = new Client({ token: process.env["API_TOKEN"]!! });
const res = await client.v1.aiImageEditor.generate(
{
assets: { imageFilePaths: ["/path/to/1234.png", "/path/to/1235.png"] },
name: "Ai Image Editor image",
style: { prompt: "Give me sunglasses" },
},
{
waitForCompletion: true,
downloadOutputs: true,
downloadDirectory: ".",
},
);package main
import (
os "os"
sdk "github.com/magichourhq/magic-hour-go/client"
nullable "github.com/magichourhq/magic-hour-go/nullable"
ai_image_editor "github.com/magichourhq/magic-hour-go/resources/v1/ai_image_editor"
types "github.com/magichourhq/magic-hour-go/types"
)
func main() {
client := sdk.NewClient(
sdk.WithBearerAuth(os.Getenv("API_TOKEN")),
)
res, err := client.V1.AiImageEditor.Create(ai_image_editor.CreateRequest{
AspectRatio: nullable.NewValue(types.V1AiImageEditorCreateBodyAspectRatioEnum11),
Assets: types.V1AiImageEditorCreateBodyAssets{
ImageFilePaths: nullable.NewValue([]string{
"api-assets/id/1234.png",
"api-assets/id/1235.png",
}),
},
ImageCount: nullable.NewValue(1.0),
Model: nullable.NewValue(types.V1AiImageEditorCreateBodyModelEnumDefault),
Name: nullable.NewValue("My Ai Image Editor image"),
Resolution: nullable.NewValue(types.V1AiImageEditorCreateBodyResolutionEnum1k),
Style: types.V1AiImageEditorCreateBodyStyle{
Prompt: "Give me sunglasses",
},
})
}let client = magic_hour::Client::default()
.with_bearer_auth(&std::env::var("API_TOKEN").unwrap());
let res = client
.v1()
.ai_image_editor()
.create(magic_hour::resources::v1::ai_image_editor::CreateRequest {
aspect_ratio: Some(
magic_hour::models::V1AiImageEditorCreateBodyAspectRatioEnum::Enum11,
),
assets: magic_hour::models::V1AiImageEditorCreateBodyAssets {
image_file_paths: Some(
vec![
"api-assets/id/1234.png".to_string(), "api-assets/id/1235.png"
.to_string()
],
),
..Default::default()
},
image_count: Some(1.0),
model: Some(magic_hour::models::V1AiImageEditorCreateBodyModelEnum::Default),
name: Some("My Ai Image Editor image".to_string()),
resolution: Some(
magic_hour::models::V1AiImageEditorCreateBodyResolutionEnum::Enum1k,
),
style: magic_hour::models::V1AiImageEditorCreateBodyStyle {
prompt: "Give me sunglasses".to_string(),
..Default::default()
},
})
.await;curl --request POST \
--url https://api.magichour.ai/v1/ai-image-editor \
--header 'accept: application/json' \
--header 'authorization: Bearer <token>' \
--header 'content-type: application/json' \
--data '
{
"name": "My Ai Image Editor image",
"image_count": 1,
"model": "default",
"aspect_ratio": "1:1",
"resolution": "1k",
"style": {
"prompt": "Give me sunglasses"
},
"assets": {
"image_file_paths": [
"api-assets/id/1234.png",
"api-assets/id/1235.png"
]
}
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.magichour.ai/v1/ai-image-editor",
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([
'name' => 'My Ai Image Editor image',
'image_count' => 1,
'model' => 'default',
'aspect_ratio' => '1:1',
'resolution' => '1k',
'style' => [
'prompt' => 'Give me sunglasses'
],
'assets' => [
'image_file_paths' => [
'api-assets/id/1234.png',
'api-assets/id/1235.png'
]
]
]),
CURLOPT_HTTPHEADER => [
"accept: application/json",
"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;
}HttpResponse<String> response = Unirest.post("https://api.magichour.ai/v1/ai-image-editor")
.header("accept", "application/json")
.header("content-type", "application/json")
.header("authorization", "Bearer <token>")
.body("{\"name\":\"My Ai Image Editor image\",\"image_count\":1,\"model\":\"default\",\"aspect_ratio\":\"1:1\",\"resolution\":\"1k\",\"style\":{\"prompt\":\"Give me sunglasses\"},\"assets\":{\"image_file_paths\":[\"api-assets/id/1234.png\",\"api-assets/id/1235.png\"]}}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.magichour.ai/v1/ai-image-editor")
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 \"style\": {\n \"prompt\": \"Give me sunglasses\"\n },\n \"assets\": {\n \"image_file_paths\": [\n \"api-assets/id/1234.png\",\n \"api-assets/id/1235.png\"\n ]\n },\n \"name\": \"My Ai Image Editor image\",\n \"image_count\": 1,\n \"model\": \"default\",\n \"aspect_ratio\": \"1:1\",\n \"resolution\": \"1k\"\n}"
response = http.request(request)
puts response.read_body{
"id": "cuid-example",
"credits_charged": 50
}{
"code": "invalid_request",
"message": "<string>"
}{
"code": "unauthorized",
"message": "<string>"
}{
"code": "insufficient_credits",
"message": "<string>"
}{
"code": "not_found",
"message": "<string>"
}{
"code": "unprocessable_entity",
"message": "<string>"
}{
"code": "internal_server_error",
"message": "<string>"
}AI Image Editor
Edit images with AI.
from magic_hour import Client
from os import getenv
client = Client(token=getenv("API_TOKEN"))
res = client.v1.ai_image_editor.generate(
assets={"image_file_path": "/path/to/1234.png"},
style={"prompt": "Give me sunglasses"},
name="Ai Image Editor image",
wait_for_completion=True,
download_outputs=True,
download_directory="."
)import { Client } from "magic-hour";
const client = new Client({ token: process.env["API_TOKEN"]!! });
const res = await client.v1.aiImageEditor.generate(
{
assets: { imageFilePaths: ["/path/to/1234.png", "/path/to/1235.png"] },
name: "Ai Image Editor image",
style: { prompt: "Give me sunglasses" },
},
{
waitForCompletion: true,
downloadOutputs: true,
downloadDirectory: ".",
},
);package main
import (
os "os"
sdk "github.com/magichourhq/magic-hour-go/client"
nullable "github.com/magichourhq/magic-hour-go/nullable"
ai_image_editor "github.com/magichourhq/magic-hour-go/resources/v1/ai_image_editor"
types "github.com/magichourhq/magic-hour-go/types"
)
func main() {
client := sdk.NewClient(
sdk.WithBearerAuth(os.Getenv("API_TOKEN")),
)
res, err := client.V1.AiImageEditor.Create(ai_image_editor.CreateRequest{
AspectRatio: nullable.NewValue(types.V1AiImageEditorCreateBodyAspectRatioEnum11),
Assets: types.V1AiImageEditorCreateBodyAssets{
ImageFilePaths: nullable.NewValue([]string{
"api-assets/id/1234.png",
"api-assets/id/1235.png",
}),
},
ImageCount: nullable.NewValue(1.0),
Model: nullable.NewValue(types.V1AiImageEditorCreateBodyModelEnumDefault),
Name: nullable.NewValue("My Ai Image Editor image"),
Resolution: nullable.NewValue(types.V1AiImageEditorCreateBodyResolutionEnum1k),
Style: types.V1AiImageEditorCreateBodyStyle{
Prompt: "Give me sunglasses",
},
})
}let client = magic_hour::Client::default()
.with_bearer_auth(&std::env::var("API_TOKEN").unwrap());
let res = client
.v1()
.ai_image_editor()
.create(magic_hour::resources::v1::ai_image_editor::CreateRequest {
aspect_ratio: Some(
magic_hour::models::V1AiImageEditorCreateBodyAspectRatioEnum::Enum11,
),
assets: magic_hour::models::V1AiImageEditorCreateBodyAssets {
image_file_paths: Some(
vec![
"api-assets/id/1234.png".to_string(), "api-assets/id/1235.png"
.to_string()
],
),
..Default::default()
},
image_count: Some(1.0),
model: Some(magic_hour::models::V1AiImageEditorCreateBodyModelEnum::Default),
name: Some("My Ai Image Editor image".to_string()),
resolution: Some(
magic_hour::models::V1AiImageEditorCreateBodyResolutionEnum::Enum1k,
),
style: magic_hour::models::V1AiImageEditorCreateBodyStyle {
prompt: "Give me sunglasses".to_string(),
..Default::default()
},
})
.await;curl --request POST \
--url https://api.magichour.ai/v1/ai-image-editor \
--header 'accept: application/json' \
--header 'authorization: Bearer <token>' \
--header 'content-type: application/json' \
--data '
{
"name": "My Ai Image Editor image",
"image_count": 1,
"model": "default",
"aspect_ratio": "1:1",
"resolution": "1k",
"style": {
"prompt": "Give me sunglasses"
},
"assets": {
"image_file_paths": [
"api-assets/id/1234.png",
"api-assets/id/1235.png"
]
}
}
'<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.magichour.ai/v1/ai-image-editor",
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([
'name' => 'My Ai Image Editor image',
'image_count' => 1,
'model' => 'default',
'aspect_ratio' => '1:1',
'resolution' => '1k',
'style' => [
'prompt' => 'Give me sunglasses'
],
'assets' => [
'image_file_paths' => [
'api-assets/id/1234.png',
'api-assets/id/1235.png'
]
]
]),
CURLOPT_HTTPHEADER => [
"accept: application/json",
"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;
}HttpResponse<String> response = Unirest.post("https://api.magichour.ai/v1/ai-image-editor")
.header("accept", "application/json")
.header("content-type", "application/json")
.header("authorization", "Bearer <token>")
.body("{\"name\":\"My Ai Image Editor image\",\"image_count\":1,\"model\":\"default\",\"aspect_ratio\":\"1:1\",\"resolution\":\"1k\",\"style\":{\"prompt\":\"Give me sunglasses\"},\"assets\":{\"image_file_paths\":[\"api-assets/id/1234.png\",\"api-assets/id/1235.png\"]}}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.magichour.ai/v1/ai-image-editor")
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 \"style\": {\n \"prompt\": \"Give me sunglasses\"\n },\n \"assets\": {\n \"image_file_paths\": [\n \"api-assets/id/1234.png\",\n \"api-assets/id/1235.png\"\n ]\n },\n \"name\": \"My Ai Image Editor image\",\n \"image_count\": 1,\n \"model\": \"default\",\n \"aspect_ratio\": \"1:1\",\n \"resolution\": \"1k\"\n}"
response = http.request(request)
puts response.read_body{
"id": "cuid-example",
"credits_charged": 50
}{
"code": "invalid_request",
"message": "<string>"
}{
"code": "unauthorized",
"message": "<string>"
}{
"code": "insufficient_credits",
"message": "<string>"
}{
"code": "not_found",
"message": "<string>"
}{
"code": "unprocessable_entity",
"message": "<string>"
}{
"code": "internal_server_error",
"message": "<string>"
}Authorizations
Bearer authentication header of the form Bearer <api_key>, where <api_key> is your API key. To get your API key, go to Developer Hub and click "Create new API Key".
Body
Body
Show child attributes
Show child attributes
Provide the assets for image edit
Show child attributes
Show child attributes
Give your image a custom name for easy identification.
"My Ai Image Editor image"
Number of images to generate. Maximum varies by model. Defaults to 1 if not specified.
1, 4, 9, 16 1
The AI model to use for image editing. Each model has different capabilities and costs.
Models:
default- Use the model we recommend, which will change over time. This is recommended unless you need a specific model. This is the default behavior.flux-2-klein- from 5 credits/image- Supported resolutions: 640px, 1k, 2k
- Available for tiers: free, creator, pro, business
- Max additional input images: 5
gpt-image-2- from 50 credits/image- Supported resolutions: 640px, 1k, 2k, 4k
- Available for tiers: creator, pro, business
- Max additional input images: 9
nano-banana- from 50 credits/image- Supported resolutions: 640px, 1k
- Available for tiers: creator, pro, business
- Max additional input images: 9
nano-banana-2- from 100 credits/image- Supported resolutions: 640px, 1k, 2k, 4k
- Available for tiers: creator, pro, business
- Max additional input images: 9
nano-banana-2-lite- from 50 credits/image- Supported resolutions: 640px, 1k
- Available for tiers: creator, pro, business
- Max additional input images: 9
nano-banana-pro- from 150 credits/image- Supported resolutions: 1k, 2k, 4k
- Available for tiers: creator, pro, business
- Max additional input images: 9
qwen-edit- from 10 credits/image- Supported resolutions: 640px, 1k, 2k
- Available for tiers: free, creator, pro, business
- Max additional input images: 2
seedream-v4- from 40 credits/image- Supported resolutions: 640px, 1k, 2k, 4k
- Available for tiers: creator, pro, business
- Max additional input images: 9
seedream-v4.5- from 50 credits/image- Supported resolutions: 640px, 1k, 2k, 4k
- Available for tiers: creator, pro, business
- Max additional input images: 9
seedream-v5-pro- from 75 credits/image- Supported resolutions: 640px, 1k, 2k
- Available for tiers: creator, pro, business
- Max additional input images: 9
default, nano-banana-2, gpt-image-2, flux-2-klein, nano-banana-2-lite, qwen-edit, seedream-v4, seedream-v4.5, seedream-v5-pro, nano-banana, nano-banana-pro "default"
The aspect ratio of the output image(s). If not specified, defaults to auto.
auto, 16:9, 9:16, 4:3, 3:2, 1:1, 4:5, 2:3 "1:1"
Maximum resolution (longest edge) for the output image.
Options:
640px— up to 640px1k— up to 1024px2k— up to 2048px4k— up to 4096pxauto— Deprecated. Mapped server-side from your subscription tier to the best matching resolution the model supports
Per-model support:
flux-2-klein- 640px, 1k, 2kgpt-image-2- 640px, 1k, 2k, 4knano-banana- 640px, 1knano-banana-2- 640px, 1k, 2k, 4knano-banana-2-lite- 640px, 1knano-banana-pro- 1k, 2k, 4kqwen-edit- 640px, 1k, 2kseedream-v4- 640px, 1k, 2k, 4kseedream-v4.5- 640px, 1k, 2k, 4kseedream-v5-pro- 640px, 1k, 2k
Note: Resolution availability depends on the model and your subscription tier.
auto, 640px, 1k, 2k, 4k "1k"
Response
Success
Success
Unique ID of the image. Use it with the Get image Project API to fetch status and downloads.
"cuid-example"
The amount of credits deducted from your account to generate the image. We charge credits right when the request is made.
If an error occurred while generating the image(s), credits will be refunded and this field will be updated to include the refund.
50
Was this page helpful?