Documentation
Access images, videos and image editing through the unified FASTART API, alongside MiniMax-compatible endpoints. Share the same queue, assets and Credit ledger.
Unified image, video and editing API
Published Studio models share these endpoints. Select a model, capability and mode, not a Provider. The MiniMax-compatible endpoints below remain available with the same enterprise key and Credit balance.
https://api.fastart.ai/enterprise/fastart/v1All calls require Authorization: Bearer. No client-generated request ID is needed. Each submission creates a new task. Idempotency-Key is an optional extension for duplicate protection. HTTP 202 means accepted, not completed.
| Request field | Description |
|---|---|
model | Required: the id from GET /models, not its display name. |
capability / mode | Use exact catalog values; mode defaults to generate. Editing tools use image_viewpoint_edit, image_relight_edit and image_inpaint_edit. |
parameters | Prompt, ratio, size, duration, seed, etc. Only the selected capability's exposed parameters are accepted. Models differ. Omitted values use defaults; seed:null requests a random seed. |
inputs | An array of role plus either url or asset_id. Use asset.role from the catalog; references are numbered in array order per role. Asset IDs must belong to the key's user and Workspace. |
callback_url | Optional HTTPS callback. Before creation we POST a challenge; echo its JSON. Return 2xx for notifications. Delivery failures retry at most 3 times after 10, 30 and 60 seconds. |
price_token | Optional quote price_token: reject creation if the quote changed rather than unexpectedly charging a new price. |
Media must use public HTTP(S) URLs, not private networks, local paths or Base64. Actual media types are validated. Reference images must be at least 240px in each dimension; model count, format, size and reference-duration rules still apply. Masks must match source dimensions; frame roles are distinct from ordinary image references.
curl --fail-with-body "https://api.fastart.ai/enterprise/fastart/v1/models" \
-H "Authorization: Bearer $FASTART_KEY"import os, time
import requests
base = "https://api.fastart.ai/enterprise/fastart/v1"
headers = {"Authorization": "Bearer " + os.environ["FASTART_KEY"]}
# Choose model, capability, mode and parameter values from GET /models.
payload = {
"model": "qwen-image-2-1",
"capability": "text_to_image",
"parameters": {"prompt": "A golden retriever on green grass.", "aspect_ratio": "16:9"},
}
response = requests.post(base + "/generations", json=payload,
headers=headers, timeout=180)
response.raise_for_status()
task_id = response.json()["task"]["id"]
deadline = time.monotonic() + 3600
while time.monotonic() < deadline:
response = requests.get(base + "/generations/" + task_id, headers=headers, timeout=30)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(15)
continue
response.raise_for_status()
task = response.json()["task"]
print(task["status"], task["progress"])
if task["status"] == "succeeded":
print(task["outputs"]) # Signed URLs can be downloaded without a browser cookie.
break
if task["status"] in ("failed", "cancelled"):
raise RuntimeError(task["error"] or task["status"])
time.sleep(5)
else:
raise TimeoutError("Keep task_id and query later; do not create another task.")Available models and full parameters
This catalog reads the current deployment's published configuration. Expand a model for defaults, options, limits, input counts and request examples. Refresh after publishing configuration changes. A listed model does not guarantee available compute or pricing.
Loading published models and parameters…
Quotes, status and results
Quote accepts the same body as creation but creates no task and charges no credits. URLs are downloaded and validated, then temporary copies are cleaned up. It returns expected_microcredits, maximum_microcredits and price_token. Use microcredits_per_credit in the response for conversion.
{
"task": {
"id": "00000000-0000-4000-8000-000000000001",
"model": "qwen-image-2-1",
"capability": "text_to_image",
"mode": "generate",
"status": "succeeded",
"progress": 100,
"outputs": [
{
"asset_id": "00000000-0000-4000-8000-000000000002",
"type": "image",
"url": "https://assets.example.com/signed/result.png",
"mime_type": "image/png",
"metadata": {
"width": 1328,
"height": 1328
}
}
],
"error": null,
"billing_status": "settled",
"usage": {
"reserved_microcredits": 1000,
"consumed_microcredits": 1000,
"released_microcredits": 0
}
}
}Poll every 3–5 seconds. Status is queued, running, succeeded, failed or cancelled. Progress is null when no reliable percentage exists and 100 on success. Outputs may contain multiple images/videos. Signed URLs expire; query again for fresh links. Failures return an error. Usage reports reserved, consumed and released credits and may be null when billing is disabled.
Cancellation is a request, not a guarantee of stopping a running upstream task. Unavailable cancellation returns 409 and never force-fails a job. Existing refund and cost accounting rules apply. Calls appear in API billing. All keys in a Workspace share 120 requests/minute with the MiniMax API, including polling; plan limits still govern concurrency.
400 invalid input; 401 invalid key/access; 402 insufficient balance; 404 missing model/task; 409 price, idempotency or cancellation conflict; 429 rate limit. Without an idempotency key, confirm whether a task was created after a timeout/5xx; resubmitting may create and charge for another task. If using the optional key, preserve it and the original body for retries. Callbacks have no HMAC signature and do not follow redirects; receivers must be idempotent. Callback and query envelopes match; use authenticated queries as the source of truth.
MiniMax · Quickstart
Use the production base URL below. For local development replace the origin with http://localhost:8001, keeping the complete path. There is no locale prefix or /api/v1 prefix.
https://api.fastart.ai/enterprise/minimax/v1- Submit and save task_id
- Poll status or receive callbacks
- Download the successful output
Run examples on your server using cURL, Python (install requests first), or Node.js with fetch and AbortSignal.timeout. Set FASTART_KEY; for query/delete set FASTART_TASK_ID to the real returned task_id.
curl --fail-with-body -X POST "https://api.fastart.ai/enterprise/minimax/v1/video_generation" \
-H "Authorization: Bearer $FASTART_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-H3",
"content": [
{
"type": "text",
"text": "A golden retriever running on green grass."
}
],
"resolution": "352P",
"duration": 3,
"ratio": "16:9"
}'Authentication
Apply after signing in and verifying your email. Approval enables self-service creation of multiple keys in your account. Keys are masked by default and can be revealed and copied. Website cookies are not enterprise keys.
Authorization: Bearer <FASTART_KEY>
Content-Type: application/json- No browser cookies, CSRF token or login request are required. Keep keys in server-side environment variables, never frontend code, URLs, logs or Git.
- The key owner must have a verified email and active write membership in its Workspace. Disabled, expired or revoked keys are rejected.
- Other valid keys in the same Workspace may query tasks. Cross-Workspace query/delete requests return invalid task_id.
Create a video task
Asynchronous creation. HTTP 200 means the task was created, not that the video is ready. Save task_id and query it. Every request needs exactly one non-empty text item.
| Field | Type / required | Description |
|---|---|---|
model | string · required | MiniMax-H3 is tested. The validator recognizes MiniMax-H3-Max, but it is unavailable without its own configured route. |
content | array · required | 1–16 items; exactly one text item of 1–7000 characters, not whitespace-only. Other items describe media roles. |
duration | integer · required | An integer from 3 to 15 seconds, subject to the workflow limits. FASTART does not require a 4/5-second minimum. |
resolution | string · required | 352P / 480P / 768P / 1080P / 2K (uppercase). MiniMax-H3 text and multimodal reference requests use the upscaler at 1080P / 2K; text-only requests need no reference assets. High-resolution first/last frames are not configured. Unsupported resolutions are rejected, never downgraded. |
ratio | string · conditional | 21:9 / 16:9 / 4:3 / 1:1 / 3:4 / 9:16 / adaptive. Required and non-adaptive for text-only requests. Use an explicit ratio for references; see limitations. |
aigc_watermark | boolean · optional | Defaults to false. true requires a configured watermark mapping or the request is rejected. |
callback_url | string · optional | Public HTTP(S) callback URL; must pass a challenge before creation. See callbacks. |
{
"task_id": "00000000-0000-4000-8000-000000000001"
}Query a task
Use the returned UUID task_id. Query non-deleted enterprise tasks from the same Workspace within the last 7 days. This API returns status, not percentage progress; poll about every 5 seconds.
curl --fail-with-body -X GET "https://api.fastart.ai/enterprise/minimax/v1/query/video_generation/${FASTART_TASK_ID}" \
-H "Authorization: Bearer $FASTART_KEY"| status | Meaning |
|---|---|
queued | Not yet dispatched; cancellation may be attempted. |
running | Dispatching, executing, collecting outputs or reconciling; cannot cancel. It does not always mean active GPU computation. |
succeeded | Successful; read content.url and usage. |
failed | Failed or expired; inspect error. |
cancelled | Cancelled before execution. |
{
"task": {
"id": "00000000-0000-4000-8000-000000000001",
"model": "MiniMax-H3",
"status": "succeeded",
"created_at": 1789120000,
"updated_at": 1789120030,
"resolution": "352P",
"duration": 3,
"ratio": "16:9",
"task_type": "generation",
"modality": "video",
"content": {
"url": "https://assets.example.com/output.mp4?signature=EXAMPLE"
},
"usage": {
"total_seconds": 3,
"input_seconds": 0,
"output_seconds": 3,
"input_image_count": 0
}
}
}| Response field | Description |
|---|---|
created_at / updated_at | Unix timestamps in seconds. |
content.url | Signed download URL on success; query again within the 7-day window if it expires. Not a permanent public URL. |
usage | On success: total_seconds = input_seconds + output_seconds, input_image_count, and input_audio_seconds when audio is referenced. Durations are rounded from media metadata; no token counts. |
resolution / duration / ratio | resolution and duration reflect the request; the file is authoritative for dimensions and duration. Successful adaptive output returns the reduced actual width:height ratio. |
task_type / modality | generation / video |
{
"task": {
"id": "00000000-0000-4000-8000-000000000001",
"model": "MiniMax-H3",
"status": "failed",
"created_at": 1789120000,
"updated_at": 1789120030,
"resolution": "352P",
"duration": 3,
"ratio": "16:9",
"task_type": "generation",
"modality": "video",
"error": {
"code": "1000",
"message": "video generation failed"
}
}
}import os
import time
from urllib.parse import quote
import requests
task_id = quote(os.environ["FASTART_TASK_ID"], safe="")
headers = {"Authorization": "Bearer " + os.environ["FASTART_KEY"]}
deadline = time.monotonic() + 1800 # Client wait limit, not a server timeout
while time.monotonic() < deadline:
response = requests.get(
f"https://api.fastart.ai/enterprise/minimax/v1/query/video_generation/{task_id}",
headers=headers, timeout=30,
)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(15) # Retry this GET only; never resubmit POST
continue
response.raise_for_status()
task = response.json()["task"]
print(task["status"])
if task["status"] == "succeeded":
print(task["content"]["url"])
break
if task["status"] in ("failed", "cancelled"):
raise RuntimeError(task.get("error", task["status"]))
time.sleep(5)
else:
raise TimeoutError("Keep task_id and query later; do not resubmit.")Cancel or delete
Send no request body. The current server state determines the action; a task observed as queued may start before cancellation, resulting in 400.
curl --fail-with-body -X DELETE "https://api.fastart.ai/enterprise/minimax/v1/video_generation/${FASTART_TASK_ID}" \
-H "Authorization: Bearer $FASTART_KEY"| status | action | Result |
|---|---|---|
queued | cancelled | Cancel and release reserved Credits. |
succeeded / failed | deleted | Hide the enterprise API record only; assets and ledger remain, and no refund is triggered. |
running / cancelled | — | HTTP 400 |
{
"task_id": "00000000-0000-4000-8000-000000000001",
"action": "cancelled",
"status": "cancelled"
}After deletion, queries and repeated deletes return invalid task_id. The shared billing/recovery mechanism handles failed or uncertain tasks; repeated DELETE requests do not expedite refunds.
Reference media
Pass media in content, not multipart. Same-kind media retain their array order; prompt mention order does not reorder inputs. Frame roles cannot mix with reference_* roles. An image with no role defaults to first_frame, so set reference_image explicitly.
| type | role | Limit |
|---|---|---|
image_url | reference_image | 9 images |
video_url | reference_video | 3 clips |
audio_url | reference_audio | 3 clips |
image_url | first_frame / last_frame | 1 each; currently limited |
Multiple reference images
curl --fail-with-body -X POST "https://api.fastart.ai/enterprise/minimax/v1/video_generation" \
-H "Authorization: Bearer $FASTART_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-H3",
"content": [
{
"type": "text",
"text": "A golden retriever running on grass. Use the two reference images for its appearance."
},
{
"type": "image_url",
"image_url": {
"url": "https://assets.example.com/reference-1.jpg"
},
"role": "reference_image"
},
{
"type": "image_url",
"image_url": {
"url": "https://assets.example.com/reference-2.jpg"
},
"role": "reference_image"
}
],
"resolution": "352P",
"duration": 3,
"ratio": "16:9"
}'Image + video + audio
curl --fail-with-body -X POST "https://api.fastart.ai/enterprise/minimax/v1/video_generation" \
-H "Authorization: Bearer $FASTART_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "MiniMax-H3",
"content": [
{
"type": "text",
"text": "A golden retriever running on grass, guided by the reference motion and audio."
},
{
"type": "image_url",
"image_url": {
"url": "https://assets.example.com/reference.jpg"
},
"role": "reference_image"
},
{
"type": "video_url",
"video_url": {
"url": "https://assets.example.com/reference.mp4"
},
"role": "reference_video"
},
{
"type": "audio_url",
"audio_url": {
"url": "https://assets.example.com/reference.wav"
},
"role": "reference_audio"
}
],
"resolution": "352P",
"duration": 3,
"ratio": "16:9"
}'Media URL formats
https://assets.example.com/reference.jpg
data:image/png;base64,<BASE64_DATA>
data:video/mp4;base64,<BASE64_DATA>
data:audio/wav;base64,<BASE64_DATA>
mm_file://<FASTART_ASSET_UUID>mm_file:// only accepts existing FASTART asset UUIDs owned by the key user and Workspace, not MiniMax file IDs. No enterprise Files upload endpoint exists. Private, loopback and cloud metadata URLs are rejected; local file paths cannot be submitted.
| Media | Limits (validated from actual media) |
|---|---|
image | ≤30 MiB; JPG/JPEG, PNG, WEBP, HEIC/HEIF (decoder-dependent); each dimension 256–5760 px, width/height 0.4–2.5. |
video | ≤50 MiB; MP4/MOV, H.264/H.265 with AAC/MP3 audio; 23.976–60 fps; image dimension limits apply; 2–15 s each and ≤15 s total video references. |
audio | ≤15 MiB; WAV/MP3; 2–15 s each and ≤15 s total audio references. |
JSON | ≤64 MiB total including JSON and Base64 expansion; prefer URLs for large files. User storage quotas and workflow constraints also apply. |
Callbacks
Add callback_url to the create request; there is no callback-registration endpoint. Before creation, a synchronous challenge POST uses a 1-second network timeout budget. Return the same JSON promptly or creation is rejected without charging. This adds to creation latency; DNS resolution may take additional time.
{
"challenge": "ECHO_THIS_VALUE"
}Notifications have the GET response shape. State collection runs every 5 seconds, not an instant or strict-order guarantee. After the initial failure, retry at most 3 times, waiting 10, 30 and 60 seconds from each preceding failure (4 total attempts). Scanning and queue delays may postpone delivery. Deduplicate by task.id + status. Callback failures never regenerate the video; use GET as a fallback.
Errors & retries
If a completed task has no video output, GET returns HTTP 200 with status=failed and error.code=video_output_missing; callbacks match. Contact support instead of automatically regenerating. Cancelled tasks currently omit error/content/usage; official requirements for these fields remain unconfirmed.
Request errors use real HTTP error statuses and the envelope below. Execution failure is returned by GET as HTTP 200 with task.status=failed. Gateway errors such as 413 may use a different response format.
{
"type": "error",
"error": {
"type": "bad_request_error",
"message": "media url is required (2013)",
"http_code": "400"
},
"request_id": "00000000000000000000000000000001"
}| HTTP / error.type | Handling |
|---|---|
400 · bad_request_error | Check parameters, media, route configuration or task access. Fix the cause before submitting again. |
401 · authorized_error | Check key, expiry, email verification and membership. |
402 · insufficient_balance_error | Insufficient Credits when billing is enforced; top up or contact an administrator. |
429 · rate_limit_error | Reduce request frequency. The current limit is 120 requests/minute per Workspace, including polling, not 120 concurrent jobs. |
500 · server_error | Back off and retry GET. POST may have an uncertain outcome; check task records first and retain request_id for support. |
Rate limits
| Scope | Limit | Shared quota |
|---|---|---|
Create, query, cancel/delete tasks | 120 requests/minute | Shared across all keys and these endpoints in one Workspace, including polling. |
Browser access and key management | 120 requests/minute | Shared per user, separate from the generation API quota. |
Management writes | Additional 30 requests/hour | Applications, creation, full-key reveal and revocation share this quota, in addition to the minute limit. |
Request frequency is not task concurrency. Plan and queue rules still control concurrent and queued tasks; adding keys does not increase the Workspace quota.
Generation API rate limits return HTTP 429 / rate_limit_error (1002), currently without Retry-After. Reduce request frequency and stagger polling. Management endpoints use the browser API error format.
Limits are currently fixed in code, not configurable in Admin. Cache-based throttling may allow small overruns under extreme concurrency and is not a strict capacity guarantee.