Skip to main content
Save 20% when you pay yearlySee plans

API

Make images and videos from your own code

Send a prompt over HTTPS, get back a link to the finished file. The same models and the same credits as the Create app, with a daily cap on every key.

curl
curl https://create.vin/api/v1/images \
  -H "Authorization: Bearer crk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "A lighthouse at dusk, soft film look", "aspect": "16:9"}'

# {
#   "id": "...",
#   "status": "complete",
#   "output_url": "https://...",
#   "credits_charged": 12
# }

The numbers in the answer are an example. Real prices are in GET /api/v1/models.

What you can do

Five routes cover it. Everything is JSON, and every call uses the same key.

Make images

POST a prompt and, if you like, an aspect ratio or a model. The call waits and answers with a link to the picture.

Make videos

POST a prompt, a length and an optional starting picture. You get an id straight away, then check on it until the video is ready.

Check credits and models

Read your credits, your key's daily cap and the list of model ids with their starting prices. Reading costs no credits.

Your first call

From a paid account to a picture in three steps.

  1. 1

    Make a key

    Sign in, open the API page and make a key. Copy it right away, it is shown once.

  2. 2

    Send it as a Bearer token

    Put it in the Authorization header of every call. Keys start with crk_live_.

  3. 3

    Call a route

    Post to /api/v1/images or /api/v1/videos. The examples below show both.

Make an image

The call waits for the picture and answers with a link. The link works for about an hour, so save the file if you want to keep it.

curl
curl https://create.vin/api/v1/images \
  -H "Authorization: Bearer crk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "A lighthouse at dusk, soft film look", "aspect": "16:9"}'

Make a video, then wait for it

A video takes a minute or more, so the call answers at once with an id and status 202. Ask for that id every few seconds until the status is complete or failed.

curl
# 1. Start the video
curl https://create.vin/api/v1/videos \
  -H "Authorization: Bearer crk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "Waves rolling onto a beach", "duration": 5, "aspect": "16:9"}'

# 2. Check on it (use the id from step 1)
curl https://create.vin/api/v1/generations/GENERATION_ID \
  -H "Authorization: Bearer crk_live_YOUR_KEY"

Check credits

Shows the credits left on the account and how much of this key's daily cap is left. Reading it costs no credits.

curl
curl https://create.vin/api/v1/credits \
  -H "Authorization: Bearer crk_live_YOUR_KEY"

Routes

All routes live at https://create.vin and need the Authorization header.

MethodRouteWhat it does
POST/api/v1/imagesMake an image. Waits for it and returns the link. Fields: prompt, aspect, model.
POST/api/v1/videosStart a video. Returns an id with status 202. Fields: prompt, image_url, duration, aspect, model.
GET/api/v1/generations/:idOne generation: pending, complete or failed, with the file link when it is complete.
GET/api/v1/creditsCredits left on the account, plus this key's daily cap and what is left of it today.
GET/api/v1/modelsThe model ids you can pass as model, with the starting price in credits.

Fields

FieldNotes
promptRequired. Up to 4,000 characters for images, 20,000 for videos.
aspect1:1, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, 2:3, 3:2 or auto.
durationVideos only, in seconds: 3, 5, 8, 10 or 15.
image_urlVideos only. An https link to a PNG, JPEG or WebP to start the video from.
modelOptional. Leave it out for the default, or pick an id from GET /api/v1/models.

How credits and caps work

Your account's credits pay for every call. Three limits keep a script from spending more than you meant.

Credits come from your plan

There is no separate API balance. Each image or video takes its price in credits from your account, the same price as in the app.

A daily cap on every key

Each key has its own daily credit cap, 500 to start and up to 5,000. A call that would pass it is refused. The cap resets at 00:00 UTC.

30 requests a minute per key

Every call counts, reads included. Past the limit you get a 429 and a Retry-After header.

Failed means refunded

If a generation fails, its credits go back to your account and to the key's cap. Look the id up to see the error.

Plans

The API is for paid plans. Any paid plan works, and the plan's credits are the ones you spend.

A key from an account that is not on a paid plan answers every call with 402 plan_required. You can have up to 5 active keys per account. Compare plans and credits on the pricing page.

See plans and credits

Errors

Every error has the same shape, with a code you can match on and a message you can show.

Error body
{ "error": { "code": "daily_cap_reached", "message": "..." } }
StatusCodeMeaning
400invalid_requestA field is missing or not allowed. The message names it.
401unauthorizedThe key is missing, wrong or revoked.
402plan_requiredThe account is not on a paid plan.
402insufficient_creditsNot enough credits for this call.
404not_foundNo generation with that id on this account.
429daily_cap_reachedThe call would pass the key's daily credit cap. It resets at 00:00 UTC.
429rate_limitedMore than 30 requests in a minute. Wait for the Retry-After seconds.
5xxserver_error, unavailableSomething failed on our side or a model is down. Credits for a generation that fails are given back.

Get your API key

Sign in, make a key, set its daily cap and start calling. You can revoke it whenever you want.

Questions

Using Claude or ChatGPT instead of writing code?

Connect Create over MCP