openapi: 3.0.3
info:
title: 'Visibot API Documentation'
description: 'The easiest API for video editing and generation. Create videos with AI generated images, subtitles, emojis and more.'
version: 1.0.0
servers:
-
url: 'https://api.visibot.app'
tags:
-
name: Endpoints
description: ''
-
name: 'User Registration API'
description: "\nAPIs for user registration through various integrations"
-
name: 'Video API'
description: "\nAPIs for video processing"
components:
securitySchemes:
default:
type: http
scheme: bearer
description: 'You can retrieve your token by visiting your profile page and creating a token.'
security:
-
default: []
paths:
/api/me:
get:
summary: ''
operationId: getApiMe
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated
error: 'Invalid token'
properties:
message:
type: string
example: Unauthenticated
error:
type: string
example: 'Invalid token'
tags:
- Endpoints
/api/usage:
get:
summary: ''
operationId: getApiUsage
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated
error: 'Invalid token'
properties:
message:
type: string
example: Unauthenticated
error:
type: string
example: 'Invalid token'
tags:
- Endpoints
/api/webhooks/manychat/telegram-subscriber:
post:
summary: 'Process telegram subscriber from ManyChat'
operationId: processTelegramSubscriberFromManyChat
description: ''
parameters: []
responses: { }
tags:
- Endpoints
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
manychat_id:
type: string
description: ''
example: architecto
nullable: false
telegram_id:
type: string
description: ''
example: architecto
nullable: false
required:
- manychat_id
- telegram_id
/api/user/register:
post:
summary: 'Register a new user'
operationId: registerANewUser
description: "This endpoint allows users to register through various integrations.\nIt requires a valid API key for authentication."
parameters: []
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'User registered successfully'
user:
id: 123
email: user@example.com
first_name: John
last_name: Doe
api_token: your-api-token-here
properties:
message:
type: string
example: 'User registered successfully'
user:
type: object
properties:
id:
type: integer
example: 123
email:
type: string
example: user@example.com
first_name:
type: string
example: John
last_name:
type: string
example: Doe
api_token:
type: string
example: your-api-token-here
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Invalid API key'
properties:
message:
type: string
example: 'Invalid API key'
422:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
email:
- 'The email field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
email:
type: array
example:
- 'The email field is required.'
items:
type: string
tags:
- 'User Registration API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: "The user's email address."
example: user@example.com
nullable: false
first_name:
type: string
description: "optional The user's first name."
example: John
nullable: false
last_name:
type: string
description: "optional The user's last name."
example: Doe
nullable: false
integration_id:
type: string
description: 'optional The integration unique identifier.'
example: AKfycbw1234567890
nullable: false
api_key:
type: string
description: 'The API key for authentication.'
example: your-api-key-here
nullable: false
manychat_tag:
type: string
description: 'optional The tag to add in ManyChat.'
example: wordpress_signup
nullable: false
required:
- email
- api_key
/api/video/create:
post:
summary: 'Create a new video'
operationId: createANewVideo
description: 'Process a video from URL with custom caption settings'
parameters: []
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
video_id: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status: processing
properties:
video_id:
type: string
example: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status:
type: string
example: processing
422:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
video_url:
- 'The video url field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
video_url:
type: array
example:
- 'The video url field is required.'
items:
type: string
tags:
- 'Video API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
language:
type: string
description: 'The language for subtitles.'
example: en
nullable: false
video_url:
type: string
description: 'The URL of the video to process.'
example: 'https://example.com/video.mp4'
nullable: false
resize_for_social_media:
type: boolean
description: '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
nullable: false
captions_font_color:
type: string
description: 'The color of the captions. Must be a valid hex code.'
example: '#FF5733'
nullable: false
captions_highlight_color:
type: string
description: 'The color of the words being spoken. Must be a valid hex code.'
example: '#FF5733'
nullable: false
captions_outline_color:
type: string
description: 'The color of the outline of the words. Must be a valid hex code.'
example: '#FF5733'
nullable: false
captions_position:
type: string
description: "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
nullable: false
captions_font_size:
type: integer
description: 'Font size, between 18 and 65.'
example: 24
nullable: false
captions_font_family:
type: string
description: 'Font family, one of: Sigmar, THEBOLDFONT, Rubik.'
example: Rubik
nullable: false
captions_add_emojis:
type: boolean
description: 'Whether to add emojis to captions.'
example: true
nullable: false
captions_outline_thickness:
type: integer
description: 'The thickness of the outline for captions, between 0 and 20.'
example: 5
nullable: false
callback:
type: string
description: 'The URL to notify when ready. '
example: 'https://example.com/notify-me .'
nullable: false
required:
- video_url
/api/video/edit:
post:
summary: 'Edits a video'
operationId: editsAVideo
description: 'Pass the same parameters as create video but replace the video_url param with a video_id parameter'
parameters: []
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
video_id: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status: processing
properties:
video_id:
type: string
example: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status:
type: string
example: processing
422:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'The given data was invalid.'
errors:
video_url:
- 'The video url field is required.'
properties:
message:
type: string
example: 'The given data was invalid.'
errors:
type: object
properties:
video_url:
type: array
example:
- 'The video url field is required.'
items:
type: string
tags:
- 'Video API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
language:
type: string
description: 'The two letter language codes for subtitles (ISO-639-1 format).'
example: en
nullable: false
video_id:
type: string
description: 'The ID of the video to process.'
example: 55c6a73bb1289d2ec45374571683b41d
nullable: false
resize_for_social_media:
type: boolean
description: '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
nullable: false
captions_font_color:
type: string
description: 'The font color in hex format. Must be a valid hex code.'
example: '#FF5733'
nullable: false
captions_highlight_color:
type: string
description: 'The font color in hex format. Must be a valid hex code.'
example: '#FF5733'
nullable: false
captions_outline_color:
type: string
description: 'The color of the outline of the words. Must be a valid hex code.'
example: '#FF5733'
nullable: false
captions_position:
type: string
description: "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
nullable: false
captions_font_size:
type: integer
description: 'Font size, between 18 and 65.'
example: 24
nullable: false
captions_font_family:
type: string
description: 'Font family, one of: Sigmar, THEBOLDFONT, Rubik.'
example: Rubik
nullable: false
captions_add_emojis:
type: boolean
description: 'Whether to add emojis to captions.'
example: true
nullable: false
captions_outline_thickness:
type: integer
description: 'The thickness of the outline for captions, between 0 and 20.'
example: 5
nullable: false
callback:
type: string
description: 'The URL to notify when ready. '
example: "https://example.com/notify-me .\n/**"
nullable: false
captions:
type: array
description: 'A list of captions with start time, end time, text, and optional emoji.'
example:
- []
items:
type: object
properties:
start:
type: number
description: 'The start time of the caption in seconds.'
example: 0.0
nullable: false
end:
type: number
description: 'The end time of the caption in seconds.'
example: 1.0
nullable: false
text:
type: string
description: 'The caption text.'
example: Samraaaa
nullable: false
emoji:
type: string
description: 'Optional emoji to display with the caption.'
example: "✉️\n/"
nullable: false
required:
- start
- end
- text
required:
- video_id
/api/video/get:
get:
summary: 'Get video status'
operationId: getVideoStatus
description: 'Check the processing status of a video and get the URL when ready'
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
video_id: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status: processed
video_url: 'https://example.com/storage/videos/processed_video.mp4'
properties:
video_id:
type: string
example: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status:
type: string
example: processed
video_url:
type: string
example: 'https://example.com/storage/videos/processed_video.mp4'
202:
description: ''
content:
application/json:
schema:
type: object
example:
video_id: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status: processing
message: 'Video is still processing'
properties:
video_id:
type: string
example: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status:
type: string
example: processing
message:
type: string
example: 'Video is still processing'
203:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Video not found'
status: not_found
properties:
message:
type: string
example: 'Video not found'
status:
type: string
example: not_found
422:
description: ''
content:
application/json:
schema:
type: object
example:
video_id: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status: failed
message: 'Video processing failed. Please contact support'
properties:
video_id:
type: string
example: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
status:
type: string
example: failed
message:
type: string
example: 'Video processing failed. Please contact support'
tags:
- 'Video API'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
video_id:
type: string
description: 'The ID of the video.'
example: f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2
nullable: false
required:
- video_id