POST
/
v1
/
videos
Start a video
curl --request POST \
  --url https://platform.jobbit.uk/v1/videos \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "model": "google/veo-3.1",
  "prompt": "A physiotherapist guides a patient through a shoulder stretch in a bright clinic",
  "duration": 8,
  "resolution": "1080p",
  "aspect_ratio": "16:9",
  "generate_audio": false
}
'
import requests

url = "https://platform.jobbit.uk/v1/videos"

payload = {
"model": "google/veo-3.1",
"prompt": "A physiotherapist guides a patient through a shoulder stretch in a bright clinic",
"duration": 8,
"resolution": "1080p",
"aspect_ratio": "16:9",
"generate_audio": False
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'google/veo-3.1',
prompt: 'A physiotherapist guides a patient through a shoulder stretch in a bright clinic',
duration: 8,
resolution: '1080p',
aspect_ratio: '16:9',
generate_audio: false
})
};

fetch('https://platform.jobbit.uk/v1/videos', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://platform.jobbit.uk/v1/videos",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => 'google/veo-3.1',
'prompt' => 'A physiotherapist guides a patient through a shoulder stretch in a bright clinic',
'duration' => 8,
'resolution' => '1080p',
'aspect_ratio' => '16:9',
'generate_audio' => false
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://platform.jobbit.uk/v1/videos"

payload := strings.NewReader("{\n \"model\": \"google/veo-3.1\",\n \"prompt\": \"A physiotherapist guides a patient through a shoulder stretch in a bright clinic\",\n \"duration\": 8,\n \"resolution\": \"1080p\",\n \"aspect_ratio\": \"16:9\",\n \"generate_audio\": false\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://platform.jobbit.uk/v1/videos")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"google/veo-3.1\",\n \"prompt\": \"A physiotherapist guides a patient through a shoulder stretch in a bright clinic\",\n \"duration\": 8,\n \"resolution\": \"1080p\",\n \"aspect_ratio\": \"16:9\",\n \"generate_audio\": false\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://platform.jobbit.uk/v1/videos")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"google/veo-3.1\",\n \"prompt\": \"A physiotherapist guides a patient through a shoulder stretch in a bright clinic\",\n \"duration\": 8,\n \"resolution\": \"1080p\",\n \"aspect_ratio\": \"16:9\",\n \"generate_audio\": false\n}"

response = http.request(request)
puts response.read_body
{
  "id": "vid_01JC8Z4Q7M2N5R6T8V0X",
  "object": "video",
  "model": "google/veo-3.1",
  "status": "pending",
  "held_credits": 520
}
{
"error": {
"code": "upstream_rejected",
"message": "duration must be one of [4, 6, 8]",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}
{
"error": {
"code": "invalid_key",
"message": "the API key is missing or invalid",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}
{
"error": {
"code": "insufficient_credits",
"message": "not enough credits to run this request",
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}
{
"error": {
"code": "insufficient_scope",
"message": "this key does not have the deploy:write permission",
"details": {
"required": "deploy:write"
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}
{
"error": {
"code": "rate_limited",
"message": "too many read requests, retry in 4 s",
"details": {
"group": "read",
"limit": 120,
"window_seconds": 60
},
"request_id": "5d3f0b7c8a2e4e19b6c47a90d1e2f3a4"
}
}

Authorizations

Authorization
string
header
required

An API key from Settings → API keys, sent as Authorization: Bearer jb_live_…

Body

application/json

Together frame_images and input_references may hold at most 8 items.

model
string
required

A video model id from GET /v1/videos/models.

prompt
string
required

What happens in the clip.

Required string length: 1 - 8000
duration
integer

Length in seconds. Must be one of the model's durations.

resolution
string

Must be one of the model's resolutions.

aspect_ratio
string

Must be one of the model's aspect_ratios.

frame_images
object[]

Start or end frames, passed to the video provider as given. The model's frame_images lists what it supports.

input_references
object[]

Reference images or clips, passed to the video provider as given.

generate_audio
boolean

Whether the clip should have sound, for models that can.

Response

The job was accepted.

id
string
required

The job id. Use it with the other video routes.

object
string
required

Always video.

model
string
required

The model used.

status
string
required

pending and in_progress while it runs; completed, failed, cancelled or expired when it is over.

held_credits
number
required

Credits held when the job started: the dearest the clip could cost.

created_at
string

When the provider created the job.

completed_at
string

When the job finished.

error
string

Why it failed, if it did.

outputs
integer

How many clips the job made, once known. Download them with index 0 to 8.

credits_charged
number

Credits actually charged. Present once the job has finished; the hold beyond it is released.