REST API · v1

Blipix API

Make faceless videos from your own code. Send a topic, a voice and an art style: Blipix writes the script, records the voice-over, generates the scene images and renders an MP4 you can download.

Works on every paid plan. The API creates and reads videos; it can't post to TikTok, YouTube or Instagram, and it can't create series.

Illustrative responses for one video, checked once a minute until the MP4 exists.
Base URL
https://app.blipix.pro/api/v1
Auth
Bearer key, starts with blx_
Rate limit
60 requests a minute per account
Plans
Any paid plan

Quickstart

From API key to MP4

Copy your key, start a video, then check on it until the render is done. The examples read the key from an environment variable so it stays out of your code.

  1. 1

    Copy your key

    Sign in on a paid plan, open Settings in the app and copy the key under API Key. It starts with blx_.

    Terminal
    export BLIPIX_API_KEY="blx_your_api_key"
  2. 2

    Start a video

    A prompt and a voice are enough; every other field has a default. The call answers once the script, voice-over and images exist and the render has been requested, so it can stay open for a while.

    curl https://app.blipix.pro/api/v1/videos/create \
      -X POST \
      -H "Authorization: Bearer $BLIPIX_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "prompt": "Five surprising facts about octopuses",
        "voice": "alloy"
      }'
  3. 3

    Check until the MP4 is ready

    Ask for the video once a minute. When renderStatus is completed, videoUrl holds the MP4.

    # Checks once a minute. Needs jq.
    while true; do
      video=$(curl -s https://app.blipix.pro/api/v1/videos/VIDEO_ID \
        -H "Authorization: Bearer $BLIPIX_API_KEY")
      render=$(echo "$video" | jq -r .renderStatus)
      echo "$render $(echo "$video" | jq -r .renderProgress)%"
      case "$render" in completed|failed|cancelled) break ;; esac
      sleep 60
    done
    echo "$video" | jq -r .videoUrl

Start here

Authentication

Send your key as a Bearer token in the Authorization header of every request.

Header
Authorization: Bearer blx_your_api_key
Where to find it
In the app under Settings, API Key. Each account has one key, created the first time that page opens.
Who can use it
Accounts on any paid plan. A key from an account on the free plan gets 403, and a key stops working if the subscription ends.
Keep it private
Anyone holding the key can spend your credits. Call the API from your server, never from code that runs in a browser.

Start here

Requests and responses

Base URL
https://app.blipix.pro/api/v1
Request bodies
JSON, sent with Content-Type: application/json. A JSON body sent without that header isn't parsed, and the call fails with 400.
Responses
Always JSON. An error has one error field with a message, next to the HTTP status.
Timestamps
ISO 8601 strings in UTC, such as 2026-10-18T09:30:00.000Z.
Methods
Each path takes one method. Any other method returns 405 before your key is checked.

Start here

Rate limits

Two limits apply, and both answer with 429 once you go over.

LimitCounted perWindowOver the limit
60 requestsAccount (your API key)1 minute429 with a Retry-After header giving the seconds to wait
20 requestsIP address. Every request counts, including ones with a wrong key.15 minutes429 with the message Too many requests. Try again later.

Successful responses carry X-RateLimit-Limit and X-RateLimit-Remaining for the per-account limit. Because of the per-IP limit, check on a video once a minute rather than every few seconds.

Start here

Errors

A failed call returns the matching HTTP status and a JSON body with the reason.

Unknown key401
{
  "error": "Invalid API key"
}
Not enough credits402
{
  "error": "Insufficient credits",
  "credits": {
    "used": 595,
    "total": 600,
    "remaining": 5
  }
}
StatusMeaningMessages you may see
400A required field is missing or a value isn't allowed (POST /videos/create)"prompt" is required (e.g., "Top 5 AI Tools in 2026") "voice" is required (e.g., "alloy", "nova") Invalid aspectRatio. Valid options: 9:16, 16:9, 1:1 Invalid duration. Valid options: 30-60, 60-90, ...
401The key is missing, malformed or unknown. A token that doesn't start with blx_ is read as an app session and gets the last message.Missing or invalid Authorization header. Use: Bearer YOUR_API_KEY Invalid API key format Invalid API key Invalid or expired session. Sign in again.
402Not enough credits for the requested length. The body also has a credits object.Insufficient credits
403The account or the voice can't be usedAPI access requires a paid plan. Upgrade at https://app.blipix.pro/upgrade Account is blocked This voice is not available on your account.
404No video with that id on your accountVideo not found
405Wrong HTTP method for the pathMethod not allowed
429A rate limit was reached (see above)Rate limit exceeded. Max 60 requests per minute. Too many requests. Try again later.
500Something failed on the Blipix sideFailed to create video Failed to fetch videos and the same pattern for other lists

POST /videos/create also passes on errors from the generation step with their own status, for example 408 when generation runs past 35 minutes. The credits taken for that call are refunded.

GET/api/v1/me

Retrieve your account

Your profile, plan and credit balance. A quick way to check that a key works before you spend credits.

Response fields

FieldDescription
idstringYour account id.
firstName, lastNamestringAs set in the app. Empty string when not set.
emailstringThe email on the account.
planstringPlan key, such as STARTER, CREATOR, PRO, PREMIUM or ULTRA.
countrystringTwo-letter country code, or an empty string.
credits.usednumberCredits spent since the plan last renewed.
credits.totalnumberPlan credits plus any top-up credits.
credits.remainingnumberTotal minus used, never below 0.

Example request

curl https://app.blipix.pro/api/v1/me \
  -H "Authorization: Bearer $BLIPIX_API_KEY"

Example response

Response200
{
  "id": "USER_ID",
  "firstName": "Jane",
  "lastName": "Doe",
  "email": "you@example.com",
  "plan": "CREATOR",
  "country": "US",
  "credits": {
    "used": 130,
    "total": 600,
    "remaining": 470
  }
}
GET/api/v1/styles

List art styles

Every art style you can pass as style when you create a video, sorted by name. The style gallery shows what each one looks like.

Response fields

FieldDescription
countnumberHow many styles are in the list.
styles[].idstringStyle id.
styles[].namestringThe value to send as style.
styles[].thumbnailstring or nullURL of a sample image.
styles[].categoriesstring[]Tags such as realistic, story or history.
styles[].bestForstring or nullShort note on the topics the style suits.
styles[].isNew, trendingbooleanLabels the app shows in its style picker.

Example request

curl https://app.blipix.pro/api/v1/styles \
  -H "Authorization: Bearer $BLIPIX_API_KEY"

Example response shortened to two styles

Response200
{
  "count": 2,
  "styles": [
    {
      "id": "STYLE_ID_1",
      "name": "Blipix",
      "thumbnail": "https://...",
      "categories": ["realistic", "history"],
      "bestFor": "true crime, history & realistic storytelling",
      "isNew": false,
      "trending": false
    },
    {
      "id": "STYLE_ID_2",
      "name": "Cinematic",
      "thumbnail": "https://...",
      "categories": ["realistic", "story", "history"],
      "bestFor": "movie-style stories, history & documentaries",
      "isNew": false,
      "trending": false
    }
  ]
}
GET/api/v1/voices

List voices

The narrator voices your account can use, sorted by name: the Blipix voices plus any voice you cloned. Send voiceId as voice when you create a video.

Response fields

FieldDescription
countnumberHow many voices are in the list.
voices[].voiceIdstringThe value to send as voice.
voices[].idstringId of the voice record (not the value to send).
voices[].namestringDisplay name.
voices[].languagestringLanguage code. en when none is set.
voices[].gender, age, accent, useCasestring or nullThe labels the app filters voices by.
voices[].previewstring or nullURL of an audio sample.
voices[].avatarUrl, designstring or nullPicture and CSS gradient the app shows for the voice.
voices[].custombooleantrue for a voice you cloned. Cloned voices are only listed for their owner.
voices[].free, freeDefault, main, isNewbooleanFlags the app uses to offer, preselect and label voices.

Example request

curl https://app.blipix.pro/api/v1/voices \
  -H "Authorization: Bearer $BLIPIX_API_KEY"

Example response shortened to two voices

Response200
{
  "count": 2,
  "voices": [
    {
      "id": "SPEAKER_ID_1",
      "voiceId": "alloy",
      "name": "Alloy",
      "language": "en",
      "gender": "male",
      "age": "young",
      "accent": "american",
      "useCase": "Narration, General",
      "avatarUrl": "https://...",
      "design": null,
      "preview": "https://...",
      "free": false,
      "freeDefault": false,
      "main": false,
      "isNew": false,
      "custom": false
    },
    {
      "id": "SPEAKER_ID_2",
      "voiceId": "YOUR_CLONED_VOICE_ID",
      "name": "My narrator",
      "language": "en",
      "gender": null,
      "age": null,
      "accent": null,
      "useCase": null,
      "avatarUrl": null,
      "design": null,
      "preview": "https://...",
      "free": false,
      "freeDefault": false,
      "main": false,
      "isNew": false,
      "custom": true
    }
  ]
}
POST/api/v1/videos/create

Create a video

Starts a video from a prompt. The AI writes a script in your language, Blipix records the voice-over with the voice you chose, generates an image for each scene in your art style, then queues the MP4 render. The credits for the length are taken when the call starts.

A long request

The connection stays open while the script, voice-over and images are generated, and the 201 comes back as soon as the MP4 render is requested. Give your HTTP client a long timeout. If it gives up before an answer comes back, look at GET /videos before you retry: a second call starts, and charges for, a second video.

Body parameters

ParameterDescription
promptstringrequiredWhat the video is about, in plain words. The AI writes the script from it.
voicestringrequiredA voiceId from GET /voices. An id that matches no voice falls back to the default narrator instead of failing.
stylestringoptionaldefault BlipixA style name from GET /styles, in any letter case. An unknown name falls back to Blipix.
durationstringoptionaldefault 30-60One of the length ranges below. It sets the script length and the credit cost.
aspectRatiostringoptionaldefault 9:169:16, 16:9 or 1:1.
languagestringoptionaldefault enLanguage of the script and the narration, as a code from the list below. The value isn’t validated, so stick to these codes.

Lengths and credits

durationLengthCredits
30-6030 to 60 seconds10
60-901 to 1.5 minutes10
90-1201.5 to 2 minutes20
120-1502 to 2.5 minutes20
150-1802.5 to 3 minutes30
180-2103 to 3.5 minutes30
210-3003.5 to 5 minutes50
300-4205 to 7 minutes70
420-6007 to 10 minutes100
600-72010 to 12 minutes120
720-90012 to 15 minutes150

Language codes

  • Arabicar
  • Bulgarianbg
  • Chinesezh
  • Croatianhr
  • Czechcs
  • Danishda
  • Dutchnl
  • Englishen
  • Finnishfi
  • Filipinofil
  • Frenchfr
  • Germande
  • Greekel
  • Hindihi
  • Hungarianhu
  • Indonesianid
  • Italianit
  • Japaneseja
  • Koreanko
  • Malayms
  • Norwegianno
  • Polishpl
  • Portuguesept
  • Romanianro
  • Russianru
  • Slovaksk
  • Spanishes
  • Swedishsv
  • Tamilta
  • Turkishtr
  • Ukrainianuk
  • Vietnamesevi

What happens after the call

  1. While the request is open

    status: "processing"

    Once the script and voice-over exist, the video shows up in GET /videos while its scene images are generated.

  2. After the 201

    status: "ready"renderStatus: "queued"

    The render has been requested. Once it is picked up, renderStatus reads queued (it can be null just before) and renderProgress on GET /videos/:id counts from 0 to 100.

  3. Done

    renderStatus: "completed"

    videoUrl holds the MP4. The video is also in your Blipix account, where you can open it in the editor.

If generation fails, the call returns an error, the video's status becomes error and the credits are refunded. If the render fails, renderStatus becomes failed; open the video in the app to render it again.

Example request

curl https://app.blipix.pro/api/v1/videos/create \
  -X POST \
  -H "Authorization: Bearer $BLIPIX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "Five surprising facts about octopuses",
    "voice": "alloy",
    "style": "Cinematic",
    "duration": "30-60",
    "aspectRatio": "9:16",
    "language": "en"
  }'

Example response

Response201
{
  "id": "VIDEO_ID",
  "status": "processing",
  "message": "Video generation started. Poll GET /api/v1/videos/:id to check status.",
  "creditsCost": 10
}

status in this response is always processing. Read the real state from GET /videos/:id.

GET/api/v1/videos/:id

Retrieve a video

One video by id, with its script, voice-over audio and render progress. This is the call to repeat after you create a video.

Path parameter

ParameterDescription
idstringrequiredThe id returned by POST /videos/create or listed by GET /videos. Ids from another account return 404.

Response fields

FieldDescription
id, title, descriptionstringTitle and description are written by the AI with the script.
scriptstringThe narrated text.
statusstringGeneration state. Values below.
typestringThe template behind the video. Videos made with this API are prompt; app videos can be standard, script, pov, asmr, gaming, brainrot, ugc, music, documentary, anatomy, talking_avatar and others.
durationnumberNarration length, counted as seconds (52.4 is just under a minute).
aspectRatiostring9:16, 16:9 or 1:1.
renderStatusstring or nullMP4 render state. Values below.
renderProgressnumber or null0 to 100 while a render runs, 100 once completed, otherwise null.
videoUrlstring or nullThe MP4, once renderStatus is completed.
audioUrlstring or nullThe voice-over audio file.
thumbnailUrlstring or nullA stored thumbnail image. Usually null for videos made with the API.
hashtagsstring[]Hashtags written with the script.
createdAtstring or nullWhen the video record was created, ISO 8601 UTC.

status values

processing
Images are still being generated.
ready
Generation finished. Check renderStatus for the MP4.
error
Generation failed.
failed
Used by Talking Avatar videos made in the app when the avatar step fails.

renderStatus values

null
No render has started.
queued
Queued or rendering; see renderProgress.
completed
The MP4 is at videoUrl.
failed
The render stopped with an error.
cancelled
The render was cancelled in the app.

Example request

curl https://app.blipix.pro/api/v1/videos/VIDEO_ID \
  -H "Authorization: Bearer $BLIPIX_API_KEY"

Example response

Response200
{
  "id": "VIDEO_ID",
  "title": "Five Surprising Facts About Octopuses",
  "description": "Three hearts, blue blood and suckers that can taste...",
  "script": "An octopus has three hearts...",
  "status": "ready",
  "type": "prompt",
  "duration": 52.4,
  "aspectRatio": "9:16",
  "renderStatus": "completed",
  "renderProgress": 100,
  "videoUrl": "https://...",
  "thumbnailUrl": null,
  "audioUrl": "https://...",
  "hashtags": ["#octopus", "#animalfacts"],
  "createdAt": "2026-10-18T09:30:00.000Z"
}
GET/api/v1/videos

List videos

Your videos, newest first, including the ones you made in the app. Items have the same fields as GET /videos/:id, minus script, renderProgress and audioUrl.

Query parameters

ParameterDescription
limitintegeroptionaldefault 20How many videos to return, from 1 to 100. Larger values are capped at 100.
statusstringoptionalOnly videos with this exact status: processing, ready, error or failed. Leave it out to get all of them.

Response fields

FieldDescription
countnumberNumber of items in videos.
videosobject[]The videos, newest first.

Example request

curl -G https://app.blipix.pro/api/v1/videos \
  -d status=ready -d limit=10 \
  -H "Authorization: Bearer $BLIPIX_API_KEY"

Example response

Response200
{
  "count": 2,
  "videos": [
    {
      "id": "VIDEO_ID_1",
      "title": "Five Surprising Facts About Octopuses",
      "description": "Three hearts, blue blood and suckers that can taste...",
      "status": "ready",
      "type": "prompt",
      "duration": 52.4,
      "aspectRatio": "9:16",
      "renderStatus": "completed",
      "videoUrl": "https://...",
      "thumbnailUrl": null,
      "hashtags": ["#octopus", "#animalfacts"],
      "createdAt": "2026-10-18T09:30:00.000Z"
    },
    {
      "id": "VIDEO_ID_2",
      "title": "The Lighthouse Keeper's Last Night",
      "description": "...",
      "status": "ready",
      "type": "standard",
      "duration": 58.1,
      "aspectRatio": "9:16",
      "renderStatus": null,
      "videoUrl": null,
      "thumbnailUrl": null,
      "hashtags": ["#history"],
      "createdAt": "2026-10-16T17:05:12.000Z"
    }
  ]
}
GET/api/v1/series

List series

A read-only view of the series you set up in the app, newest first. Connected accounts appear only as platform names; their details and tokens are never returned.

Query parameters

ParameterDescription
limitintegeroptionaldefault 20How many series to return, from 1 to 100. Larger values are capped at 100.
statusstringoptionalactive or paused. Any other value is ignored.

Response fields

FieldDescription
count, totalnumbercount is how many came back after limit; total is how many matched the filter.
series[].statusstringactive when the series is enabled and passed its health check, otherwise paused.
series[].disabledReasonstring or nullWhy a series stopped, when known, such as Not enough credits, Paused manually or Last video was deleted.
series[].workerStatusstring or nullWhere the scheduler is: processed, processing, rendering, failed or stopped.
series[].frequencyobject or nulllabel, perPeriod and period, for example 3 per week.
series[].days, times, timezonestring[], string[], stringPosting days in week order and times as you set them, both in the series’ time zone.
series[].nextPublishAtstring or nullNext scheduled run, ISO 8601 UTC. A paused series keeps the last scheduled time, which may be in the past.
series[].niche, language, duration, aspectRatiostring or nullThe video settings each episode uses.
series[].creditsPerVideonumber or nullCredits one episode costs.
series[].channelCount, platformsnumber, string[]How many accounts the series posts to, and which platforms: youtube, tiktok, instagram.
series[].lastVideoIdstring or nullThe latest episode. Pass it to GET /videos/:id.
series[].lastCompletedAt, createdAtstring or nullISO 8601 UTC.

Example request

curl -G https://app.blipix.pro/api/v1/series \
  -d status=active \
  -H "Authorization: Bearer $BLIPIX_API_KEY"

Example response

Response200
{
  "count": 1,
  "total": 1,
  "series": [
    {
      "id": "SERIES_ID",
      "name": "Daily history facts",
      "status": "active",
      "workerStatus": "processed",
      "disabledReason": null,
      "frequency": {
        "label": "3 times a week",
        "perPeriod": 3,
        "period": "week"
      },
      "days": ["Monday", "Wednesday", "Friday"],
      "times": ["9:00 AM"],
      "timezone": "America/New_York",
      "nextPublishAt": "2026-10-19T13:00:00.000Z",
      "niche": "Interesting History",
      "language": "en",
      "duration": "30-60",
      "aspectRatio": "9:16",
      "creditsPerVideo": 10,
      "channelCount": 2,
      "platforms": ["youtube", "tiktok"],
      "lastVideoId": "VIDEO_ID",
      "lastCompletedAt": "2026-10-16T13:04:11.000Z",
      "createdAt": "2026-09-02T18:20:00.000Z"
    }
  ]
}

Limits

What the API doesn't do

Worth knowing before you build. The API covers making videos and reading your account; the rest happens in the app.

  • Post to social accounts. Videos can't be published to TikTok, YouTube or Instagram through the API. Download the MP4 from videoUrl, or post from the app.
  • Create or change series. GET /series only reads them. Setting up, pausing and editing series happens in the app.
  • Use another template or your own script. Every API video starts from a prompt, and the AI writes the script.
  • Set captions, music or effects. API videos use default settings. Open one in the app's editor to change them.
  • Call you back. There are no webhooks. Repeat GET /videos/:id until the render completes.
  • Delete videos. There is no delete endpoint.

Need something that isn't here?

Tell us what you are building and which endpoint would help. API access comes with every paid plan.