Passer au contenu principal
POST
/
v1
/
videos
/
generations
curl --request POST \
  --url https://api.apimart.ai/v1/videos/generations \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "wan2.7-r2v",
    "prompt": "This person walks down the street surrounded by heavy traffic",
    "image_with_roles": [{"url": "https://cdn.example.com/character.jpg", "role": "reference_image"}],
    "resolution": "1080P",
    "duration": 8
  }'
import requests

url = "https://api.apimart.ai/v1/videos/generations"

payload = {
    "model": "wan2.7-r2v",
    "prompt": "This person walks down the street surrounded by heavy traffic",
    "image_with_roles": [{"url": "https://cdn.example.com/character.jpg", "role": "reference_image"}],
    "resolution": "1080P",
    "duration": 8
}

headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";

const payload = {
  model: "wan2.7-r2v",
  prompt: "This person walks down the street surrounded by heavy traffic",
  image_with_roles: [{ url: "https://cdn.example.com/character.jpg", role: "reference_image" }],
  resolution: "1080P",
  duration: 8
};

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.apimart.ai/v1/videos/generations"

    payload := map[string]interface{}{
        "model":  "wan2.7-r2v",
        "prompt": "This person walks down the street surrounded by heavy traffic",
        "image_with_roles": []map[string]string{
            {"url": "https://cdn.example.com/character.jpg", "role": "reference_image"},
        },
        "resolution": "1080P",
        "duration":   8,
    }

    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.apimart.ai/v1/videos/generations";

        String payload = """
        {
          "model": "wan2.7-r2v",
          "prompt": "This person walks down the street surrounded by heavy traffic",
          "image_with_roles": [{"url": "https://cdn.example.com/character.jpg", "role": "reference_image"}],
          "resolution": "1080P",
          "duration": 8
        }
        """;

        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.apimart.ai/v1/videos/generations";

$payload = [
    "model" => "wan2.7-r2v",
    "prompt" => "This person walks down the street surrounded by heavy traffic",
    "image_with_roles" => [["url" => "https://cdn.example.com/character.jpg", "role" => "reference_image"]],
    "resolution" => "1080P",
    "duration" => 8
];

$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.apimart.ai/v1/videos/generations")

payload = {
  model: "wan2.7-r2v",
  prompt: "This person walks down the street surrounded by heavy traffic",
  image_with_roles: [{ url: "https://cdn.example.com/character.jpg", role: "reference_image" }],
  resolution: "1080P",
  duration: 8
}

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.body
import Foundation

let url = URL(string: "https://api.apimart.ai/v1/videos/generations")!

let payload: [String: Any] = [
    "model": "wan2.7-r2v",
    "prompt": "This person walks down the street surrounded by heavy traffic",
    "image_with_roles": [["url": "https://cdn.example.com/character.jpg", "role": "reference_image"]],
    "resolution": "1080P",
    "duration": 8
]

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/videos/generations";

        var payload = @"{
            ""model"": ""wan2.7-r2v"",
            ""prompt"": ""This person walks down the street surrounded by heavy traffic"",
            ""image_with_roles"": [{""url"": ""https://cdn.example.com/character.jpg"", ""role"": ""reference_image""}],
            ""resolution"": ""1080P"",
            ""duration"": 8
        }";

        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);
    }
}
{
  "code": 200,
  "data": [
    {
      "status": "submitted",
      "task_id": "task_01J9HA7JPQ9A0Z6JZ3V8M9W6PZ"
    }
  ]
}
{
  "error": {
    "code": 400,
    "message": "Invalid request parameters",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "code": 401,
    "message": "Invalid authentication credentials",
    "type": "authentication_error"
  }
}
{
  "error": {
    "code": 402,
    "message": "Insufficient balance. Please top up your account",
    "type": "payment_required"
  }
}
{
  "error": {
    "code": 429,
    "message": "Rate limit exceeded. Please try again later",
    "type": "rate_limit_error"
  }
}
{
  "error": {
    "code": 500,
    "message": "Internal server error. Please try again later",
    "type": "server_error"
  }
}
curl --request POST \
  --url https://api.apimart.ai/v1/videos/generations \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "wan2.7-r2v",
    "prompt": "This person walks down the street surrounded by heavy traffic",
    "image_with_roles": [{"url": "https://cdn.example.com/character.jpg", "role": "reference_image"}],
    "resolution": "1080P",
    "duration": 8
  }'
import requests

url = "https://api.apimart.ai/v1/videos/generations"

payload = {
    "model": "wan2.7-r2v",
    "prompt": "This person walks down the street surrounded by heavy traffic",
    "image_with_roles": [{"url": "https://cdn.example.com/character.jpg", "role": "reference_image"}],
    "resolution": "1080P",
    "duration": 8
}

headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
const url = "https://api.apimart.ai/v1/videos/generations";

const payload = {
  model: "wan2.7-r2v",
  prompt: "This person walks down the street surrounded by heavy traffic",
  image_with_roles: [{ url: "https://cdn.example.com/character.jpg", role: "reference_image" }],
  resolution: "1080P",
  duration: 8
};

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.apimart.ai/v1/videos/generations"

    payload := map[string]interface{}{
        "model":  "wan2.7-r2v",
        "prompt": "This person walks down the street surrounded by heavy traffic",
        "image_with_roles": []map[string]string{
            {"url": "https://cdn.example.com/character.jpg", "role": "reference_image"},
        },
        "resolution": "1080P",
        "duration":   8,
    }

    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.apimart.ai/v1/videos/generations";

        String payload = """
        {
          "model": "wan2.7-r2v",
          "prompt": "This person walks down the street surrounded by heavy traffic",
          "image_with_roles": [{"url": "https://cdn.example.com/character.jpg", "role": "reference_image"}],
          "resolution": "1080P",
          "duration": 8
        }
        """;

        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.apimart.ai/v1/videos/generations";

$payload = [
    "model" => "wan2.7-r2v",
    "prompt" => "This person walks down the street surrounded by heavy traffic",
    "image_with_roles" => [["url" => "https://cdn.example.com/character.jpg", "role" => "reference_image"]],
    "resolution" => "1080P",
    "duration" => 8
];

$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.apimart.ai/v1/videos/generations")

payload = {
  model: "wan2.7-r2v",
  prompt: "This person walks down the street surrounded by heavy traffic",
  image_with_roles: [{ url: "https://cdn.example.com/character.jpg", role: "reference_image" }],
  resolution: "1080P",
  duration: 8
}

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.body
import Foundation

let url = URL(string: "https://api.apimart.ai/v1/videos/generations")!

let payload: [String: Any] = [
    "model": "wan2.7-r2v",
    "prompt": "This person walks down the street surrounded by heavy traffic",
    "image_with_roles": [["url": "https://cdn.example.com/character.jpg", "role": "reference_image"]],
    "resolution": "1080P",
    "duration": 8
]

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/videos/generations";

        var payload = @"{
            ""model"": ""wan2.7-r2v"",
            ""prompt"": ""This person walks down the street surrounded by heavy traffic"",
            ""image_with_roles"": [{""url"": ""https://cdn.example.com/character.jpg"", ""role"": ""reference_image""}],
            ""resolution"": ""1080P"",
            ""duration"": 8
        }";

        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);
    }
}
{
  "code": 200,
  "data": [
    {
      "status": "submitted",
      "task_id": "task_01J9HA7JPQ9A0Z6JZ3V8M9W6PZ"
    }
  ]
}
{
  "error": {
    "code": 400,
    "message": "Invalid request parameters",
    "type": "invalid_request_error"
  }
}
{
  "error": {
    "code": 401,
    "message": "Invalid authentication credentials",
    "type": "authentication_error"
  }
}
{
  "error": {
    "code": 402,
    "message": "Insufficient balance. Please top up your account",
    "type": "payment_required"
  }
}
{
  "error": {
    "code": 429,
    "message": "Rate limit exceeded. Please try again later",
    "type": "rate_limit_error"
  }
}
{
  "error": {
    "code": 500,
    "message": "Internal server error. Please try again later",
    "type": "server_error"
  }
}

Autorisation

Authorization
string
requis
Tous les endpoints API requièrent une authentification par Bearer TokenObtenez votre API Key :Visitez la page de gestion des API Keys pour obtenir votre API KeyAjoutez-la à l’en-tête de la requête :
Authorization: Bearer YOUR_API_KEY

Paramètres de la requête

model
string
requis
Nom du modèle de génération vidéo, fixé à wan2.7-r2v
prompt
string
requis
Description du contenu de la vidéo, jusqu’à 5000 caractèresPour plusieurs images/vidéos, utilisez « image 1 », « image 2 », « video 1 », etc., pour faire référence aux ressources de référence correspondantes (dans l’ordre d’entrée)Exemple : "The character in image 1 enters the scene in image 2 and looks around"
image_with_roles
array<object>
Tableau d’images avec rôles ; au moins ce champ ou video_urls doit être fourniChamps de chaque objet :
  • url (string) : URL de l’image
  • role (string) : rôle de l’image
    • reference_image — image de référence (par défaut)
    • first_frame — première trame spécifiée (lorsque fournie, size est ignoré et le rapport d’aspect suit l’image de première trame)
  • reference_voice (string, optionnel) : URL d’un échantillon audio vocal pour ce personnage de référence, utilisé pour contrôler la voix du personnage dans la vidéo générée
Exemple :
[
  {
    "url": "https://cdn.example.com/character.jpg",
    "role": "reference_image",
    "reference_voice": "https://cdn.example.com/voice_sample.mp3"
  },
  { "url": "https://cdn.example.com/start.jpg", "role": "first_frame" }
]
video_urls
array<string>
Tableau d’URLs de vidéos de référence, jusqu’à 5 vidéos (total images + vidéos ≤ 5)Au moins ce champ ou image_with_roles doit être fourni
Contraintes vidéo :
  • Format : mp4, mov
  • Durée : 1–30s
  • Résolution : largeur et hauteur dans la plage [240, 4096] pixels
  • Rapport d’aspect : 1:8 – 8:1
  • Taille de fichier : jusqu’à 100 Mo
negative_prompt
string
Prompt négatif décrivant le contenu indésirable, jusqu’à 500 caractères
resolution
string
défaut:"1080P"
Résolution de la vidéoOptions :
  • 720P — standard
  • 1080P — haute définition (par défaut)
duration
integer
défaut:"5"
Durée de la vidéo (secondes)Plage prise en charge : 2 ~ 15 secondesPar défaut : 5
Lorsque les ressources de référence incluent une vidéo : un entier entre [2, 10].Lorsque les ressources de référence n’incluent pas de vidéo : un entier entre [2, 15].
size
string
défaut:"16:9"
Rapport d’aspectFormats pris en charge :
  • 16:9 — écran large paysage (par défaut)
  • 9:16 — portrait
  • 1:1 — carré
  • 4:3 — paysage
  • 3:4 — portrait
Lorsque first_frame est fourni via image_with_roles, ce paramètre est ignoré et le rapport d’aspect suit l’image de première trame
prompt_extend
boolean
défaut:"true"
Activer la réécriture intelligente du promptAméliore significativement les résultats pour les prompts courts, mais augmente le temps de traitementPar défaut : true
watermark
boolean
défaut:"false"
Ajouter un filigrane « AI Generated » à la vidéo générée
  • true : ajouter un filigrane
  • false : sans filigrane (par défaut)
seed
integer
Entier servant de graine pour contrôler le caractère aléatoire du contenu généréPlage de valeurs : entier ≥ 0
  • Pour des requêtes identiques, le modèle génère des résultats différents lorsqu’il reçoit des valeurs de graine différentes (par exemple, omettre la graine)
  • Pour des requêtes identiques, le modèle génère des résultats similaires lorsqu’il reçoit la même valeur de graine, mais une cohérence exacte n’est pas garantie

Réponse

code
integer
Code de statut de la réponse, 200 en cas de succès
data
array
Tableau de données de la réponse

Cas d’utilisation

Cas 1 : Image de référence unique (le plus simple)

{
  "model": "wan2.7-r2v",
  "prompt": "This person walks down the street surrounded by heavy traffic",
  "image_with_roles": [
    { "url": "https://cdn.example.com/character.jpg", "role": "reference_image" }
  ]
}

Cas 2 : Plusieurs images de référence

{
  "model": "wan2.7-r2v",
  "prompt": "The character in image 1 enters the scene in image 2 and mimics the pose in image 3",
  "image_with_roles": [
    { "url": "https://cdn.example.com/person.jpg", "role": "reference_image" },
    { "url": "https://cdn.example.com/background.jpg", "role": "reference_image" },
    { "url": "https://cdn.example.com/pose.jpg", "role": "reference_image" }
  ],
  "resolution": "1080P",
  "duration": 8,
  "size": "16:9"
}

Cas 3 : Génération basée sur une vidéo de référence

{
  "model": "wan2.7-r2v",
  "prompt": "Generate a beach sunset scene in the style of the reference video",
  "video_urls": ["https://cdn.example.com/style_reference.mp4"],
  "resolution": "720P",
  "duration": 8
}

Cas 4 : Première trame spécifiée + image de référence

{
  "model": "wan2.7-r2v",
  "prompt": "The reference character starts from this position and walks forward",
  "image_with_roles": [
    { "url": "https://cdn.example.com/character.jpg", "role": "reference_image" },
    { "url": "https://cdn.example.com/start.jpg", "role": "first_frame" }
  ],
  "resolution": "1080P",
  "duration": 8
}

Cas 5 : Image de référence + voix de référence (précis)

{
  "model": "wan2.7-r2v",
  "prompt": "This person walks down the street while speaking",
  "image_with_roles": [
    {
      "url": "https://cdn.example.com/character.jpg",
      "role": "reference_image",
      "reference_voice": "https://cdn.example.com/voice_sample.mp3"
    }
  ],
  "resolution": "1080P",
  "duration": 10
}

Règles de référence aux images

Avec plusieurs images de référence, utilisez des indices numériques dans le prompt pour y faire référence :
  • 1re image → « image 1 » ou « the first image »
  • 1re vidéo → « video 1 » ou « the first video »
Interroger les résultats de la tâcheLa génération vidéo est une tâche asynchrone qui renvoie un task_id lors de la soumission. Utilisez l’endpoint Obtenir le statut de la tâche pour interroger la progression et les résultats de la génération.