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:

StatusMeaning
400The request is wrong. A body that fails validation adds issues; a Make that needs a recipe or an input adds intent and missing.
401No key, or a key that does not work.
402Not enough credits for this run.
403Your key may not do this.
404Not found, or not yours.
409It conflicts with something still running, such as a request with the same Idempotency-Key.
422This Idempotency-Key was used for a different request.
429A daily limit was reached.
502The job failed. The body is the job, with status: "failed" and its error. Its credits come back.
503Try 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.

RouteWhat it does
POST /v1/make/estimateThe plan and its price in credits. Nothing is stored or charged.
POST /v1/makeStart a Make. Answers 202 with the Make. The whole plan's credits are reserved; what does not run comes back.
GET /v1/makesYour Makes, newest first. Query: status, before, limit (at most 100).
GET /v1/makes/:idOne 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/cancelStop. A Make waiting on a pick ends now; one that is generating stops before its next step.
GET /v1/recipesThe recipes, with their inputs.

The request body, for the estimate and the Make:

FieldTypeDefaultWhat it does
recipestringchosen from goalOne of the recipes below. Left out, AnyMake picks one from goal, and the only input is inputs.photo.
goalstringthe recipe's ownWhat you want, in your words, 600 characters at most. It becomes the direction of every step.
inputsobject{}The recipe's named inputs: your asset id or a data: URL (PNG, JPEG or WebP, 8 MB).
quality_modestringbalancedfast balanced best: 1, 2 or 3 candidates to pick from.
aspect_ratiostringthe recipe's own16:9 9:16 1:1
collection_idstringnoneOne of your collections: its brand paragraph goes into the prompts.
auto_pickbooleanfalseEach pick step takes the first candidate, so nobody has to watch.
recipe_idstringnoneOne of your saved recipes, or a public one.

The recipes:

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

RouteWhat it does
POST /v1/imagesMake one to four pictures from a prompt.
POST /v1/images/editChange a picture by prompt, with an optional mask.
POST /v1/videosMake a clip. Answers at once with the job; poll it.
POST /v1/compareThe same picture request on 2 to 4 models: models in place of model. Answers with a batch_id.
POST /v1/estimateThe price of a picture request. Nothing runs.

POST /v1/images, /v1/compare and /v1/estimate:

FieldTypeDefaultWhat it does
promptstringrequiredWhat to make, 1 to 4000 characters.
modelstringbestAn alias (below) or an exact model id from GET /v1/models.
negative_promptstringnoneWhat to leave out.
aspect_ratiostring1:11:1 16:9 9:16 4:3 3:4 3:2 2:3 21:9
sizestringmediumsmall medium large
countinteger11 to 4 images.
seedintegernoneFor models that take one.
qualitystringstandarddraft standard max
quality_modestringnonefast balanced best: what AnyMake favours when it picks the model.
presetstringnoneA saved preset's name. Fields you send win over the preset's.
tagsstring[]noneUp to 32, for finding the result later.
return_inlinebooleantrueInclude a small base64 thumbnail with each asset.
waitbooleantrueAnswer when the image is done (at most 60 s), or at once with the job to poll.

POST /v1/images/edit:

FieldTypeDefaultWhat it does
promptstringrequiredWhat to change, 1 to 4000 characters.
source_asset_idstringone of twoThe asset to edit.
source_imagestringone of twoOr the image itself, base64 PNG, JPEG or WebP.
mask_imagestringnoneBase64 PNG; its transparent areas are edited.
modelstringedit-bestAn alias or an exact model id.
size, count, quality, preset, tags, return_inline, waitas aboveAs for POST /v1/images.

POST /v1/videos. A media reference is an asset id, an https URL or a data: URL:

FieldTypeDefaultWhat it does
promptstringrequiredWhat happens in the clip, 1 to 4000 characters.
modelstringvideo-best, or video-ref with referencesAn alias or an exact model id.
image_urlstringnoneThe start frame: an asset id or an https URL.
image_urlsstring[]none1 to 30 reference images (faces, products, styles).
video_urlsstring[]none1 to 10 reference clips.
audio_urlsstring[]none1 to 10 reference audio files.
video_urlstringnoneThe clip to change or continue, with video-edit or video-extend.
duration_sinteger54 to 30 seconds.
resolutionstring720p480p 720p
aspect_ratiostring16:916:9 4:3 1:1 3:4 9:16 21:9
generate_audiobooleantrueSound with the clip, where the model makes it.
quality_modestringnonefast balanced best
tagsstring[]noneUp to 32.
waitbooleanfalseA 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.

AliasMeaning
bestAnyMake picks the model for your request
best-valueQuality per dollar within ~50 Elo of the leader
fastLowest latency
photorealPhotographic realism
openOpen-weights models
typographyText rendering, logos, posters
wildLoosest content policy
edit-bestImage editing with mask support
video-bestAnyMake picks the clip model for your request
video-fastQuickest render; 720p, even lengths
video-refReference images (faces, styles), clips or audio drive the video
video-editChange an existing clip by prompt
video-extendContinue an existing clip

Results

Every picture and clip is a job, and its files are assets.

RouteWhat it does
GET /v1/jobsYour 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/:idOne job with its status, cost and assets. ?inline=true adds thumbnails.
DELETE /v1/jobs/:idHide a job. Its assets stay.
GET /v1/batches/:idThe jobs of one compare.
GET /v1/assetsSearch your assets. Query: query, tags, model, collection, favorite, make, since, until, limit (at most 100).
GET /v1/assets/:idOne asset. ?inline=true adds the thumbnail.
GET /v1/assets/:id/lineageWhat the asset was made from, and what was made from it.
PATCH /v1/assets/:idChange favorite, tags or visibility.
DELETE /v1/assets/:idDelete an asset.
POST /v1/assets/:id/downloadsTell AnyMake you saved the file. It helps the model choice.

An asset:

FieldWhat it is
asset_idThe id.
urlSigned link to the file. It works for 7 days; ask for the asset again for a new one.
thumb_urlSigned link to a thumbnail.
thumb_inlineBase64 WebP thumbnail, when you asked for it inline.
width, height, mimeThe file.
model, providerWhat made it.
cost_usdWhat it cost.
favorite, visibility, downloadsYours to change; visibility is public or private.
created_atISO 8601.
parent_asset_idWhat it was made from, when it was made from an asset.
duration_sA clip's length.
make_idThe Make it belongs to.

Everything else

RouteWhat it does
GET /v1/auth/meWho the key belongs to.
DELETE /v1/auth/meDelete your account and everything it owns. 409 while a job runs or a plan can still charge.
GET /v1/creditsYour balance and your last events.
POST /v1/credits/checkout{ pack }, one of 5 10 25 50: a checkout link for a pack.
GET /v1/subscriptionYour plan.
POST /v1/subscription/checkout{ plan }, maker studio: a checkout link for a plan.
GET /v1/keysYour API keys.
POST /v1/keys{ label }: a new key, shown once. At most 10 active.
DELETE /v1/keys/:prefixRevoke a key.
GET /v1/modelsThe aliases and the models, with prices. ?kind=image or video.
GET /v1/promptsYour recent prompts.
GET /v1/templatesTemplates: a saved clip request with a place for your photo or clip.
GET /v1/templates/:slugOne template.
POST /v1/templates/:slug/runs{ media?, subject? }: run a template. A clip job, paid by you.
PUT /v1/templates/:slugSave your own template.
DELETE /v1/templates/:slugDelete your template.
GET /v1/recipes/savedYour saved recipes.
POST /v1/recipesSave a recipe from base (a recipe slug) or make_id. Answers 201.
GET /v1/recipes/:idOne saved recipe: yours, or a public one.
PATCH /v1/recipes/:idChange your saved recipe.
DELETE /v1/recipes/:idDelete your saved recipe.
POST /v1/recipes/:id/cloneA private copy of your recipe or a public one. Answers 201.
GET /v1/presetsYour presets: saved picture settings.
PUT /v1/presets/:nameSave a preset.
DELETE /v1/presets/:nameDelete a preset.
GET /v1/collectionsYour collections.
POST /v1/collections{ name, description?, brand? }: a new collection.
GET /v1/collections/:idOne collection with its assets.
PATCH /v1/collections/:idChange the name, description or brand.
DELETE /v1/collections/:idDelete a collection. Its assets stay.
POST /v1/collections/:id/assets{ asset_id }: add an asset.
DELETE /v1/collections/:collection_id/assets/:asset_idTake an asset out.

Limits and money