FASTART

Documentation

Access images, videos and image editing through the unified FASTART API, alongside MiniMax-compatible endpoints. Share the same queue, assets and Credit ledger.

FASTART UNIFIED / V1

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.

Base URL
https://api.fastart.ai/enterprise/fastart/v1
GET/enterprise/fastart/v1/models
GET/enterprise/fastart/v1/models/{model}/capabilities
POST/enterprise/fastart/v1/generations/quote
POST/enterprise/fastart/v1/generations
GET/enterprise/fastart/v1/generations/{id}
POST/enterprise/fastart/v1/generations/{id}/cancel

All 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 fieldDescription
modelRequired: the id from GET /models, not its display name.
capability / modeUse exact catalog values; mode defaults to generate. Editing tools use image_viewpoint_edit, image_relight_edit and image_inpaint_edit.
parametersPrompt, 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.
inputsAn 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_urlOptional 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_tokenOptional 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 · models
curl --fail-with-body "https://api.fastart.ai/enterprise/fastart/v1/models" \
  -H "Authorization: Bearer $FASTART_KEY"
Python · create + poll (requests)
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.

GET /generations/{id} · response example
{
  "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 COMPATIBLE / V1
This documents the current implementation, not live service status. Production requires domain, key, route and pricing configuration.

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.

Base URL
https://api.fastart.ai/enterprise/minimax/v1
  1. Submit and save task_id
  2. Poll status or receive callbacks
  3. 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.

Request example · never executed in your browser
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.

Request headers
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

POST/enterprise/minimax/v1/video_generation

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.

FieldType / requiredDescription
modelstring · requiredMiniMax-H3 is tested. The validator recognizes MiniMax-H3-Max, but it is unavailable without its own configured route.
contentarray · required1–16 items; exactly one text item of 1–7000 characters, not whitespace-only. Other items describe media roles.
durationinteger · requiredAn integer from 3 to 15 seconds, subject to the workflow limits. FASTART does not require a 4/5-second minimum.
resolutionstring · required352P / 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.
ratiostring · conditional21: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_watermarkboolean · optionalDefaults to false. true requires a configured watermark mapping or the request is rejected.
callback_urlstring · optionalPublic HTTP(S) callback URL; must pass a challenge before creation. See callbacks.
200 · Example response · placeholder IDs and URLs
{
  "task_id": "00000000-0000-4000-8000-000000000001"
}

Query a task

GET/enterprise/minimax/v1/query/video_generation/{task_id}

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.

Request example · never executed in your browser
curl --fail-with-body -X GET "https://api.fastart.ai/enterprise/minimax/v1/query/video_generation/${FASTART_TASK_ID}" \
  -H "Authorization: Bearer $FASTART_KEY"
statusMeaning
queuedNot yet dispatched; cancellation may be attempted.
runningDispatching, executing, collecting outputs or reconciling; cannot cancel. It does not always mean active GPU computation.
succeededSuccessful; read content.url and usage.
failedFailed or expired; inspect error.
cancelledCancelled before execution.
200 · Example response · placeholder IDs and URLs
{
  "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 fieldDescription
created_at / updated_atUnix timestamps in seconds.
content.urlSigned download URL on success; query again within the 7-day window if it expires. Not a permanent public URL.
usageOn 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 / ratioresolution 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 / modalitygeneration / video
Failed task example (HTTP 200)
{
  "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"
    }
  }
}
Python · bounded polling
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

DELETE/enterprise/minimax/v1/video_generation/{task_id}

Send no request body. The current server state determines the action; a task observed as queued may start before cancellation, resulting in 400.

Request example · never executed in your browser
curl --fail-with-body -X DELETE "https://api.fastart.ai/enterprise/minimax/v1/video_generation/${FASTART_TASK_ID}" \
  -H "Authorization: Bearer $FASTART_KEY"
statusactionResult
queuedcancelledCancel and release reserved Credits.
succeeded / faileddeletedHide the enterprise API record only; assets and ledger remain, and no refund is triggered.
running / cancelled—HTTP 400
200 · Example response · placeholder IDs and URLs
{
  "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.

typeroleLimit
image_urlreference_image9 images
video_urlreference_video3 clips
audio_urlreference_audio3 clips
image_urlfirst_frame / last_frame1 each; currently limited
assets.example.com below is a placeholder. Replace it with real public media URLs that do not require cookies.

Multiple reference images

Request example · never executed in your browser
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

Request example · never executed in your browser
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

Media URL examples
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.

MediaLimits (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 request / response
{
  "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.

Callbacks must be public and must not redirect. This version has no callback HMAC signature. Verify task state with an authenticated GET before sensitive business actions; do not trust the JSON alone.

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.

Example response · placeholder IDs and URLs
{
  "type": "error",
  "error": {
    "type": "bad_request_error",
    "message": "media url is required (2013)",
    "http_code": "400"
  },
  "request_id": "00000000000000000000000000000001"
}
HTTP / error.typeHandling
400 · bad_request_errorCheck parameters, media, route configuration or task access. Fix the cause before submitting again.
401 · authorized_errorCheck key, expiry, email verification and membership.
402 · insufficient_balance_errorInsufficient Credits when billing is enforced; top up or contact an administrator.
429 · rate_limit_errorReduce request frequency. The current limit is 120 requests/minute per Workspace, including polling, not 120 concurrent jobs.
500 · server_errorBack off and retry GET. POST may have an uncertain outcome; check task records first and retain request_id for support.

Rate limits

ScopeLimitShared quota
Create, query, cancel/delete tasks120 requests/minuteShared across all keys and these endpoints in one Workspace, including polling.
Browser access and key management120 requests/minuteShared per user, separate from the generation API quota.
Management writesAdditional 30 requests/hourApplications, 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.

Enterprise API Documentation · FASTART