Running a model
MiniMaxIn the appsText to videoMiniMax H3
A scene in. Video with its own audio out, 768p at 24 fps.
One of the models behind Auray's apps, under the auray-ai/ namespace.
Its request shape is published below. Whether it runs right now is GET /v1/catalogue's word, with no key needed: its addresses say connected for an address that runs, and a submit to any other is refused before anything is charged — described answers 501 model_not_connected, paused 503 model_disabled.
Category text-to-video · Scope video:write (or auray-ai-video:write on an older key) · Price One price per clip for each length rung — up to 5, 10 and 15 seconds — each rung's credits in force served by GET /v1/plans as price_keys (video.fast.<rung>) and quoted when you submit. A clip held by reference pictures is charged the per cent in video.reference_multiplier_pct of that, rounded up once; a first frame, and shots cut inside one clip, cost nothing extra. Refunded if the render fails.
#Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
prompt | string | yes | — | What to film. Documented range: up to 7,000 characters. |
duration_seconds | integer | no | 5 | Whole seconds; outside 5–15 it is refused with 422 duration_out_of_range, before any charge. Documented range: 5 to 15. |
tier | string | no | "fast" | One configuration. Two earlier tiers, standard and pro, were retired on 2026-08-27 and 2026-09-10, and both are refused now. One of "fast". |
aspect_ratio | string | no | "16:9" | 16:9 or 9:16. The first clip after a few quiet minutes waits about 12 minutes longer to start, and after such a wait the first clip longer than 5 seconds on each canvas may take longer to render than the ones after it; the quoted expected_seconds includes both. One of "16:9", "9:16". |
first_frame_path | string | no | — | The picture the clip opens on: the path that POST /v1/uploads with this address answered, sent once its bytes have been PUT. Costs nothing extra. Not with reference_image_paths: the model's reference mode takes no first frame, and the pair is refused with 422 start_frame_with_references before any charge. A path from POST /v1/uploads; this platform never fetches a URL you give it. |
reference_image_paths | string[] | no | — | Up to 9 pictures that hold a subject — a face, a costume, a place — each the path an upload answered. The prompt names them in this order as <Picture 1>, <Picture 2> and so on. A clip with references is charged the reference multiplier, video.reference_multiplier_pct in GET /v1/plans' price_keys, once over the clip. A path from POST /v1/uploads; this platform never fetches a URL you give it. Documented range: up to 9. |
seed | integer | no | — | Leave it out and one is chosen; a finished clip reports the seed it rendered with (seed on each video), and sending that number back with the same prompt and settings renders the same clip. Outside the range it is refused with 422 seed_out_of_range, before any charge. Documented range: 0 to 4,294,967,295. |
idempotency_key | string | no | — | Your own name for this request. Send the same one twice and the second call is answered with the first request rather than charged again. Idempotency-Key: as a header is accepted as an alias — that is the spelling a retrying proxy replays, and the one to use when running a model on auray.run, where a request that outlives its connection is answered 504 and recovered by replay. Omit it and the platform mints one. 1 to 64 characters. |
#Example
curl -X POST https://queue.auray.run/auray-ai/minimax-h3/text-to-video \
-H "Authorization: Bearer $AURAY_API_KEY" \
-H "content-type: application/json" \
-d '{
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left"
}'import { createClient } from "@auray/client";
const auray = createClient(); // reads AURAY_API_KEY
const result = await auray.subscribe("auray-ai/minimax-h3/text-to-video", {
input: {
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left"
},
onQueueUpdate: (update) => console.log(update.status),
});
console.dir(result, { depth: null });from auray_client import Client
auray = Client() # reads AURAY_API_KEY
result = auray.subscribe(
"auray-ai/minimax-h3/text-to-video",
input={
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left"
},
on_queue_update=lambda update: print(update["status"]),
)
print(result){
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "run_model",
"arguments": {
"address": "auray-ai/minimax-h3/text-to-video",
"input": {
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left"
}
}
}
}const res = await fetch("https://queue.auray.run/auray-ai/minimax-h3/text-to-video", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AURAY_API_KEY}`,
"content-type": "application/json",
},
body: JSON.stringify({
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left"
}),
});
console.log(await res.json());import os, requests
r = requests.post(
"https://queue.auray.run/auray-ai/minimax-h3/text-to-video",
headers={"Authorization": f"Bearer {os.environ['AURAY_API_KEY']}"},
json={
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left"
},
)
r.raise_for_status()
print(r.json())package main
import (
"bytes"
"fmt"
"io"
"net/http"
"os"
)
func main() {
body := []byte(`{
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left"
}`)
req, err := http.NewRequest("POST", "https://queue.auray.run/auray-ai/minimax-h3/text-to-video", bytes.NewReader(body))
if err != nil {
panic(err)
}
req.Header.Set("Authorization", "Bearer "+os.Getenv("AURAY_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)
if err != nil {
panic(err)
}
defer res.Body.Close()
out, _ := io.ReadAll(res.Body)
fmt.Println(res.Status, string(out))
}<?php
$ch = curl_init("https://queue.auray.run/auray-ai/minimax-h3/text-to-video");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer " . getenv("AURAY_API_KEY"),
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"prompt" => "a brass orrery on a walnut desk, morning light from a window to the left",
], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE),
]);
$response = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE), " ", $response, PHP_EOL;require "net/http"
require "json"
uri = URI("https://queue.auray.run/auray-ai/minimax-h3/text-to-video")
req = Net::HTTP::Post.new(uri)
req["Authorization"] = "Bearer #{ENV.fetch("AURAY_API_KEY")}"
req["Content-Type"] = "application/json"
req.body = {
"prompt" => "a brass orrery on a walnut desk, morning light from a window to the left"
}.to_json
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }
puts res.code, res.bodyimport java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
String body = """
{
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left"
}""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://queue.auray.run/auray-ai/minimax-h3/text-to-video"))
.header("Authorization", "Bearer " + System.getenv("AURAY_API_KEY"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode() + " " + response.body());
}
}using System.Net.Http.Headers;
using System.Text;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("AURAY_API_KEY"));
using var request = new HttpRequestMessage(HttpMethod.Post, "https://queue.auray.run/auray-ai/minimax-h3/text-to-video");
var body = """
{
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left"
}
""";
request.Content = new StringContent(body, Encoding.UTF8, "application/json");
using var response = await client.SendAsync(request);
Console.WriteLine($"{(int)response.StatusCode} {await response.Content.ReadAsStringAsync()}");This model cannot be waited on: https://auray.run answers 400 model_not_synchronous and ?wait= is refused wait_unsupported, both before anything is charged. Submit it here and poll, stream its status, or pass ?webhook= — the options are on Submit a request.
#Machine contracts
- openapi.json — this page as an OpenAPI 3.1 document, public.
- llms.txt — the same, written for an agent.
