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