{
  "openapi": "3.0.1",
  "info": {
    "title": "Professional Subtitle Translator & Video Captioner",
    "description": "Transcribe, translate, quality-check, and burn subtitles into videos. Upload video, audio, SRT, or VTT and export SRT, VTT, TXT, JSON, or ready-to-publish MP4. Supports multilingual subtitles with automatic timing and QC.",
    "version": "2.0",
    "x-build-id": "arD9KqbeC1dSxMNAq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/lumaxys~media-to-professional-subtitles/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-lumaxys-media-to-professional-subtitles",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/lumaxys~media-to-professional-subtitles/runs": {
      "post": {
        "operationId": "runs-sync-lumaxys-media-to-professional-subtitles",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/lumaxys~media-to-professional-subtitles/run-sync": {
      "post": {
        "operationId": "run-sync-lumaxys-media-to-professional-subtitles",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "mediaFile": {
            "title": "Video or audio file",
            "type": "string",
            "description": "Upload a video (MP4, MOV, MKV, WEBM) or audio file (MP3, WAV, M4A, AAC, OGG, FLAC). The file is analysed locally before anything is billed."
          },
          "mediaUrl": {
            "title": "Direct media URL",
            "type": "string",
            "description": "A direct http(s) link to a video or audio FILE. Page URLs from YouTube, TikTok and Instagram are not supported."
          },
          "mediaUrls": {
            "title": "Additional media URLs (batch)",
            "type": "array",
            "description": "Process several media files in one run. Each input is handled independently: one failure never stops the others. Maximum 50 inputs per run.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "subtitleUrl": {
            "title": "Existing subtitle file (SRT or VTT)",
            "type": "string",
            "description": "Already have subtitles? Provide them here and transcription is skipped entirely — no audio processing, no transcription cost. The file goes straight to quality control and optional translation."
          },
          "videoSubtitleMode": {
            "title": "Subtitle source for video",
            "enum": [
              "transcribe",
              "external",
              "embedded"
            ],
            "type": "string",
            "description": "Choose whether video inputs are transcribed, use a paired SRT/VTT file, or reuse a text subtitle track already stored inside the video container. External and embedded modes skip ElevenLabs transcription.",
            "default": "transcribe"
          },
          "videoSubtitleUrl": {
            "title": "SRT/VTT paired with the video",
            "type": "string",
            "description": "Used only with “Use an SRT/VTT paired with the video”. The timings and text come from this file, while the output MP4 is rendered from the video input. Exactly one video input is allowed in this mode."
          },
          "embeddedSubtitleStreamIndex": {
            "title": "Embedded subtitle stream index",
            "minimum": 0,
            "type": "integer",
            "description": "Optional global FFprobe stream index. Leave empty to select the default text subtitle track, or the first text track. Bitmap PGS/VobSub tracks require OCR and are refused."
          },
          "languageCode": {
            "title": "Source language",
            "type": "string",
            "description": "Leave empty to detect the language automatically. You may provide a DeepL BCP-47 source code such as fr, en, pt-BR or zh-Hant when detection needs help."
          },
          "targetLanguages": {
            "title": "Translate into",
            "maxItems": 5,
            "uniqueItems": true,
            "type": "array",
            "description": "Choose up to 5 targets from the bundled DeepL menu. At runtime the Actor verifies every code against DeepL’s live /v3/languages registry before sending billable text.",
            "items": {
              "type": "string",
              "enum": [
                "EN-US",
                "ES",
                "FR",
                "DE",
                "IT",
                "PT-BR",
                "AR",
                "ZH-HANS",
                "JA",
                "KO"
              ],
              "enumTitles": [
                "English (American) — EN-US",
                "Spanish — ES",
                "French — FR",
                "German — DE",
                "Italian — IT",
                "Portuguese (Brazilian) — PT-BR",
                "Arabic — AR",
                "Chinese (Simplified) — ZH-HANS",
                "Japanese — JA",
                "Korean — KO"
              ]
            },
            "default": []
          },
          "additionalTargetLanguages": {
            "title": "Additional or newly released DeepL targets",
            "maxItems": 5,
            "uniqueItems": true,
            "type": "array",
            "description": "Optional BCP-47 target codes not yet present in the static menu, for example a language newly added by DeepL. Codes are verified against DeepL’s live language registry before translation. The combined limit remains 5 targets.",
            "items": {
              "type": "string",
              "minLength": 2,
              "maxLength": 20
            },
            "default": []
          },
          "outputLanguageMode": {
            "title": "Subtitle language versions to export",
            "enum": [
              "auto",
              "translations",
              "both",
              "original"
            ],
            "type": "string",
            "description": "Choose which subtitle-file language versions are stored and shown in the Dataset. Automatic exports translations only when target languages are selected; otherwise it exports the original language. This setting controls SRT/VTT/TXT/JSON files only; MP4 rendering is controlled separately below.",
            "default": "auto"
          },
          "profile": {
            "title": "Subtitle profile",
            "enum": [
              "documentary",
              "social",
              "accessibility"
            ],
            "type": "string",
            "description": "Segmentation and QC style. The QC profile follows this choice by default.",
            "default": "social"
          },
          "enableQc": {
            "title": "Enable quality control",
            "type": "boolean",
            "description": "Run professional QC on the source subtitles and, when enabled below, on every translation. This now includes freshly transcribed subtitles automatically.",
            "default": true
          },
          "qcCorrectionMode": {
            "title": "Quality control mode",
            "enum": [
              "check-and-correct",
              "check-only"
            ],
            "type": "string",
            "description": "Report problems only, or report and fix them. Correction re-wraps lines, normalises whitespace, repairs overlaps, gaps and reading speed. Words change only through terminology entries explicitly supplied below.",
            "default": "check-and-correct"
          },
          "qcProfile": {
            "title": "Quality control profile",
            "enum": [
              "same",
              "documentary",
              "social",
              "accessibility",
              "custom"
            ],
            "type": "string",
            "description": "Recommended: use the same rule set as the subtitle profile selected below. Choose another profile only when you intentionally want stricter or different QC thresholds.",
            "default": "same"
          },
          "qcAfterTranslation": {
            "title": "Re-check after translation",
            "type": "boolean",
            "description": "Recommended. Run QC again on every translated language because translated text can be longer than the source.",
            "default": true
          },
          "sourceTerminologyReplacements": {
            "title": "Terminology corrections (optional)",
            "type": "array",
            "description": "Correct names, brands or specialist terms after transcription. Add one entry per line using ‘heard term => correct term’, for example ‘Lumaxis => Lumaxys’. Matching is case-insensitive and only explicit entries can change words.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "outputFormats": {
            "title": "Output formats",
            "type": "array",
            "description": "Formats produced for every language.",
            "items": {
              "type": "string",
              "enum": [
                "srt",
                "vtt",
                "txt",
                "json"
              ],
              "enumTitles": [
                "SubRip (.srt)",
                "WebVTT (.vtt)",
                "Plain text (.txt)",
                "Structured JSON"
              ]
            },
            "default": [
              "srt",
              "vtt",
              "txt",
              "json"
            ]
          },
          "renderSubtitles": {
            "title": "Burn subtitles into the video",
            "type": "boolean",
            "description": "Create final MP4 videos with subtitles permanently visible. The renderer automatically fits the selected style to portrait, landscape or square video and guarantees at most two visible text lines.",
            "default": false
          },
          "renderLanguages": {
            "title": "Videos to render",
            "enum": [
              "all",
              "source",
              "translations"
            ],
            "type": "string",
            "description": "Render the source language, translated languages, or one MP4 for every available language.",
            "default": "all"
          },
          "existingSubtitleMaskMode": {
            "title": "Hide subtitles already burned into the image",
            "enum": [
              "none",
              "box",
              "blur"
            ],
            "type": "string",
            "description": "Use this only when the old subtitles are part of the video pixels. “Box” covers the selected horizontal zone with a configurable colour; “Blur” blurs only that zone before adding the new subtitles.",
            "default": "none"
          },
          "existingSubtitleMaskTopPercent": {
            "title": "Mask zone top (%)",
            "minimum": 0,
            "maximum": 99,
            "type": "number",
            "description": "Vertical position where the old-subtitle mask begins, measured from the top of the video.",
            "default": 72
          },
          "existingSubtitleMaskHeightPercent": {
            "title": "Mask zone height (%)",
            "minimum": 1,
            "maximum": 100,
            "type": "number",
            "description": "Height of the old-subtitle mask. A compact 12% default covers most caption bands; adjust it to the real old-text zone. Top plus height must not exceed 100%.",
            "default": 12
          },
          "existingSubtitleMaskColor": {
            "title": "Mask box colour",
            "type": "string",
            "description": "Colour used by box mode in #RRGGBB format.",
            "default": "#000000"
          },
          "existingSubtitleMaskOpacity": {
            "title": "Mask box opacity (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Opacity of the cover box. 100% fully hides old burned-in text; lower values intentionally let the original image and possibly some old text show through.",
            "default": 100
          },
          "existingSubtitleBlurRadius": {
            "title": "Mask blur radius",
            "minimum": 2,
            "maximum": 40,
            "type": "integer",
            "description": "Strength of the local blur used to hide old burned-in subtitles.",
            "default": 14
          },
          "subtitleStylePreset": {
            "title": "Subtitle visual preset",
            "enum": [
              "classic",
              "social",
              "cinema",
              "accessible",
              "impact",
              "custom"
            ],
            "type": "string",
            "description": "Start with a ready-to-use visual style. The final font size is automatically adapted to the video orientation and longest subtitle line. Advanced fields below override the selected preset.",
            "default": "classic"
          },
          "subtitleFontFamily": {
            "title": "Font family",
            "enum": [
              "Noto Sans",
              "DejaVu Sans",
              "Liberation Sans",
              "Liberation Serif",
              "DejaVu Sans Mono"
            ],
            "type": "string",
            "description": "Installed open-source font used by FFmpeg. Noto Sans provides the broadest multilingual coverage."
          },
          "subtitleFontSize": {
            "title": "Font size",
            "minimum": 16,
            "maximum": 160,
            "type": "integer",
            "description": "Advanced reference size. The renderer scales it for portrait, landscape or square video, then reduces it only when needed to keep every subtitle within two visible lines."
          },
          "subtitleTextColor": {
            "title": "Text colour",
            "type": "string",
            "description": "Advanced. Six-digit hexadecimal colour in #RRGGBB format."
          },
          "subtitleOutlineColor": {
            "title": "Outline colour",
            "type": "string",
            "description": "Advanced. Six-digit hexadecimal colour used for the text outline."
          },
          "subtitleOutlineWidth": {
            "title": "Outline width",
            "minimum": 0,
            "maximum": 12,
            "type": "number",
            "description": "Advanced. Outline thickness at 1080p; automatically scaled to the video resolution."
          },
          "subtitleBackgroundColor": {
            "title": "Background colour",
            "type": "string",
            "description": "Advanced. Colour of the readability box when background opacity is above zero."
          },
          "subtitleBackgroundOpacity": {
            "title": "Background opacity (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Advanced. Set to 0 for no box or up to 100 for a fully opaque subtitle background."
          },
          "subtitleShadow": {
            "title": "Shadow size",
            "minimum": 0,
            "maximum": 12,
            "type": "number",
            "description": "Advanced. Drop-shadow distance at 1080p; automatically scaled to the video resolution."
          },
          "subtitleBold": {
            "title": "Bold text",
            "type": "boolean",
            "description": "Advanced. Render subtitles using the bold face of the selected font."
          },
          "subtitlePosition": {
            "title": "Subtitle position",
            "enum": [
              "bottom",
              "center",
              "top"
            ],
            "type": "string",
            "description": "Advanced. Place subtitles at the bottom, centre or top of the frame."
          },
          "subtitleMarginPercent": {
            "title": "Vertical safe margin (%)",
            "minimum": 0,
            "maximum": 35,
            "type": "number",
            "description": "Advanced. Distance from the selected top or bottom edge. Social preset uses a larger margin to avoid app controls."
          },
          "diarize": {
            "title": "Identify speakers",
            "type": "boolean",
            "description": "Detect who speaks when. Supported by the ElevenLabs Scribe provider.",
            "default": false
          },
          "includeSpeakerLabels": {
            "title": "Show speaker labels in subtitles",
            "type": "boolean",
            "description": "Prefix each subtitle with the speaker identifier. Requires speaker identification.",
            "default": false
          },
          "transcriptionProvider": {
            "title": "Transcription provider",
            "enum": [
              "elevenlabs"
            ],
            "type": "string",
            "description": "Only providers that are actually implemented are listed.",
            "default": "elevenlabs"
          },
          "translationProvider": {
            "title": "Translation provider",
            "enum": [
              "deepl"
            ],
            "type": "string",
            "description": "Only providers that are actually implemented are listed.",
            "default": "deepl"
          },
          "maxMediaMinutes": {
            "title": "Maximum media duration (minutes)",
            "minimum": 1,
            "maximum": 180,
            "type": "integer",
            "description": "Safety cap. A file longer than this is refused BEFORE any paid call, so a mistaken upload cannot generate a surprise bill.",
            "default": 60
          },
          "batchConcurrency": {
            "title": "Parallel inputs",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many inputs to process at once in a batch. Defaults to 1: provider rate limits, not local speed, are the binding constraint, and serial runs have a predictable cost profile.",
            "default": 1
          },
          "maxCharsPerLine": {
            "title": "Maximum characters per line",
            "minimum": 16,
            "maximum": 100,
            "type": "integer",
            "description": "Advanced. Applies to both segmentation and quality control."
          },
          "maxLinesPerSubtitle": {
            "title": "Maximum lines per subtitle",
            "minimum": 1,
            "maximum": 2,
            "type": "integer",
            "description": "Advanced. SRT and WebVTT output is limited to 2 lines per subtitle."
          },
          "maxCps": {
            "title": "Maximum reading speed (characters per second)",
            "minimum": 5,
            "maximum": 40,
            "type": "integer",
            "description": "Advanced. Broadcast practice is 15-20; accessibility standards are stricter."
          },
          "minSubtitleDurationMs": {
            "title": "Minimum subtitle duration (ms)",
            "minimum": 200,
            "maximum": 5000,
            "type": "integer",
            "description": "Advanced. Below roughly 800 ms a subtitle is hard to read."
          },
          "maxSubtitleDurationMs": {
            "title": "Maximum subtitle duration (ms)",
            "minimum": 1000,
            "maximum": 20000,
            "type": "integer",
            "description": "Advanced. Must be greater than the minimum duration."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}