At a glance
The Plum API runs Plum Max and 1 other variant through Mage at POST https://api.mage.space/v1/plum/generate. A request at the default settings costs 338 Gems (about $0.338), with no subscription. Plum takes saved characters, references, audio references by @handle in the prompt.
Video
Output
2
Variants
338
Gems per clip, default
$0.338
About, in USD
Overview
What the Plum API does
Full-feature video with audio on every clip and up to 2K output. Start and end frames, up to 9 references or Characters, and Voices; 4 to 15 seconds.
Mage's full-feature video model with generated audio on every clip and output up to 2K, as Plum and the faster Plum Max.
It accepts first_image, last_image, image, additional_images, videos as inputs.
Quick start
Call the Plum API
Set MAGE_API_KEY, submit to /plum/generate, and poll status_url until the request completes.
cURL
STATUS_URL=$(curl --request POST 'https://api.mage.space/v1/plum/generate' \
--header "Authorization: Bearer $MAGE_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"prompt": "A slow push-in on a lighthouse at dusk, waves breaking below",
"aspect_ratio": "16:9",
"duration": "5",
"model_id": "plum-max"
}' | jq -r '.status_url')
# Repeat until status is "completed"; result.url is the file
curl "$STATUS_URL" --header "Authorization: Bearer $MAGE_API_KEY"Python
import os, time, requests
headers = {"Authorization": f"Bearer {os.environ['MAGE_API_KEY']}"}
request = requests.post(
"https://api.mage.space/v1/plum/generate",
headers=headers,
json={
"prompt": "A slow push-in on a lighthouse at dusk, waves breaking below",
"aspect_ratio": "16:9",
"duration": "5",
"model_id": "plum-max"
},
).json()
while request["status"] in ("queued", "in_progress"):
time.sleep(3)
request = requests.get(request["status_url"], headers=headers).json()
print(request["status"], request["result"] and request["result"]["url"])JavaScript
const headers = {
Authorization: `Bearer ${process.env.MAGE_API_KEY}`,
'Content-Type': 'application/json',
};
let request = await fetch('https://api.mage.space/v1/plum/generate', {
method: 'POST',
headers,
body: JSON.stringify({
"prompt": "A slow push-in on a lighthouse at dusk, waves breaking below",
"aspect_ratio": "16:9",
"duration": "5",
"model_id": "plum-max"
}),
}).then((response) => response.json());
while (['queued', 'in_progress'].includes(request.status)) {
await new Promise((resolve) => setTimeout(resolve, 3000));
request = await fetch(request.status_url, { headers }).then((r) => r.json());
}
console.log(request.status, request.result?.url);Models
Plum model_id values
Send model_id to pick a variant. A request without one runs the default.
| model_id | Name | Default |
|---|---|---|
| plum | Plum | |
| plum-max | Plum Max | Yes |
Options
Plum parameters
Allowed values across all variants; a variant may offer fewer. The docs list the options per variant.
| Field | Values |
|---|---|
| aspect_ratio | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 |
| resolution | 768P, 2K, 480P |
| duration | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 |
Inputs
Media inputs Plum accepts
Send each as an https URL, a data URL, or an upload of up to 100 MB.
| Field | Role |
|---|---|
| first_image | The first frame image. |
| last_image | The last frame image. |
| image | The reference image. |
| additional_images | Additional reference images. |
| videos | The source videos. |
Rules
What the Plum API enforces
- First and last frames cannot be combined with reference images: send one kind or the other.
- On `plum-max` a last frame must be paired with a first frame.
- Video editing takes exactly one source video of 2 to 15 seconds, an output `duration`, and up to 2 reference images, without frames.
More video models
Other video generation APIs on Mage
Video · from 360 Gems
Raspberry API
Characters brought to life from a first frame
Video · from 40 Gems
Wan Video v2.2 API
Open-weights video with a Lightning variant
Video · from 189 Gems
Berry API
Video that stays true to your references
Video · from 360 Gems
Blueberry API
Pin the first and last frame
Video · from 618 Gems
Cherry API
Our flagship video family
Video · from 375 Gems
Grok Video API
Grok Imagine, in motion
FAQ
Frequently asked questions
How much does the Plum API cost?
A Plum request at the default settings (Plum Max) costs 338 Gems, about $0.338. Other resolutions, durations, and variants change the price; the response reports the exact charge. A generation that fails is refunded; one Mage's content policy blocks is not.
What is the Plum API endpoint?
POST https://api.mage.space/v1/plum/generate with an Authorization: Bearer header carrying your Mage API key. The response includes a status_url to poll for the result.
Which Plum models can I call?
plum (Plum), plum-max (Plum Max). The default is Plum Max.
Does Plum support reference images or characters?
Plum accepts first_image, last_image, image, additional_images, videos. Plum takes saved characters, references, audio references by @handle in the prompt.
Can I use Plum from Claude or ChatGPT?
Yes. Connect the Mage MCP server to Claude, ChatGPT, Claude Code, Grok, or Cursor and ask for Plum by name. Your assistant reads its options with get_model and quotes the price before it generates.
How long are Plum results kept?
Results and inputs are kept for 30 days. Download anything you want to keep to your own storage.
Start building with Mage
One account, one Gems balance, every model. Pay only for what you generate.