Developers
Every model. One key.
The Made API is the same control plane the editor and the MCP connector run on. One set of credits, 70+ image and video models, each priced before it runs. Every job returns a receipt with its charge. Try any model in the playground before you write code.
Priced up front
/v1/cost returns the exact charge in credits before you commit.
The app’s credits
One balance for the app, the API and MCP. Unused credits roll over; failed jobs are refunded.
Receipts and ledger
Every job’s charge, every refund, and every grant.
Base URL and authentication
Create a key at Account → API keys (the secret is shown once) and send it as a bearer token. Keys are account-scoped and revocable. Call the API from your server, never from a browser.
Base URL: https://www.made.app/api
Authorization: Bearer made_sk_…Quickstart
List models, preflight the cost, create a generation, poll it. Model ids are snake_case (for example nano_banana_2, kling_3_pro); the catalog response carries each model's pricing.
# 1. Catalog with prices
curl -H "Authorization: Bearer $MADE_API_KEY" \
https://www.made.app/api/v1/models?kind=video
# 2. What will this cost? (no charge)
curl -H "Authorization: Bearer $MADE_API_KEY" -X POST \
-H "content-type: application/json" \
-d '{"model":"kling_3_pro","prompt":"a red kite over a wheat field","duration":5,"aspect_ratio":"16:9"}' \
https://www.made.app/api/v1/cost
# 3. Create the generation (202 → job)
curl -H "Authorization: Bearer $MADE_API_KEY" -X POST \
-H "content-type: application/json" \
-d '{"model":"kling_3_pro","prompt":"a red kite over a wheat field","duration":5,"aspect_ratio":"16:9"}' \
https://www.made.app/api/v1/generations
# 4. Poll until status is "succeeded"
curl -H "Authorization: Bearer $MADE_API_KEY" \
https://www.made.app/api/v1/generations/job_…Reference media
Image-to-video, edits, and reference-guided models take medias: an array of { value, role } where value is an https URL, an uploaded media_… id, or a prior job_… id. Each model's catalog entry lists the roles it accepts and which are required.
{
"model": "kling_3_pro_i2v",
"prompt": "slow push-in, soft morning light",
"duration": 5,
"medias": [{ "value": "https://example.com/product.jpg", "role": "start_image" }]
}Resolution and audio tiers
Where the provider bills by output resolution (Seedance, WAN, MiniMax, LTX, Grok, Happy Horse), the catalog entry carries costPerSecondByResolution and the request takes resolution using the provider's exact tier key. Kling models carry audioPricing and take audio: true|false. Omit either to get the provider's default tier; send an undeclared tier and the request is rejected rather than re-priced. /v1/cost quotes the exact tier you asked for.
{ "model": "wan_3", "prompt": "…", "duration": 5, "resolution": "480p" } → 25 credits
{ "model": "kling_3_pro", "prompt": "…", "duration": 5, "audio": false } → 56 creditsOpenAI-compatible images
POST /v1/images/generations accepts the native GPT Image request shape (model, prompt, n, size, quality, background, output_format) and returns base64 images plus a made receipt. Point an existing OpenAI Images client at the Made base URL with your Made key. gpt-image-2.5-flare and gpt-image-2.5-sunburst run OpenAI's original models, unbatched, at the sizes the catalog prices (auto means 1024x1024, quality auto means medium). For the cheapest drafts, gpt_image_2_5_fast on /v1/generations is Made's batched version.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| GET | /v1/models | Catalog with each model’s pricing. Filter with ?kind=image|video or ?query= |
| POST | /v1/cost | Cost preflight for a request body. No job, no charge. |
| POST | /v1/generations | Create a generation. Returns 202 with a job; credits are debited on acceptance. |
| GET | /v1/generations/:id | Poll a job. Asset URLs are re-signed on every read. |
| POST | /v1/generations/:id/cancel | Cancel a pending or processing job. The charge is refunded. |
| GET | /v1/generations | Account history, newest first (?limit=, ?before=<ISO>). |
| POST | /v1/images/generations | OpenAI Images-compatible, synchronous GPT Image 2.5 Flare/Sunburst (the original models, unbatched). Base64 response plus a Made receipt. |
| POST | /v1/reframe | Change a video's aspect ratio. |
| POST | /v1/expand | Generative uncrop / canvas expand for an image. |
| POST | /v1/compose-video | Deterministic timeline composite (trims, fits, text overlays) to a final MP4. |
| POST | /v1/media | Reserve an upload for reference media; PUT the bytes to the returned URL, then confirm. |
| GET | /v1/balance | Credit balance. |
| GET | /v1/ledger | Every spend, refund, and grant. |
| GET · POST · DELETE | /v1/keys | List, create, and revoke API keys. |
Billing, in plain terms
- Every model's price is on the price sheet and in
/v1/models. Charges and balances are in credits: fields named in cents (customerCostCents,max_cost_cents,balanceCents) count credits, so 56 is 56 credits. - Credits are debited when a job is accepted and refunded automatically if it fails or is canceled before it succeeds.
- Reference-priced models (per input second, per reference image) are quoted exactly by
/v1/costbefore you commit. - Credits come with a plan; see Pricing. Unused credits roll over.
- Errors:
401bad key,402not enough credits,400the catalog rejected a parameter,429too many refunded failures in a row.
Agents: use the MCP server
For Claude, Cursor, ChatGPT, and other MCP clients, connect https://mcp.made.app/mcp instead. It signs in with OAuth, needs no key, spends the same credits at the same prices, and puts the price in every tool response. MCP setup.
Blender: Made for Blender
A Blender add-on built on this API: it renders your camera's view of a blockout as a previs, uploads it with POST /v1/media, quotes it with /v1/cost and films it on seedance_2_5_video_reference or seedance_2_0_mini_video_reference with a request_id and max_cost_cents. It also runs a local MCP bridge so assistants can edit the open scene. Made for Blender.
The machine-readable summary for agents is at /llms.txt. Questions: support@made.app.