Guides

Storage

Finished videos upload straight to your own bucket. You keep the files, serve them from your own domain, and decide how long they live.

Two ways to connect a bucket

Best forIn the request
Saved bucketApps and anything long-runningNothing. Or storage.integration_id to pick one of several
Per-requestScripts, CI, multi-tenant apps with a bucket per customerstorage.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.

Saved bucket (recommended)

  • Open Settings → Storage and add your R2, S3 or MinIO bucket.
  • Every request then uploads there automatically. If you save several, the most recent is the default.
  • To target a specific one, copy its id from Settings and pass storage.integration_id:
saved.sh
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" }
  }'
RESPONSEresponse.json
{
  "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"
}

Per-request credentials

Pass the bucket details in storage.inline. They’re used for that one video and never stored.

Cloudflare R2

r2.sh
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"
      }
    }
  }'
RESPONSEresponse.json
{
  "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"
}

AWS S3

s3.sh
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"
      }
    }
  }'

MinIO and other S3-compatible storage

minio.sh
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"
      }
    }
  }'

Fields

FieldNeeded forNotes
providerAllr2, s3, minio, backblaze or custom_s3
bucketAllBucket name
access_key_id, secret_access_keyAllA key that can write to the bucket
account_idR2Your Cloudflare account id
regionS3, MinIO, otherse.g. us-east-1
endpointMinIO, Backblaze, customYour S3 endpoint URL
force_path_styleMinIOtrue for path-style URLs
public_urlRecommendedPublic base URL of the bucket or your CDN

Public URL

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.

Security

  • Saved credentials are encrypted (AES-256-GCM) before they’re stored and are never shown again after saving.
  • Per-request credentials are used once and never stored.
  • Give manimotion a key that can only write to this one bucket, not your whole account.