---
title: "Made API — Every AI Image and Video Model, One Key"
description: "REST API for generative media: 70+ image and video models (Veo, Kling, Seedance, WAN, Nano Banana, Seedream, FLUX, GPT Image) priced in credits, with cost preflight, receipts, and a ledger. The same credits as the Made app."
url: https://www.made.app/developers
---

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](https://www.made.app/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](https://www.made.app/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

| 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](https://www.made.app/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](https://www.made.app/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](https://www.made.app/mcp).

## 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](https://www.made.app/blender).

The machine-readable summary for agents is at [/llms.txt](https://www.made.app/llms.txt). Questions: support@made.app.

---

Markdown version of https://www.made.app/developers. Every public Made page has one at its URL plus .md (https://www.made.app/developers.md). Site summary for AI assistants: https://www.made.app/llms.txt
