Running a model
MiniMaxIn the appsText to audioMiniMax Music 3
Words and a mood in. A full song with vocals out, 44.1 kHz stereo.
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-audio · Scope audio:write (or music:write on an older key) · Price A flat base per job plus one credit for each block of seconds of audio you ask for; GET /v1/plans serves the base and the seconds a credit buys in force as price_keys (music.base, music.seconds_per_credit), the submit quotes the credits, and the part for audio that comes back short is refunded.
#Input
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
prompt | string | yes | — | The song to write — genre, mood, instruments, voice. Shares the model's 5,000-token budget with the lyrics. Documented range: up to 5,000 characters. |
duration_seconds | integer | yes | — | Ten seconds to five minutes. Outside 10–300 the request is refused with 422 duration_out_of_range, before any charge. An instrumental runs at least 90% of it. A song with lyrics ends when its lyrics do, so a long one needs enough of them. Seconds that do not arrive are refunded. Documented range: 10 to 300. |
lyrics | string | no | — | Omit for an instrumental. The prompt and the lyrics together may come to at most 5,000 tokens of the model's own tokenizer, counted with the few it adds around them. English lyrics fit at the full 10,000 characters; Chinese, Japanese or Korean lyrics, or a long prompt beside long lyrics, reach the token budget first. Past it the request is refused with 422 prompt_and_lyrics_too_long, which says how many tokens it came to, before any charge. Documented range: up to 10,000 characters. |
seed | integer | no | — | Reuse one to get the same song back. Outside the range it is refused with 422 seed_out_of_range, before any charge. Documented range: 0 to 2,147,483,647. |
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-music-3/text-to-audio \
-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",
"duration_seconds": 10
}'import { createClient } from "@auray/client";
const auray = createClient(); // reads AURAY_API_KEY
const result = await auray.subscribe("auray-ai/minimax-music-3/text-to-audio", {
input: {
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left",
"duration_seconds": 10
},
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-music-3/text-to-audio",
input={
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left",
"duration_seconds": 10
},
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-music-3/text-to-audio",
"input": {
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left",
"duration_seconds": 10
}
}
}
}const res = await fetch("https://queue.auray.run/auray-ai/minimax-music-3/text-to-audio", {
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",
"duration_seconds": 10
}),
});
console.log(await res.json());import os, requests
r = requests.post(
"https://queue.auray.run/auray-ai/minimax-music-3/text-to-audio",
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",
"duration_seconds": 10
},
)
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",
"duration_seconds": 10
}`)
req, err := http.NewRequest("POST", "https://queue.auray.run/auray-ai/minimax-music-3/text-to-audio", 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-music-3/text-to-audio");
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",
"duration_seconds" => 10,
], 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-music-3/text-to-audio")
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",
"duration_seconds" => 10
}.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",
"duration_seconds": 10
}""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://queue.auray.run/auray-ai/minimax-music-3/text-to-audio"))
.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-music-3/text-to-audio");
var body = """
{
"prompt": "a brass orrery on a walnut desk, morning light from a window to the left",
"duration_seconds": 10
}
""";
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()}");The same body on https://auray.run runs synchronously and answers the result — unless it usually takes longer than a run may hold its connection, which is refused 400 model_not_synchronous before anything is charged. Options — ?webhook=, ?wait=, priority and timeout headers — 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.