Get API

MiniMax H3

Guide 2K generation with up to 9 image, 3 video, and 3 audio references.

minimax/h3/reference-to-video

Capabilities

Best for

  • Cinematic text-to-video shots
  • Short social and ad clips
  • Consistent multi-shot sequences
  • Look-dev and style exploration

Not for

  • Frame-exact rotoscoping
  • Feature-length renders
  • Pixel-perfect compositing
  • Precise on-screen text

Authentication

api key header

The Pika API uses API keys to authenticate requests. Send your key in the X-API-Key header. Your API key is a secret. Don't expose it in browsers or other client-side code. Instead, call the API from your server. The signed-in playground uses a portal session and never sends your API key.

header
X-API-Key: YOUR_API_KEY

Endpoint

asynchronous · poll for the result

POSThttps://api.dev.pika.art/v1/media/minimax/h3/reference-to-videogenerate endpoint
GEThttps://api.dev.pika.art/v1/media/jobs/{request_id}poll until completed
GEThttps://api.dev.pika.art/v1/media/jobs/{request_id}/contentget the result URL

Reference Uploads

media inputs

Media inputs accept any public URL. To use a local file, POST its content_type and size_bytes to /v1/media/uploads, PUT the file to the returned upload_url, then pass the url.

upload
# 1. Request a presigned upload URL. Send the file's content
# type and its exact size in bytes.
curl -X POST https://api.dev.pika.art/v1/media/uploads \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content_type": "image/png", "size_bytes": 12345}'
# The response returns two URLs:
# upload_url: a temporary URL to upload the file to. Expires in 5 minutes.
# url: the permanent Pika URL. Pass it to the model as the input.
# {
# "upload_url": "https://upload.r2.pika.art/...?X-Amz-Signature=...",
# "url": "https://cdn.pika.art/v2/media/uploads/org_abc/9f8e7d.png"
# }
# 2. Upload the file to upload_url, then pass url to the model.
curl -X PUT "<upload_url>" \
-H "Content-Type: image/png" \
--data-binary @input.png

Generate

POST /v1/media/minimax/h3/reference-to-video

Request

curl -X POST https://api.dev.pika.art/v1/media/minimax/h3/reference-to-video \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Pastel 3D objects gently drift and float in zero gravity — combs spin slowly, tubes tumble, blobs drift apart, golden frame tilts — while the model stands still, hair lifting slightly in a soft breeze.",
"duration": 5,
"resolution": "2K",
"ratio": "adaptive",
"image_urls": [
"https://example.com/input.png"
],
"video_urls": [
"https://example.com/reference.mp4"
]
}'

Response

{
"id": "media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0",
"status": "queued"
}

Request body

promptstringrequired
Prompt
durationinteger4 – 15default: 5
Duration
resolutionenum
Resolution
seedinteger-1 – 4294967295
Seed
aigc_watermarkboolean
Aigc Watermark
ratioenum
Ratio
image_urlsstring[]
Reference images, cited in the prompt as "Image 1".."Image 9" in list order. The first five are free; each further image is billed per input image.
video_urlsstring[]
Reference videos, cited in the prompt as "Video 1".."Video 3" in list order, 15s total across all three. Billed per second of reference video the provider consumes.
audio_urlsstring[]
Reference audio, cited in the prompt as "Audio 1".."Audio 3" in list order; requires at least one reference image or video.

Accepted values

resolution
ratio

Input modes

Image urlsimage_urls

Use a public URL directly, or POST { content_type, size_bytes } to /v1/media/uploads, PUT the image to the returned upload_url with the returned headers, then pass the url.

Video urlsvideo_urls

Use a public URL directly, or POST { content_type, size_bytes } to /v1/media/uploads, PUT the video to the returned upload_url with the returned headers, then pass the url.

Audio urlsaudio_urls

Use a public URL directly, or POST { content_type, size_bytes } to /v1/media/uploads, PUT the audio to the returned upload_url with the returned headers, then pass the url.

Returns

Returns a job object with status , not the final output. Store the id from the response and poll the job until it completes.

Poll status

GET /v1/media/jobs/{request_id}

Request

curl https://api.dev.pika.art/v1/media/jobs/{request_id} \
-H "X-API-Key: YOUR_API_KEY"

Response

{
"id": "media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0",
"status": "running"
}

Poll the job by id until it reaches a terminal state: completed or failed.

The job object

idstring
Unique identifier for the job.
statusenum
The status of the job.One of:
object
The generation output. Present once the job completes.
errorstring
If the job failed, the reason for the failure.

Get result

GET /v1/media/jobs/{request_id}/content

Request

curl https://api.dev.pika.art/v1/media/jobs/{request_id}/content \
-H "X-API-Key: YOUR_API_KEY"

Response

{
"url": "https://api.dev.pika.art/v1/files/video_8f3a2c91.mp4"
}

Once the job completes, fetch a download URL for the generated media.

Returns

urlstring
Download URL for the generated file.

Errors

shared across calls

Errors use conventional HTTP status codes with a JSON body of the shape {"message": "..."}. Validation failures return 422 with a message naming the offending field. Submit rejections after the job row exists (balance, rate limit) return the failed job envelope — branch on error.code.

StatusWhenBody
401 UnauthorizedThe API key is missing or invalid.{"message":"Invalid API key"}
403 ForbiddenAn inactive key is rejected with a `{"message"}` body. A submit that the org balance or postpaid cycle limit cannot cover is rejected after the job row exists and returns the failed job envelope.{"id":"media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0","status":"failed","error":{"code":"insufficient_balance","message":"Insufficient org balance"}}
404 Not FoundNo job with that id exists in your org, or the media path names an unknown vendor/model/function.{"message":"media job not found"}
409 ConflictThe result was requested before the job completed, or an Idempotency-Key header was reused with a different body.{"message":"media job is not ready"}
422 Unprocessable EntityThe request body failed validation: an invalid enum value, a missing required field, a wrong type, or malformed JSON. The JSON message names the offending field. A schema-valid parameter combination that cannot be priced instead fails after job creation and returns the failed job envelope with error code `invalid_input`.{"message":"duration: Input should be less than or equal to 15"}
429 Too Many RequestsOrg limit reached: requests per minute or day, or concurrent jobs. Returned as the failed job envelope; check the Retry-After header and retry with a fresh Idempotency-Key.{"id":"media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0","status":"failed","error":{"code":"rate_limited","message":"rate limit exceeded: rpm"}}
503 Service UnavailableThe model rail or a backend dependency is temporarily unavailable. Returned as the failed job envelope; retry with backoff and a fresh Idempotency-Key.{"id":"media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0","status":"failed","error":{"code":"provider_unavailable","message":"media dispatch unavailable"}}

Pricing

only successful runs are charged

TierPrice
Output · 768P$0.080 / second
Output · 2K$0.13 / second
Video input · 768P$0.080 / second
Video input · 2K$0.13 / second
Input images$0.040 / imageFirst 5 included

Per-model pricing

Transparent, usage-based rates for every MiniMax model.

MiniMax H3

Video

Text to Video

768P$0.08 / sec
2K$0.13 / sec

Image to Video

768P$0.08 / sec
2K$0.13 / sec

Reference to VideoCurrent

Output768P$0.08 / sec
Output2K$0.13 / sec
Video input · 768P$0.08 / sec
Video input · 2K$0.13 / sec
Input images$0.04 / imageFirst 5 included

Hailuo 2.3

Video

Image to Video

768p6s$0.168 / request
1080p6s$0.294 / request
768p10s$0.336 / request

Text to Video

768p6s$0.168 / request
1080p6s$0.294 / request
768p10s$0.336 / request

Hailuo 2.3 Fast

Video

Image to Video

768p6s$0.114 / request
768p10s$0.192 / request
1080p6s$0.198 / request

MiniMax Music 3.0

Audio • Text to Audio

$0.09 / request

MiniMax Speech 2.8 HD

Audio • Text to Speech

$0.085 / 1000 chars

MiniMax Speech 2.8 Turbo

Audio • Text to Speech

$0.051 / 1000 chars