made
PricingLog inGet it made

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 credits

OpenAI-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

MethodPathPurpose
GET/v1/modelsCatalog with each model’s pricing. Filter with ?kind=image|video or ?query=
POST/v1/costCost preflight for a request body. No job, no charge.
POST/v1/generationsCreate a generation. Returns 202 with a job; credits are debited on acceptance.
GET/v1/generations/:idPoll a job. Asset URLs are re-signed on every read.
POST/v1/generations/:id/cancelCancel a pending or processing job. The charge is refunded.
GET/v1/generationsAccount history, newest first (?limit=, ?before=<ISO>).
POST/v1/images/generationsOpenAI Images-compatible, synchronous GPT Image 2.5 Flare/Sunburst (the original models, unbatched). Base64 response plus a Made receipt.
POST/v1/reframeChange a video's aspect ratio.
POST/v1/expandGenerative uncrop / canvas expand for an image.
POST/v1/compose-videoDeterministic timeline composite (trims, fits, text overlays) to a final MP4.
POST/v1/mediaReserve an upload for reference media; PUT the bytes to the returned URL, then confirm.
GET/v1/balanceCredit balance.
GET/v1/ledgerEvery spend, refund, and grant.
GET · POST · DELETE/v1/keysList, 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/cost before you commit.
  • Credits come with a plan; see Pricing. Unused credits roll over.
  • Errors: 401 bad key, 402 not enough credits, 400 the catalog rejected a parameter, 429 too 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.