MENU navbar-image

Introduction

The easiest API for video editing and generation. Create videos with AI generated images, subtitles, emojis and more.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

You can retrieve your token by visiting your profile page and creating a token.

Endpoints

GET api/me

requires authentication

Example request:
curl --request GET \
    --get "https://api.visibot.app/api/me" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.visibot.app/api/me"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated",
    "error": "Invalid token"
}
 

Request      

GET api/me

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

GET api/usage

requires authentication

Example request:
curl --request GET \
    --get "https://api.visibot.app/api/usage" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api.visibot.app/api/usage"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
 

{
    "message": "Unauthenticated",
    "error": "Invalid token"
}
 

Request      

GET api/usage

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Process telegram subscriber from ManyChat

requires authentication

Example request:
curl --request POST \
    "https://api.visibot.app/api/webhooks/manychat/telegram-subscriber" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"manychat_id\": \"architecto\",
    \"telegram_id\": \"architecto\"
}"
const url = new URL(
    "https://api.visibot.app/api/webhooks/manychat/telegram-subscriber"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "manychat_id": "architecto",
    "telegram_id": "architecto"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/webhooks/manychat/telegram-subscriber

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

manychat_id   string   

Example: architecto

telegram_id   string   

Example: architecto

User Registration API

APIs for user registration through various integrations

Register a new user

requires authentication

This endpoint allows users to register through various integrations. It requires a valid API key for authentication.

Example request:
curl --request POST \
    "https://api.visibot.app/api/user/register" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"user@example.com\",
    \"first_name\": \"John\",
    \"last_name\": \"Doe\",
    \"integration_id\": \"AKfycbw1234567890\",
    \"api_key\": \"your-api-key-here\",
    \"manychat_tag\": \"wordpress_signup\"
}"
const url = new URL(
    "https://api.visibot.app/api/user/register"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "email": "user@example.com",
    "first_name": "John",
    "last_name": "Doe",
    "integration_id": "AKfycbw1234567890",
    "api_key": "your-api-key-here",
    "manychat_tag": "wordpress_signup"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "message": "User registered successfully",
    "user": {
        "id": 123,
        "email": "user@example.com",
        "first_name": "John",
        "last_name": "Doe",
        "api_token": "your-api-token-here"
    }
}
 

Example response (401):


{
    "message": "Invalid API key"
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "email": [
            "The email field is required."
        ]
    }
}
 

Request      

POST api/user/register

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

email   string   

The user's email address. Example: user@example.com

first_name   string  optional  

optional The user's first name. Example: John

last_name   string  optional  

optional The user's last name. Example: Doe

integration_id   string  optional  

optional The integration unique identifier. Example: AKfycbw1234567890

api_key   string   

The API key for authentication. Example: your-api-key-here

manychat_tag   string  optional  

optional The tag to add in ManyChat. Example: wordpress_signup

Video API

APIs for video processing

Create a new video

requires authentication

Process a video from URL with custom caption settings

Example request:
curl --request POST \
    "https://api.visibot.app/api/video/create" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"language\": \"en\",
    \"video_url\": \"https:\\/\\/example.com\\/video.mp4\",
    \"resize_for_social_media\": true,
    \"captions_font_color\": \"#FF5733\",
    \"captions_highlight_color\": \"#FF5733\",
    \"captions_outline_color\": \"#FF5733\",
    \"captions_position\": \"bottom\",
    \"captions_font_size\": 24,
    \"captions_font_family\": \"Rubik\",
    \"captions_add_emojis\": true,
    \"captions_outline_thickness\": 5,
    \"callback\": \"https:\\/\\/example.com\\/notify-me .\"
}"
const url = new URL(
    "https://api.visibot.app/api/video/create"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "language": "en",
    "video_url": "https:\/\/example.com\/video.mp4",
    "resize_for_social_media": true,
    "captions_font_color": "#FF5733",
    "captions_highlight_color": "#FF5733",
    "captions_outline_color": "#FF5733",
    "captions_position": "bottom",
    "captions_font_size": 24,
    "captions_font_family": "Rubik",
    "captions_add_emojis": true,
    "captions_outline_thickness": 5,
    "callback": "https:\/\/example.com\/notify-me ."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "video_id": "f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2",
    "status": "processing"
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "video_url": [
            "The video url field is required."
        ]
    }
}
 

Request      

POST api/video/create

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

language   string  optional  

The language for subtitles. Example: en

video_url   string   

The URL of the video to process. Example: https://example.com/video.mp4

resize_for_social_media   boolean  optional  

When set to true, it resizes the video to a 9:16 vertical format optimized for social media. If your video is already 9:16 nothing happens even if this is set to true. Example: true

captions_font_color   string  optional  

The color of the captions. Must be a valid hex code. Example: #FF5733

captions_highlight_color   string  optional  

The color of the words being spoken. Must be a valid hex code. Example: #FF5733

captions_outline_color   string  optional  

The color of the outline of the words. Must be a valid hex code. Example: #FF5733

captions_position   string  optional  

The position of captions, either 'top', 'middle' or 'bottom'. It can also be an integer between 0.1 and 0.9 . For example, 0.1 is equivalent to top, 0.7 is equivalent to middle and 0.9 equivalent to bottom. Example: bottom

captions_font_size   integer  optional  

Font size, between 18 and 65. Example: 24

captions_font_family   string  optional  

Font family, one of: Sigmar, THEBOLDFONT, Rubik. Example: Rubik

captions_add_emojis   boolean  optional  

Whether to add emojis to captions. Example: true

captions_outline_thickness   integer  optional  

The thickness of the outline for captions, between 0 and 20. Example: 5

callback   string  optional  

The URL to notify when ready.

Example: https://example.com/notify-me .

Edits a video

requires authentication

Pass the same parameters as create video but replace the video_url param with a video_id parameter

Example request:
curl --request POST \
    "https://api.visibot.app/api/video/edit" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"language\": \"en\",
    \"video_id\": \"55c6a73bb1289d2ec45374571683b41d\",
    \"resize_for_social_media\": true,
    \"captions_font_color\": \"#FF5733\",
    \"captions_highlight_color\": \"#FF5733\",
    \"captions_outline_color\": \"#FF5733\",
    \"captions_position\": \"bottom\",
    \"captions_font_size\": 24,
    \"captions_font_family\": \"Rubik\",
    \"captions_add_emojis\": true,
    \"captions_outline_thickness\": 5,
    \"callback\": \"https:\\/\\/example.com\\/notify-me .\\n\\/**\",
    \"captions\": [
        {
            \"start\": 0,
            \"end\": 1,
            \"text\": \"Samraaaa\",
            \"emoji\": \"✉️\\n\\/\"
        }
    ]
}"
const url = new URL(
    "https://api.visibot.app/api/video/edit"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "language": "en",
    "video_id": "55c6a73bb1289d2ec45374571683b41d",
    "resize_for_social_media": true,
    "captions_font_color": "#FF5733",
    "captions_highlight_color": "#FF5733",
    "captions_outline_color": "#FF5733",
    "captions_position": "bottom",
    "captions_font_size": 24,
    "captions_font_family": "Rubik",
    "captions_add_emojis": true,
    "captions_outline_thickness": 5,
    "callback": "https:\/\/example.com\/notify-me .\n\/**",
    "captions": [
        {
            "start": 0,
            "end": 1,
            "text": "Samraaaa",
            "emoji": "✉️\n\/"
        }
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "video_id": "f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2",
    "status": "processing"
}
 

Example response (422):


{
    "message": "The given data was invalid.",
    "errors": {
        "video_url": [
            "The video url field is required."
        ]
    }
}
 

Request      

POST api/video/edit

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

language   string  optional  

The two letter language codes for subtitles (ISO-639-1 format). Example: en

video_id   string   

The ID of the video to process. Example: 55c6a73bb1289d2ec45374571683b41d

resize_for_social_media   boolean  optional  

When set to true, it resizes the video to a 9:16 vertical format optimized for social media. If your video is already 9:16 nothing happens even if this is set to true. Example: true

captions_font_color   string  optional  

The font color in hex format. Must be a valid hex code. Example: #FF5733

captions_highlight_color   string  optional  

The font color in hex format. Must be a valid hex code. Example: #FF5733

captions_outline_color   string  optional  

The color of the outline of the words. Must be a valid hex code. Example: #FF5733

captions_position   string  optional  

The position of captions, either 'top', 'middle' or 'bottom'. It can also be an integer between 0.1 and 0.9 . For example, 0.1 is equivalent to top, 0.7 is equivalent to middle and 0.9 equivalent to bottom. Example: bottom

captions_font_size   integer  optional  

Font size, between 18 and 65. Example: 24

captions_font_family   string  optional  

Font family, one of: Sigmar, THEBOLDFONT, Rubik. Example: Rubik

captions_add_emojis   boolean  optional  

Whether to add emojis to captions. Example: true

captions_outline_thickness   integer  optional  

The thickness of the outline for captions, between 0 and 20. Example: 5

callback   string  optional  

The URL to notify when ready.

Example: https://example.com/notify-me . /**

captions   object[]  optional  

A list of captions with start time, end time, text, and optional emoji.

start   number   

The start time of the caption in seconds. Example: 0

end   number   

The end time of the caption in seconds. Example: 1

text   string   

The caption text. Example: Samraaaa

emoji   string  optional  

Optional emoji to display with the caption. Example: ✉️ /

Get video status

requires authentication

Check the processing status of a video and get the URL when ready

Example request:
curl --request GET \
    --get "https://api.visibot.app/api/video/get" \
    --header "Authorization: Bearer {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"video_id\": \"f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2\"
}"
const url = new URL(
    "https://api.visibot.app/api/video/get"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "video_id": "f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "video_id": "f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2",
    "status": "processed",
    "video_url": "https://example.com/storage/videos/processed_video.mp4"
}
 

Example response (202):


{
    "video_id": "f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2",
    "status": "processing",
    "message": "Video is still processing"
}
 

Example response (203):


{
    "message": "Video not found",
    "status": "not_found"
}
 

Example response (422):


{
    "video_id": "f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2",
    "status": "failed",
    "message": "Video processing failed. Please contact support"
}
 

Request      

GET api/video/get

Headers

Authorization      

Example: Bearer {YOUR_AUTH_KEY}

Content-Type      

Example: application/json

Accept      

Example: application/json

Body Parameters

video_id   string   

The ID of the video. Example: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2