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 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
Make a key
Sign in, open the API page and make a key. Copy it right away, it is shown once.
- 2
Send it as a Bearer token
Put it in the
Authorizationheader of every call. Keys start withcrk_live_. - 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 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.
# 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 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.
| Method | Route | What it does |
|---|---|---|
| POST | /api/v1/images | Make an image. Waits for it and returns the link. Fields: prompt, aspect, model. |
| POST | /api/v1/videos | Start a video. Returns an id with status 202. Fields: prompt, image_url, duration, aspect, model. |
| GET | /api/v1/generations/:id | One generation: pending, complete or failed, with the file link when it is complete. |
| GET | /api/v1/credits | Credits left on the account, plus this key's daily cap and what is left of it today. |
| GET | /api/v1/models | The model ids you can pass as model, with the starting price in credits. |
Fields
| Field | Notes |
|---|---|
| prompt | Required. Up to 4,000 characters for images, 20,000 for videos. |
| aspect | 1:1, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, 2:3, 3:2 or auto. |
| duration | Videos only, in seconds: 3, 5, 8, 10 or 15. |
| image_url | Videos only. An https link to a PNG, JPEG or WebP to start the video from. |
| model | Optional. 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.
Errors
Every error has the same shape, with a code you can match on and a message you can show.
{ "error": { "code": "daily_cap_reached", "message": "..." } }| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | A field is missing or not allowed. The message names it. |
| 401 | unauthorized | The key is missing, wrong or revoked. |
| 402 | plan_required | The account is not on a paid plan. |
| 402 | insufficient_credits | Not enough credits for this call. |
| 404 | not_found | No generation with that id on this account. |
| 429 | daily_cap_reached | The call would pass the key's daily credit cap. It resets at 00:00 UTC. |
| 429 | rate_limited | More than 30 requests in a minute. Wait for the Retry-After seconds. |
| 5xx | server_error, unavailable | Something 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