Guides
Finished videos upload straight to your own bucket. You keep the files, serve them from your own domain, and decide how long they live.
| Best for | In the request | |
|---|---|---|
| Saved bucket | Apps and anything long-running | Nothing. Or storage.integration_id to pick one of several |
| Per-request | Scripts, CI, multi-tenant apps with a bucket per customer | storage.inline with the credentials |
Send one or the other, not both. With no saved bucket and no storage field, the request is rejected with 400.
storage.integration_id:curl -sS -X POST "$MANIMOTION_API/video/request" \
-H "Content-Type: application/json" \
-H "x-api-key: $MANIMOTION_KEY" \
-d '{
"prompt": "Visualize gradient descent",
"storage": { "integration_id": "clxxxxxxxx" }
}'{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "queued",
"cached": false,
"video_url": null,
"eta_seconds": 150,
"eta_display": "~2–3 min",
"message": "Queued…",
"tier": "tier2",
"model": "anthropic/claude-haiku-5.5",
"key_source": "platform"
}Pass the bucket details in storage.inline. They’re used for that one video and never stored.
curl -sS -X POST "$MANIMOTION_API/video/request" \
-H "Content-Type: application/json" \
-H "x-api-key: $MANIMOTION_KEY" \
-d '{
"prompt": "Explain Fourier series from waves to frequency",
"storage": {
"inline": {
"provider": "r2",
"bucket": "my-lectures",
"access_key_id": "'"$R2_ACCESS_KEY_ID"'",
"secret_access_key": "'"$R2_SECRET_ACCESS_KEY"'",
"account_id": "'"$R2_ACCOUNT_ID"'",
"public_url": "https://cdn.example.com"
}
}
}'{
"job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"status": "queued",
"cached": false,
"video_url": null,
"eta_seconds": 150,
"eta_display": "~2–3 min",
"message": "Queued…",
"tier": "tier2",
"model": "anthropic/claude-haiku-5.5",
"key_source": "platform"
}curl -sS -X POST "$MANIMOTION_API/video/request" \
-H "Content-Type: application/json" \
-H "x-api-key: $MANIMOTION_KEY" \
-d '{
"prompt": "Explain Bayes theorem",
"storage": {
"inline": {
"provider": "s3",
"bucket": "my-lectures",
"access_key_id": "'"$AWS_ACCESS_KEY_ID"'",
"secret_access_key": "'"$AWS_SECRET_ACCESS_KEY"'",
"region": "us-east-1",
"public_url": "https://cdn.example.com"
}
}
}'curl -sS -X POST "$MANIMOTION_API/video/request" \
-H "Content-Type: application/json" \
-H "x-api-key: $MANIMOTION_KEY" \
-d '{
"prompt": "Timeline of the industrial revolution",
"storage": {
"inline": {
"provider": "minio",
"bucket": "lectures",
"access_key_id": "'"$MINIO_KEY"'",
"secret_access_key": "'"$MINIO_SECRET"'",
"region": "us-east-1",
"endpoint": "https://minio.example.com",
"force_path_style": true,
"public_url": "https://files.example.com"
}
}
}'| Field | Needed for | Notes |
|---|---|---|
provider | All | r2, s3, minio, backblaze or custom_s3 |
bucket | All | Bucket name |
access_key_id, secret_access_key | All | A key that can write to the bucket |
account_id | R2 | Your Cloudflare account id |
region | S3, MinIO, others | e.g. us-east-1 |
endpoint | MinIO, Backblaze, custom | Your S3 endpoint URL |
force_path_style | MinIO | true for path-style URLs |
public_url | Recommended | Public base URL of the bucket or your CDN |
video_url is built from public_url, so set it to an address browsers can load, such as your R2 public domain (https://pub-xxxx.r2.dev) or your CDN. Without it the URL may point at a private endpoint that won’t play in a browser.