curl --request POST \
--url https://api.evolink.ai/v1/images/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "mj-v7-edit",
"prompt": "Magnifique paysage de montagne",
"model_params": {
"task_id": "task-unified-xxx",
"image_number": 0,
"canvas": {
"width": 1024,
"height": 1024
},
"img_pos": {
"width": 512,
"height": 512,
"x": 256,
"y": 256
},
"speed": "fast"
}
}
'import requests
url = "https://api.evolink.ai/v1/images/generations"
payload = {
"model": "mj-v7-edit",
"prompt": "Magnifique paysage de montagne",
"model_params": {
"task_id": "task-unified-xxx",
"image_number": 0,
"canvas": {
"width": 1024,
"height": 1024
},
"img_pos": {
"width": 512,
"height": 512,
"x": 256,
"y": 256
},
"speed": "fast"
}
}
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: 'mj-v7-edit',
prompt: 'Magnifique paysage de montagne',
model_params: {
task_id: 'task-unified-xxx',
image_number: 0,
canvas: {width: 1024, height: 1024},
img_pos: {width: 512, height: 512, x: 256, y: 256},
speed: 'fast'
}
})
};
fetch('https://api.evolink.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://api.evolink.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' => 'mj-v7-edit',
'prompt' => 'Magnifique paysage de montagne',
'model_params' => [
'task_id' => 'task-unified-xxx',
'image_number' => 0,
'canvas' => [
'width' => 1024,
'height' => 1024
],
'img_pos' => [
'width' => 512,
'height' => 512,
'x' => 256,
'y' => 256
],
'speed' => 'fast'
]
]),
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://api.evolink.ai/v1/images/generations"
payload := strings.NewReader("{\n \"model\": \"mj-v7-edit\",\n \"prompt\": \"Magnifique paysage de montagne\",\n \"model_params\": {\n \"task_id\": \"task-unified-xxx\",\n \"image_number\": 0,\n \"canvas\": {\n \"width\": 1024,\n \"height\": 1024\n },\n \"img_pos\": {\n \"width\": 512,\n \"height\": 512,\n \"x\": 256,\n \"y\": 256\n },\n \"speed\": \"fast\"\n }\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://api.evolink.ai/v1/images/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"mj-v7-edit\",\n \"prompt\": \"Magnifique paysage de montagne\",\n \"model_params\": {\n \"task_id\": \"task-unified-xxx\",\n \"image_number\": 0,\n \"canvas\": {\n \"width\": 1024,\n \"height\": 1024\n },\n \"img_pos\": {\n \"width\": 512,\n \"height\": 512,\n \"x\": 256,\n \"y\": 256\n },\n \"speed\": \"fast\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.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\": \"mj-v7-edit\",\n \"prompt\": \"Magnifique paysage de montagne\",\n \"model_params\": {\n \"task_id\": \"task-unified-xxx\",\n \"image_number\": 0,\n \"canvas\": {\n \"width\": 1024,\n \"height\": 1024\n },\n \"img_pos\": {\n \"width\": 512,\n \"height\": 512,\n \"x\": 256,\n \"y\": 256\n },\n \"speed\": \"fast\"\n }\n}"
response = http.request(request)
puts response.read_body{
"created": 1757165031,
"id": "task-unified-1757165031-mjv7",
"model": "<string>",
"object": "image.generation.task",
"progress": 0,
"status": "pending",
"task_info": {
"can_cancel": true,
"estimated_time": 45
},
"type": "image",
"usage": {
"billing_rule": "per_call",
"credits_reserved": 1.8,
"user_group": "default"
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": "insufficient_quota",
"message": "Insufficient quota. Please top up your account.",
"type": "insufficient_quota"
}
}{
"error": {
"code": "model_access_denied",
"message": "Token does not have access to model: mj-v7-edit",
"type": "invalid_request_error"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}{
"error": {
"code": "internal_error",
"message": "Internal server error",
"type": "api_error"
}
}Midjourney V7 Édition de canevas
- Repositionne des images deja generees sur un canevas et remplit les zones vides avec l’IA
- Adapte pour ajuster la composition, etendre les scenes, etc.
- Mode de traitement asynchrone, utilisez l’ID de tache retourne pour effectuer une requete
curl --request POST \
--url https://api.evolink.ai/v1/images/generations \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"model": "mj-v7-edit",
"prompt": "Magnifique paysage de montagne",
"model_params": {
"task_id": "task-unified-xxx",
"image_number": 0,
"canvas": {
"width": 1024,
"height": 1024
},
"img_pos": {
"width": 512,
"height": 512,
"x": 256,
"y": 256
},
"speed": "fast"
}
}
'import requests
url = "https://api.evolink.ai/v1/images/generations"
payload = {
"model": "mj-v7-edit",
"prompt": "Magnifique paysage de montagne",
"model_params": {
"task_id": "task-unified-xxx",
"image_number": 0,
"canvas": {
"width": 1024,
"height": 1024
},
"img_pos": {
"width": 512,
"height": 512,
"x": 256,
"y": 256
},
"speed": "fast"
}
}
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: 'mj-v7-edit',
prompt: 'Magnifique paysage de montagne',
model_params: {
task_id: 'task-unified-xxx',
image_number: 0,
canvas: {width: 1024, height: 1024},
img_pos: {width: 512, height: 512, x: 256, y: 256},
speed: 'fast'
}
})
};
fetch('https://api.evolink.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://api.evolink.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' => 'mj-v7-edit',
'prompt' => 'Magnifique paysage de montagne',
'model_params' => [
'task_id' => 'task-unified-xxx',
'image_number' => 0,
'canvas' => [
'width' => 1024,
'height' => 1024
],
'img_pos' => [
'width' => 512,
'height' => 512,
'x' => 256,
'y' => 256
],
'speed' => 'fast'
]
]),
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://api.evolink.ai/v1/images/generations"
payload := strings.NewReader("{\n \"model\": \"mj-v7-edit\",\n \"prompt\": \"Magnifique paysage de montagne\",\n \"model_params\": {\n \"task_id\": \"task-unified-xxx\",\n \"image_number\": 0,\n \"canvas\": {\n \"width\": 1024,\n \"height\": 1024\n },\n \"img_pos\": {\n \"width\": 512,\n \"height\": 512,\n \"x\": 256,\n \"y\": 256\n },\n \"speed\": \"fast\"\n }\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://api.evolink.ai/v1/images/generations")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"mj-v7-edit\",\n \"prompt\": \"Magnifique paysage de montagne\",\n \"model_params\": {\n \"task_id\": \"task-unified-xxx\",\n \"image_number\": 0,\n \"canvas\": {\n \"width\": 1024,\n \"height\": 1024\n },\n \"img_pos\": {\n \"width\": 512,\n \"height\": 512,\n \"x\": 256,\n \"y\": 256\n },\n \"speed\": \"fast\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.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\": \"mj-v7-edit\",\n \"prompt\": \"Magnifique paysage de montagne\",\n \"model_params\": {\n \"task_id\": \"task-unified-xxx\",\n \"image_number\": 0,\n \"canvas\": {\n \"width\": 1024,\n \"height\": 1024\n },\n \"img_pos\": {\n \"width\": 512,\n \"height\": 512,\n \"x\": 256,\n \"y\": 256\n },\n \"speed\": \"fast\"\n }\n}"
response = http.request(request)
puts response.read_body{
"created": 1757165031,
"id": "task-unified-1757165031-mjv7",
"model": "<string>",
"object": "image.generation.task",
"progress": 0,
"status": "pending",
"task_info": {
"can_cancel": true,
"estimated_time": 45
},
"type": "image",
"usage": {
"billing_rule": "per_call",
"credits_reserved": 1.8,
"user_group": "default"
}
}{
"error": {
"code": "invalid_request",
"message": "Invalid request parameters",
"type": "invalid_request_error"
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid or expired token",
"type": "authentication_error"
}
}{
"error": {
"code": "insufficient_quota",
"message": "Insufficient quota. Please top up your account.",
"type": "insufficient_quota"
}
}{
"error": {
"code": "model_access_denied",
"message": "Token does not have access to model: mj-v7-edit",
"type": "invalid_request_error"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "Too many requests, please try again later",
"type": "rate_limit_error"
}
}{
"error": {
"code": "internal_error",
"message": "Internal server error",
"type": "api_error"
}
}Autorisations
##Toutes les interfaces necessitent une authentification par Bearer Token##
Obtenir une cle API :
Visitez la page de gestion des cles API pour obtenir votre cle API
Ajoutez dans l'en-tete de la requete :
Authorization: Bearer YOUR_API_KEY
Corps
Nom du modèle
mj-v7-edit "mj-v7-edit"
Decrire le contenu de remplissage souhaite
"Magnifique paysage de montagne"
Parametres d'edition de canevas
Show child attributes
Show child attributes
Adresse de rappel HTTPS apres l'achevement de la tache
Moment du rappel :
- Declenche lorsque la tache est terminee (completed), echouee (failed) ou annulee (cancelled)
- Envoye apres la confirmation de facturation
Restrictions de securite :
- Seul le protocole HTTPS est pris en charge
- Les rappels vers les adresses IP privees sont interdits (127.0.0.1, 10.x.x.x, 172.16-31.x.x, 192.168.x.x, etc.)
- La longueur de l'URL ne doit pas depasser
2048caracteres
Mecanisme de rappel :
- Delai d'expiration :
10secondes - Jusqu'a
3tentatives apres un echec (respectivement1s/2s/4s apres l'echec) - Le format du corps de la reponse de rappel est identique a celui de l'interface de requete de tache
- Un code de statut 2xx de l'adresse de rappel est considere comme un succes, tout autre code de statut declenche une nouvelle tentative
"https://your-domain.com/webhooks/image-task-completed"
Réponse
Génération d'imagesTâche créée avec succès
Horodatage de création
1757165031
ID de la tâche
"task-unified-1757165031-mjv7"
Nom du modèle utilisé
Type de tâche
image.generation.task Pourcentage de progression (0-100)
0 <= x <= 1000
Statut de la tâche
pending, processing, completed, failed "pending"
Show child attributes
Show child attributes
text, image, audio, video "image"
Show child attributes
Show child attributes