The AnyMake API.
Ask for an outcome, or for one picture or clip. AnyMake picks the models, runs the steps and gives you the files.
Base and auth
Every route below is under https://anymake.dev/v1. Send Authorization: Bearer anymake_sk_… with each call. To get a key, sign in and open Account, then API keys. The key is shown once. JSON in, JSON out.
An error is { "error": "<message>" } with the HTTP status:
| Status | Meaning |
|---|---|
| 400 | The request is wrong. A body that fails validation adds issues; a Make that needs a recipe or an input adds intent and missing. |
| 401 | No key, or a key that does not work. |
| 402 | Not enough credits for this run. |
| 403 | Your key may not do this. |
| 404 | Not found, or not yours. |
| 409 | It conflicts with something still running, such as a request with the same Idempotency-Key. |
| 422 | This Idempotency-Key was used for a different request. |
| 429 | A daily limit was reached. |
| 502 | The job failed. The body is the job, with status: "failed" and its error. Its credits come back. |
| 503 | Try again later. |
Retries: send Idempotency-Key: <any unique string> (1 to 128 printable ASCII characters) with POST /v1/images, POST /v1/images/edit, POST /v1/videos, POST /v1/compare, POST /v1/templates/:slug/runs or POST /v1/make. If the connection drops, send the same request with the same key: you get what the first request made, as it is now, and nothing is made or charged twice. A key is kept for 24 hours and belongs to your account; every client that uses the operator token shares one set of keys. Over MCP, the same is idempotency_key.
The same tools answer over MCP at POST /mcp: see For agents. What each call costs: Pricing.
Make an outcome
A Make runs a recipe's steps in order and stops for you to pick where the recipe asks. Price it first, then start it, then poll it.
| Route | What it does |
|---|---|
POST /v1/make/estimate | The plan and its price in credits. Nothing is stored or charged. |
POST /v1/make | Start a Make. Answers 202 with the Make. The whole plan's credits are reserved; what does not run comes back. |
GET /v1/makes | Your Makes, newest first. Query: status, before, limit (at most 100). |
GET /v1/makes/:id | One Make with its steps, candidates, result and cost. ?wait=<s> (at most 50) answers once it needs a pick or has ended. |
POST /v1/makes/:id/pick | { step_id, asset_id }: one of the waiting step's candidates. The Make goes on. |
POST /v1/makes/:id/cancel | Stop. A Make waiting on a pick ends now; one that is generating stops before its next step. |
GET /v1/recipes | The recipes, with their inputs. |
The request body, for the estimate and the Make:
| Field | Type | Default | What it does |
|---|---|---|---|
recipe | string | chosen from goal | One of the recipes below. Left out, AnyMake picks one from goal, and the only input is inputs.photo. |
goal | string | the recipe's own | What you want, in your words, 600 characters at most. It becomes the direction of every step. |
inputs | object | {} | The recipe's named inputs: your asset id or a data: URL (PNG, JPEG or WebP, 8 MB). |
quality_mode | string | balanced | fast balanced best: 1, 2 or 3 candidates to pick from. |
aspect_ratio | string | the recipe's own | 16:9 9:16 1:1 |
collection_id | string | none | One of your collections: its brand paragraph goes into the prompts. |
auto_pick | boolean | false | Each pick step takes the first candidate, so nobody has to watch. |
recipe_id | string | none | One of your saved recipes, or a public one. |
The recipes:
product-ad: Hero shots of your product from one photo. You pick the best, and it becomes a five-second clip. Inputs:product_image.launch-kit: From a description of your product, and a screenshot and logo if you have them: a creative brief, a hero image with your headline, a square and a vertical image, and a short vertical clip, all in one style. Inputs:screenshot(optional),logo(optional).product-photo: Studio photographs of your product from one photo: a plain background, soft shadows, sharp detail, ready for a shop page. Inputs:product_image.character: From a drawing or photo of your character: a scene with the character in it. You pick the best, and it becomes a five-second clip. Inputs:character_image.thumbnail: A bold thumbnail with large, readable words, from your topic and the title to show. Inputs: none.
Request, POST /v1/make:
{
"recipe": "product-ad",
"inputs": {
"product_image": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAIAAAAAAAAAAAA"
},
"quality_mode": "balanced",
"aspect_ratio": "9:16"
}
Response, GET /v1/makes/:id while it waits for your pick (trimmed):
{
"make_id": "01M3EFNXVGXW9WN3074V3DYH7Z",
"recipe": "product-ad",
"status": "evaluating",
"message": "Pick the one you like best.",
"steps": [
{
"step_id": "hero",
"kind": "edit",
"title": "Hero shots",
"status": "done",
"job_id": "01M3EFNXVGMXJQ1WC4YFXG3GFY",
"candidates": 2,
"assets": [
{
"asset_id": "01M3EFQ4XGHWQ28C9FJ2K2G2TS",
"mime": "image/png",
"width": 1024,
"height": 1024
}
]
},
{
"step_id": "pick",
"kind": "pick",
"title": "Your pick",
"status": "needs_pick",
"from": "hero"
},
{
"step_id": "clip",
"kind": "video",
"title": "Clip",
"status": "waiting",
"cost_estimate_usd": 0.45
}
],
"result": [],
"cost": {
"estimate_usd": 0.58,
"actual_usd": 0.07
},
"reserved_credits": 58,
"error": null
}
A Make goes queued, generating, evaluating (waiting on a pick), generating, then completed; or partially_completed, failed or cancelled. The step with status: "needs_pick" names in from the step whose assets are the candidates. A pick left for 24 hours cancels the Make.
One picture or clip
| Route | What it does |
|---|---|
POST /v1/images | Make one to four pictures from a prompt. |
POST /v1/images/edit | Change a picture by prompt, with an optional mask. |
POST /v1/videos | Make a clip. Answers at once with the job; poll it. |
POST /v1/compare | The same picture request on 2 to 4 models: models in place of model. Answers with a batch_id. |
POST /v1/estimate | The price of a picture request. Nothing runs. |
POST /v1/images, /v1/compare and /v1/estimate:
| Field | Type | Default | What it does |
|---|---|---|---|
prompt | string | required | What to make, 1 to 4000 characters. |
model | string | best | An alias (below) or an exact model id from GET /v1/models. |
negative_prompt | string | none | What to leave out. |
aspect_ratio | string | 1:1 | 1:1 16:9 9:16 4:3 3:4 3:2 2:3 21:9 |
size | string | medium | small medium large |
count | integer | 1 | 1 to 4 images. |
seed | integer | none | For models that take one. |
quality | string | standard | draft standard max |
quality_mode | string | none | fast balanced best: what AnyMake favours when it picks the model. |
preset | string | none | A saved preset's name. Fields you send win over the preset's. |
tags | string[] | none | Up to 32, for finding the result later. |
return_inline | boolean | true | Include a small base64 thumbnail with each asset. |
wait | boolean | true | Answer when the image is done (at most 60 s), or at once with the job to poll. |
POST /v1/images/edit:
| Field | Type | Default | What it does |
|---|---|---|---|
prompt | string | required | What to change, 1 to 4000 characters. |
source_asset_id | string | one of two | The asset to edit. |
source_image | string | one of two | Or the image itself, base64 PNG, JPEG or WebP. |
mask_image | string | none | Base64 PNG; its transparent areas are edited. |
model | string | edit-best | An alias or an exact model id. |
size, count, quality, preset, tags, return_inline, wait | as above | As for POST /v1/images. |
POST /v1/videos. A media reference is an asset id, an https URL or a data: URL:
| Field | Type | Default | What it does |
|---|---|---|---|
prompt | string | required | What happens in the clip, 1 to 4000 characters. |
model | string | video-best, or video-ref with references | An alias or an exact model id. |
image_url | string | none | The start frame: an asset id or an https URL. |
image_urls | string[] | none | 1 to 30 reference images (faces, products, styles). |
video_urls | string[] | none | 1 to 10 reference clips. |
audio_urls | string[] | none | 1 to 10 reference audio files. |
video_url | string | none | The clip to change or continue, with video-edit or video-extend. |
duration_s | integer | 5 | 4 to 30 seconds. |
resolution | string | 720p | 480p 720p |
aspect_ratio | string | 16:9 | 16:9 4:3 1:1 3:4 9:16 21:9 |
generate_audio | boolean | true | Sound with the clip, where the model makes it. |
quality_mode | string | none | fast balanced best |
tags | string[] | none | Up to 32. |
wait | boolean | false | A clip takes minutes: poll the job. |
Aliases name what you want, not a model. best and video-best choose the model for each request; the others stay put. The models behind them change: GET /v1/models lists what runs today.
| Alias | Meaning |
|---|---|
best | AnyMake picks the model for your request |
best-value | Quality per dollar within ~50 Elo of the leader |
fast | Lowest latency |
photoreal | Photographic realism |
open | Open-weights models |
typography | Text rendering, logos, posters |
wild | Loosest content policy |
edit-best | Image editing with mask support |
video-best | AnyMake picks the clip model for your request |
video-fast | Quickest render; 720p, even lengths |
video-ref | Reference images (faces, styles), clips or audio drive the video |
video-edit | Change an existing clip by prompt |
video-extend | Continue an existing clip |
Results
Every picture and clip is a job, and its files are assets.
| Route | What it does |
|---|---|
GET /v1/jobs | Your jobs, newest first. Query: status, source, before, limit (at most 100). ids=a,b (at most 50) returns just those jobs instead. |
GET /v1/jobs/:id | One job with its status, cost and assets. ?inline=true adds thumbnails. |
DELETE /v1/jobs/:id | Hide a job. Its assets stay. |
GET /v1/batches/:id | The jobs of one compare. |
GET /v1/assets | Search your assets. Query: query, tags, model, collection, favorite, make, since, until, limit (at most 100). |
GET /v1/assets/:id | One asset. ?inline=true adds the thumbnail. |
GET /v1/assets/:id/lineage | What the asset was made from, and what was made from it. |
PATCH /v1/assets/:id | Change favorite, tags or visibility. |
DELETE /v1/assets/:id | Delete an asset. |
POST /v1/assets/:id/downloads | Tell AnyMake you saved the file. It helps the model choice. |
An asset:
| Field | What it is |
|---|---|
asset_id | The id. |
url | Signed link to the file. It works for 7 days; ask for the asset again for a new one. |
thumb_url | Signed link to a thumbnail. |
thumb_inline | Base64 WebP thumbnail, when you asked for it inline. |
width, height, mime | The file. |
model, provider | What made it. |
cost_usd | What it cost. |
favorite, visibility, downloads | Yours to change; visibility is public or private. |
created_at | ISO 8601. |
parent_asset_id | What it was made from, when it was made from an asset. |
duration_s | A clip's length. |
make_id | The Make it belongs to. |
Everything else
| Route | What it does |
|---|---|
GET /v1/auth/me | Who the key belongs to. |
DELETE /v1/auth/me | Delete your account and everything it owns. 409 while a job runs or a plan can still charge. |
GET /v1/credits | Your balance and your last events. |
POST /v1/credits/checkout | { pack }, one of 5 10 25 50: a checkout link for a pack. |
GET /v1/subscription | Your plan. |
POST /v1/subscription/checkout | { plan }, maker studio: a checkout link for a plan. |
GET /v1/keys | Your API keys. |
POST /v1/keys | { label }: a new key, shown once. At most 10 active. |
DELETE /v1/keys/:prefix | Revoke a key. |
GET /v1/models | The aliases and the models, with prices. ?kind=image or video. |
GET /v1/prompts | Your recent prompts. |
GET /v1/templates | Templates: a saved clip request with a place for your photo or clip. |
GET /v1/templates/:slug | One template. |
POST /v1/templates/:slug/runs | { media?, subject? }: run a template. A clip job, paid by you. |
PUT /v1/templates/:slug | Save your own template. |
DELETE /v1/templates/:slug | Delete your template. |
GET /v1/recipes/saved | Your saved recipes. |
POST /v1/recipes | Save a recipe from base (a recipe slug) or make_id. Answers 201. |
GET /v1/recipes/:id | One saved recipe: yours, or a public one. |
PATCH /v1/recipes/:id | Change your saved recipe. |
DELETE /v1/recipes/:id | Delete your saved recipe. |
POST /v1/recipes/:id/clone | A private copy of your recipe or a public one. Answers 201. |
GET /v1/presets | Your presets: saved picture settings. |
PUT /v1/presets/:name | Save a preset. |
DELETE /v1/presets/:name | Delete a preset. |
GET /v1/collections | Your collections. |
POST /v1/collections | { name, description?, brand? }: a new collection. |
GET /v1/collections/:id | One collection with its assets. |
PATCH /v1/collections/:id | Change the name, description or brand. |
DELETE /v1/collections/:id | Delete a collection. Its assets stay. |
POST /v1/collections/:id/assets | { asset_id }: add an asset. |
DELETE /v1/collections/:collection_id/assets/:asset_id | Take an asset out. |
Limits and money
- Prompts: 1 to 4000 characters. A Make's
goal: 600. - Uploads: 8 MB a file, 24 MB a request. A Make takes at most 8 inputs.
- Waiting: a picture request with
waitanswers within 60 s, else returns the job to poll.GET /v1/makes/:id?wait=waits at most 50 s. - Lists: at most 100 a page.
- Money: every job is paid from your credits before a provider is called, and refunded when it fails. A Make reserves its whole plan and gives back what it did not use. One credit is one cent.