The video API that does not reject your traffic.

Image-to-video over REST, no arbitrary content filters, and every render written straight into your own bucket.

# one call, one clip
curl -X POST \
  https://api.musebox.ai/api/v1/jobs \
  -H "Authorization: Bearer $MBX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "i2v",
    "modelId": "tmpl-i2v-classic",
    "inputUrl": "https://cdn.you/frame.jpg",
    "quality": "fast"
  }'
status: done
550+templates in the shared catalogue
4job types: i2v, extend, t2i, audio
1020pxtop quality tier, longest side
HMACsigned webhooks with retries
USDTbilling rail for partners

Three reasons teams migrate to us

Every partner who moved here was blocked by one of these somewhere else.

Frame from a clip generated through the Musebox API

Your prompts stop coming back rejected

General-purpose video APIs reject the work your product exists to do. We do not apply those creative filters. Illegal content stays prohibited and every account is bound by our terms, but the model does not second-guess your catalogue.

Your media stops living on someone else's CDN

On v2 you sign a PUT per job and the render is written into your bucket. We keep no copy, so there is no expiring link to babysit and no third-party host in your delivery path.

Your characters become templates

We train custom LoRA models on your footage and expose them as private templates that only your keys can call.

Already carrying production traffic

This is not a beta waiting for its first integration. Partner accounts run through the same queue and the same GPU fleet every day.

Millions generations delivered through the API every day
99.9% job success rate, the same number your console reports

The traffic comes from three kinds of product, and it is concentrated in the United States, Europe and Brazil.

Mobile apps Telegram bots Established AI generators

Submit, render, deliver

The whole integration is one POST and one webhook handler. Everything else is optional.

Submit

POST /v1/jobs with a template id and a public image URL. You get a job id, a queue position, the credits charged and your balance after, all in the same response.

Render

The job runs on dedicated GPU workers. Text-to-image lands at roughly 60 seconds p50 and 150 seconds p95 when there is queue depth. Poll if you have to, but webhooks are the intended path.

Deliver

We sign the callback with your per-key secret and retry on failure. On v2 the file is already sitting in your bucket by the time the webhook arrives.

Real output from the shared catalogue

Each clip below is one call against a template every partner account can reach on day one.

i2v · 5s 720p
i2v · 5s 720p
i2v · 5s 832p
i2v · 5s 832p
i2v · 5s 832p

What your users end up looking at

You own the interface. One account and one key drive a storefront and a chat bot alike, because both are the same two calls underneath.

Your Studio240 credits
Template preview in a partner app catalogue
Template preview
Template preview
Template preview
Template preview
Template preview
550+ templates from /v1/models
Generating~40s
Selected source image
Your server posted the job and is waiting on the webhook.
Readydone in 38s
Delivered into your bucket, served from your own CDN.
Save to gallery

A storefront in your app

Your catalogue, your pricing, your credits. The API supplies the templates and the render.

@your_botbot
Send a photo and pick a style.
Photo a user sent to the bot
Queued. This takes about 40 seconds.
5s · 720p · 20 credits

A bot in a chat

One POST when the photo arrives, one webhook when the clip is ready. No polling loop to run.

The render never touches our CDN

On v1 the output sits in our storage behind a link that expires about 24 hours after the job finishes. On v2 you attach a presigned PUT to the job and the worker writes the finished file directly into your bucket. We keep nothing.

AWS S3 Cloudflare R2 Google Cloud Storage Azure Blob Backblaze B2 S3-compatible
// add one block to any v2 job
{
  "type": "i2v",
  "modelId": "tmpl-i2v-classic",
  "inputUrl": "https://your-cdn.com/frame.jpg",
  "delivery": {
    "url": "https://bucket.r2.cloudflarestorage.com/out.mp4?X-Amz-...",
    "method": "PUT",
    "headers": { "Content-Type": "video/mp4" }
  }
}

// the callback is a delivery receipt, not a download link
{ "jobId": "...", "delivery": { "status": "delivered" } }

Working code in three languages

Create a job, then verify the callback signature before you trust it. That is the entire contract.

curl -X POST https://api.musebox.ai/api/v1/jobs \
  -H "Authorization: Bearer $MBX_KEY" \
  -H "Content-Type: application/json" \
  -d '{"type":"i2v","modelId":"tmpl-i2v-classic","inputUrl":"https://your-cdn.com/frame.jpg","quality":"fast"}'

# poll only if you cannot take a webhook
curl https://api.musebox.ai/api/v1/jobs/$JOB_ID \
  -H "Authorization: Bearer $MBX_KEY"
import crypto from 'node:crypto';

const res = await fetch('https://api.musebox.ai/api/v1/jobs', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.MBX_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    type: 'i2v',
    modelId: 'tmpl-i2v-classic',
    inputUrl: 'https://your-cdn.com/frame.jpg',
    quality: 'fast',
    webhookUrl: 'https://you.example/hooks/musebox',
  }),
});
const { data } = await res.json();

// reject anything you cannot verify
function verify(rawBody, signature, secret) {
  const expected = crypto.createHmac('sha256', secret)
    .update(rawBody).digest('hex');
  return crypto.timingSafeEqual(
    Buffer.from(expected), Buffer.from(signature)
  );
}
import os, hmac, hashlib, requests

r = requests.post(
    "https://api.musebox.ai/api/v1/jobs",
    headers={"Authorization": f"Bearer {os.environ['MBX_KEY']}"},
    json={
        "type": "i2v",
        "modelId": "tmpl-i2v-classic",
        "inputUrl": "https://your-cdn.com/frame.jpg",
        "quality": "fast",
        "webhookUrl": "https://you.example/hooks/musebox",
    },
    timeout=30,
)
job = r.json()["data"]

# reject anything you cannot verify
def verify(raw_body: bytes, signature: str, secret: str) -> bool:
    expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)

What you can call, and what holds it up

generation

Image to video
A still in, a five second clip out. POST /v1/jobs
Long-form sequences
Chain up to five models into one continuous 15s+ video. POST /v1/jobs/sequence
Text to image
Free-form scene prompt, seeded for reproducibility. POST /v1/jobs/t2i
Audio track
Optional add-on on plans that carry the capability.

catalogue

550+ shared templates
Listed through GET /v1/models, no prompt engineering needed.
Cover tags
Filter the catalogue by cover look so the artwork fits the audience you serve.
Private LoRA models
Trained on your footage, callable only by your keys.
Four quality tiers
720, 832, 960 and 1020px on the longest side, gated per plan.

operations

Rate limits you can read
60 to 1000 requests per minute by plan, with RateLimit-* headers on every response.
Concurrency by plan
5 concurrent jobs on entry plans, up to 100 on Studio.
Signed callbacks
Per-key HMAC secret plus an automatic retry schedule.
Documented failures
Every error code maps to one action, including the 422 that tells you a presigned URL will not work before you are charged.

Four plans, quoted per project

Plans differ by what you can call, how fast you can call it, and how many credits come with the month. We quote once we know your volume.

Pro

Quoted on request
  • Image to video, extend and audio
  • 832p and 960p quality tiers
  • 200 requests per minute
  • 25 concurrent jobs
  • Delivery into your own bucket
Get API access

Pilot

Quoted on request
  • 30 day evaluation window
  • Image to video and extend
  • 720p, 60 requests per minute
Get API access

Starter

Quoted on request
  • Image to video at 720p
  • 60 requests per minute
  • Production volume allowance
Get API access

Studio

Quoted on request
  • 1000 requests per minute
  • 100 concurrent jobs
  • Custom SLA and dedicated capacity
Get API access

Credits never expire while the subscription is active, and stay usable for 30 days after a cancellation. Requests stop at a zero balance unless your plan carries overage, and quota warnings arrive at 80, 95 and 100 percent.

Built for the teams nobody else will serve

Adult platforms

The catalogue matches what your audience already pays for, the renders land in your storage rather than ours, and USDT settlement keeps billing working when card processors will not.

Telegram bots

One POST per user request and a webhook that fires when the file is ready. No long-lived connections and no polling loop to babysit while your bot serves thousands of chats.

Agencies and white-label resellers

Resell generation under your own brand. Cover tags let you present a catalogue that fits each regional audience, and private LoRA models keep your clients' characters yours.

Companion and character apps

Animate the same character consistently across a whole product. Train a private model once, then call it like any other template for as long as the account lives.

Questions partners ask first

What content does the API allow?

We do not apply the arbitrary creative filters that general-purpose video APIs use, which is the reason most partners move here. Illegal content is strictly prohibited, all use is bound by our Terms of Service, and we run a content removal process for reports.

Where do the finished renders end up?

On v1 the render lands in our storage and you download it from a link that expires about 24 hours after the job completes. On v2 you supply a presigned PUT per job, the worker writes the file straight into your bucket, and we keep no copy at all.

Which storage providers does delivery support?

Anything that accepts a presigned PUT: AWS S3, Cloudflare R2, Google Cloud Storage, Azure Blob, Backblaze B2, and generic S3-compatible endpoints. The documentation carries a working presign recipe for each one, plus a self-test endpoint that proves your URL works before you spend credits on a real job.

How long does a generation take?

Text-to-image runs at roughly 60 seconds p50 and 150 seconds p95 once there is queue depth. The first request after an idle period is slower while the model loads, then subsequent jobs run hot.

How do I get an API key?

Keys are provisioned by hand after a short review of your project. Send an access request describing what you are building and your expected volume, and you receive a live key plus a webhook signing secret. There is no self-service signup, which is deliberate.

How does billing work?

Plans are billed monthly and carry a credit allowance. Credits never expire while your subscription is active and remain usable for 30 days if you cancel. Requests hard-stop at a zero balance unless your plan includes overage.

Can I bring my own characters?

Yes. We train custom LoRA models on your reference footage and expose them in your catalogue as private templates that only your keys can call.

Do you accept crypto?

Yes. USDT on TRC20 is the default rail for international partners, which matters for teams that traditional processors will not serve.

Tell us what you are building

Send your project, your platform and your expected volume. We review access requests by hand and reply with a quote and a key.