Developer API · v1

Build with the MoviePro API

Make films from your own code or an AI agent: plan shots, generate video, images, music, voice and sound effects, cut them together on a project's timeline, and render to MP4, over REST or MCP. One API key, plain JSON over HTTPS. Included with the Pro and Studio plans.

Overview

Every endpoint lives under one versioned base URL and speaks JSON.

Base URL
https://moviepro.ai/api/v1
  • Successful responses wrap the resource in data; lists add pagination (limit, offset, has_more).
  • Errors are always { error: { code, message } } with a matching HTTP status.
  • Generations and renders are asynchronous: the POST returns an id at once; poll it or receive a webhook.
  • The machine-readable OpenAPI 3.1 document is at /api/v1/openapi.json; import it into Postman, Insomnia or a client generator.

Authentication

Send an API key with every request as a bearer token.

Header
Authorization: Bearer mpk_…

An x-api-key: mpk_… header works too. Create keys in Settings → MoviePro API. API access is part of the Pro and Studio plans: a key on a Free account is refused with 403 PLAN_REQUIRED. A key is shown once, acts as your account, and spends your credits, so keep it on your server. The same keys work for the MCP server. Each key carries scopes; all (the default) grants everything, or pick only what an integration needs:

A key without the scope an endpoint needs gets 403 INSUFFICIENT_SCOPE. A key limited to the scopes above can't open the MCP server; give it the mcp scope (or all) for that. Revoked, expired or unknown keys, and keys of suspended accounts, get 401 UNAUTHORIZED. GET /models needs no scope.

Quick start

Generate a video, then wait for it.

Loading the API reference…

Rate limits

Limits apply per API key.

Loading the API reference…

Errors

Branch on the HTTP status and the stable error code, not the message.

Error body · JSON
{
  "error": {
    "code": "INSUFFICIENT_CREDITS",
    "message": "This costs 15 credits and your balance is too low."
  },
  "credits_required": 15
}

A 403 carries one of these codes: PLAN_REQUIRED (the key's account is on the Free plan), INSUFFICIENT_SCOPE (the key lacks the endpoint's scope) or PRO_REQUIRED (a generation asked for a premium model that needs Pro or Studio). Invalid bodies get 400 INVALID_REQUEST with a details array of { path, message }.

Credits

The API spends the same credits, at the same prices, as the app.

Generations are charged on the server when they start and refunded automatically if the provider fails. A request your balance can't cover is rejected with 402 INSUFFICIENT_CREDITS (with credits_required) before anything runs. If you have saved your own key in Settings → Provider keys, video on a named model runs on your Replicate key and speech runs on your ElevenLabs or Replicate key (whichever the voice uses); those runs cost 0 credits. Images and music through the API always use credits. Cloud renders cost no credits. Check your balance with GET /credits; each generation reports its credits_charged and, after a provider failure, credits_refunded: true. GET /models lists each image model's price in credits; a video's price depends on the model, duration and resolution.

Webhooks

Pass webhook_url when you create a generation or render, and MoviePro calls you when it finishes.

Events: generation.succeeded, generation.failed, render.succeeded, render.failed. The URL must be public HTTPS.

Delivery
POST /hooks/moviepro
Content-Type: application/json
User-Agent: MoviePro-Webhooks/1.0
MoviePro-Event-Id: evt_6f1c…
MoviePro-Event-Type: generation.succeeded
MoviePro-Signature: t=1760540000,v1=5d41402abc4b2a76b9719d911017c592…

{
  "id": "evt_6f1c…",
  "type": "generation.succeeded",
  "created_at": "2026-10-15T14:53:20.000Z",
  "data": {
    "id": "6f1c…",
    "object": "generation",
    "type": "video",
    "status": "succeeded",
    "result": { "id": "…", "url": "https://…/generated/….mp4", "media_file_id": "…", "duration": 5, "model": "…" },
    "error": null,
    "generation_id": "…",
    "credits_charged": 15,
    "credits_refunded": false,
    "webhook": { "url": "https://example.com/hooks/moviepro", "status": "pending", "attempts": 1, "last_error": null },
    "created_at": "2026-10-15T14:52:41.000Z",
    "completed_at": "2026-10-15T14:53:20.000Z"
  }
}

Verifying the signature

Each API key has its own webhook secret (whsec_…); reveal or rotate it next to the key in Settings → MoviePro API. The MoviePro-Signature header is t=<unix seconds>,v1=<hex>, where the hex is the HMAC-SHA256 of `${t}.${raw body}` keyed with that secret. Compute it over the raw bytes you received (before parsing JSON), compare in constant time, and reject timestamps more than five minutes old. Use MoviePro-Event-Id to ignore duplicates.

import crypto from 'node:crypto';

// Express: app.post('/hooks/moviepro', express.raw({ type: 'application/json' }), handler)
export function verifyMovieProSignature(rawBody, header, secret, toleranceSec = 300) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
  const t = Number(parts.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > toleranceSec) return false;
  const expected = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex');
  const given = Buffer.from(parts.v1 ?? '', 'hex');
  const want = Buffer.from(expected, 'hex');
  return given.length === want.length && crypto.timingSafeEqual(given, want);
}

// verifyMovieProSignature(req.body.toString('utf8'), req.get('MoviePro-Signature'), process.env.MOVIEPRO_WEBHOOK_SECRET)

MCP server

Let an AI agent such as Claude or Cursor read and manage your MoviePro account over the Model Context Protocol.

MCP endpoint · Streamable HTTP
https://moviepro.ai/api/mcp-server

Add the endpoint to any MCP client that supports remote (Streamable HTTP) servers and send your key as Authorization: Bearer mpk_… (or x-api-key). The key needs the all or mcp scope, and the account must be on Pro or Studio. The server is stateless and every tool works only on the key owner's data. Every REST endpoint below is also a tool, with the same inputs, credits, rate limit and errors, so an agent can make a whole film: plan the shots, generate them, cut them together on a timeline and render it.

Helpers

  • get_moviepro_guideThe film-making workflow (plan → cast → generate → cut → render) and the timeline rules. Agents read it first.
  • wait_for_generationWait up to 55 s for a generation to finish and return it.
  • wait_for_renderWait up to 55 s for a render to finish and return it with its MP4 URL.

Library and history

  • list_project_foldersYour project folders.
  • list_project_versionsA project's version history.
  • list_ai_generationsYour AI generation history from the app (images, videos, music, scripts).
  • get_ai_generationOne app generation with its result and metadata.
  • list_prompt_templatesPrompt templates: yours and public ones.
  • list_templatesSystem and your own project templates.
  • get_templateA template's tracks and settings.
  • search_soundsSearch the public sound library by name, category or tags.

Endpoints

Loading the API reference…

Start building

Create a key in Settings and make your first request.

Create an API key