{
  "openapi": "3.0.1",
  "info": {
    "title": "Video to Shorts - Vertical 9:16 Clips with AI Captions",
    "description": "Video to shorts API. Send a long video URL and timestamps, get a vertical 9:16 MP4 for TikTok, Reels or YouTube Shorts with burned-in word-by-word captions, a thumbnail and an SRT. Blur, crop or pad reframing. Batch clips. MCP, n8n, Make, API. Failed clips free.",
    "version": "0.1",
    "x-build-id": "mANKaZzeIp3za25V1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/ent-e~video-to-shorts-captions/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-ent-e-video-to-shorts-captions",
        "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/ent-e~video-to-shorts-captions/runs": {
      "post": {
        "operationId": "runs-sync-ent-e-video-to-shorts-captions",
        "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/ent-e~video-to-shorts-captions/run-sync": {
      "post": {
        "operationId": "run-sync-ent-e-video-to-shorts-captions",
        "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": {
          "url": {
            "title": "Video URL",
            "type": "string",
            "description": "Direct, publicly downloadable URL of ONE video file (http/https; redirects followed). Any FFmpeg-readable format: mp4, mov, mkv, webm, avi... Max 4 GB. Must be the media file itself, not a YouTube/TikTok/web page URL. Horizontal (16:9), square or already-vertical sources all work. Example: https://download.samplelib.com/mp4/sample-30s.mp4"
          },
          "clips": {
            "title": "Batch of clips",
            "type": "array",
            "description": "Optional batch: make several shorts in one run (e.g. several highlights from one long video). Array of objects {\"url\": string (required), plus any of startSeconds, endSeconds, maxClipSeconds, mode, cropPosition, blurStrength, padColor, resolution, captions, model, language, captionStyle, font, fontSize, textColor, highlightColor, outlineColor, outlineWidth, captionBox, uppercase, wordsPerCaption, highlightWords, captionPosition, quality to override the top-level value for that clip}. Plain URL strings are accepted. Example: [{\"url\":\"https://example.com/podcast.mp4\",\"startSeconds\":125,\"endSeconds\":170},{\"url\":\"https://example.com/podcast.mp4\",\"startSeconds\":900,\"endSeconds\":955,\"captionStyle\":\"pop\"}]"
          },
          "startSeconds": {
            "title": "Start time (seconds)",
            "minimum": 0,
            "type": "number",
            "description": "Where the short starts in the source video, in seconds (decimals allowed, e.g. 75.5 = 1:15.5). Default 0 (beginning). Use with endSeconds to cut a highlight out of a long video."
          },
          "endSeconds": {
            "title": "End time (seconds)",
            "minimum": 0,
            "type": "number",
            "description": "Where the short ends in the source video, in seconds. Leave empty to run until the source ends or maxClipSeconds is reached, whichever comes first. Must be greater than startSeconds."
          },
          "maxClipSeconds": {
            "title": "Maximum short length (seconds)",
            "minimum": 5,
            "maximum": 180,
            "type": "integer",
            "description": "Hard cap on the output length; the clip is cut at startSeconds + maxClipSeconds even if endSeconds is later. 60 fits YouTube Shorts classic limit and Instagram Reels/TikTok recommendations; up to 180 (3 minutes, the current YouTube Shorts maximum). Default 60.",
            "default": 60
          },
          "mode": {
            "title": "Framing mode",
            "enum": [
              "blur",
              "crop",
              "pad"
            ],
            "type": "string",
            "description": "How a horizontal video becomes 9:16. 'blur' (default): the whole original frame is shown in the middle over a blurred, zoomed copy of itself - nothing is cut off, best for slides, gameplay, wide shots, multiple speakers. 'crop': scales to fill the full 9:16 screen and cuts the sides - best for a single centered speaker/talking head; steer it with cropPosition. 'pad': whole frame with solid bars (padColor) above and below.",
            "default": "blur"
          },
          "cropPosition": {
            "title": "Crop position (crop mode)",
            "minimum": 0,
            "maximum": 1,
            "type": "number",
            "description": "Only for mode='crop': horizontal position of the 9:16 window inside the wider source, 0 = keep the far left, 0.5 = center (default), 1 = far right. Example: speaker sits on the right third -> 0.7.",
            "default": 0.5
          },
          "blurStrength": {
            "title": "Background blur strength (blur mode)",
            "minimum": 4,
            "maximum": 80,
            "type": "integer",
            "description": "Only for mode='blur': how blurred the background copy is. 4 = subtle, 20 = default, 60+ = very soft.",
            "default": 20
          },
          "padColor": {
            "title": "Bar color (pad mode)",
            "type": "string",
            "description": "Only for mode='pad': hex color of the bars above/below the video, e.g. #000000 (black) or #FFFFFF.",
            "default": "#000000"
          },
          "resolution": {
            "title": "Output resolution",
            "enum": [
              "1080x1920",
              "720x1280"
            ],
            "type": "string",
            "description": "Output frame size (always 9:16, 30 fps, H.264 + AAC MP4 ready for TikTok, Instagram Reels, YouTube Shorts, Snapchat). Default 1080x1920.",
            "default": "1080x1920"
          },
          "quality": {
            "title": "Video quality",
            "enum": [
              "high",
              "standard",
              "small"
            ],
            "type": "string",
            "description": "H.264 quality/size trade-off: 'high' (CRF 18), 'standard' (CRF 21, default), 'small' (CRF 25, for messaging/previews).",
            "default": "standard"
          },
          "captions": {
            "title": "Burn in captions",
            "type": "boolean",
            "description": "Transcribe the clip's speech with Whisper AI and burn animated captions into the video (also returned as an .srt file). Turn off for a plain reframe/trim. Captions are included in the price.",
            "default": true
          },
          "model": {
            "title": "Speech recognition model",
            "enum": [
              "base",
              "small",
              "large-v3-turbo"
            ],
            "type": "string",
            "description": "Whisper model used for captions. 'small' (default) is accurate for English and major languages; 'base' is faster; 'large-v3-turbo' improves accuracy for accents, noisy audio and less common languages but transcribes about 2-3x slower and is downloaded at run start. Same price for every model.",
            "default": "small"
          },
          "language": {
            "title": "Spoken language",
            "type": "string",
            "description": "ISO 639-1 code of the spoken language (en, es, de, fr, pt, hi, ja, ...) or 'auto' (default) to detect it. Setting it avoids rare mis-detections on short clips. Captions are written in the spoken language.",
            "default": "auto"
          },
          "captionStyle": {
            "title": "Caption style preset",
            "enum": [
              "bold",
              "pop",
              "boxed",
              "minimal"
            ],
            "type": "string",
            "description": "Starting look for captions; any of the style fields below override parts of it. 'bold' (default): Poppins ExtraBold, UPPERCASE, 3 words at a time, current word highlighted yellow, placed automatically (under the video in blur mode, lower third in crop mode). 'pop': Luckiest Guy, 2 words, green highlight. 'boxed': DejaVu Sans on a semi-transparent black box, ~6 words, bottom. 'minimal': Anton with thin outline, 4 words, bottom.",
            "default": "bold"
          },
          "font": {
            "title": "Font",
            "enum": [
              "poppins",
              "anton",
              "bebas",
              "luckiest",
              "archivo",
              "dejavu"
            ],
            "type": "string",
            "description": "Overrides the preset's font. All fonts are bundled. For Cyrillic/Greek and other non-Latin scripts use 'dejavu'. CJK, Arabic and Indic scripts are not covered by the bundled fonts."
          },
          "fontSize": {
            "title": "Font size",
            "minimum": 20,
            "maximum": 200,
            "type": "integer",
            "description": "Overrides the preset's font size, in pixels at 1080 px width (scaled automatically for 720x1280). Presets use 60-100."
          },
          "textColor": {
            "title": "Text color",
            "type": "string",
            "description": "Overrides the caption text color, hex like #FFFFFF."
          },
          "highlightColor": {
            "title": "Highlight color",
            "type": "string",
            "description": "Overrides the color of the currently spoken word when word highlighting is on, hex like #FFE600 (yellow) or #3DFF5A (green)."
          },
          "outlineColor": {
            "title": "Outline color",
            "type": "string",
            "description": "Overrides the text outline color, hex like #000000."
          },
          "outlineWidth": {
            "title": "Outline width",
            "minimum": 0,
            "maximum": 20,
            "type": "number",
            "description": "Overrides the outline thickness in pixels at 1080 width (0 = none). Presets use 3-7."
          },
          "captionBox": {
            "title": "Dark box behind text",
            "type": "boolean",
            "description": "Overrides whether captions sit on a semi-transparent black box (like the 'boxed' preset) instead of an outline."
          },
          "uppercase": {
            "title": "UPPERCASE captions",
            "type": "boolean",
            "description": "Overrides whether caption text is shown in capitals."
          },
          "wordsPerCaption": {
            "title": "Words per caption",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "Overrides how many words are on screen at once (1-12). 1-3 = fast punchy style; 6-10 = subtitle style."
          },
          "highlightWords": {
            "title": "Highlight spoken word",
            "type": "boolean",
            "description": "Overrides karaoke-style highlighting: the word being spoken changes to highlightColor."
          },
          "captionPosition": {
            "title": "Caption position",
            "enum": [
              "auto",
              "bottom",
              "center",
              "top"
            ],
            "type": "string",
            "description": "Overrides vertical placement. 'auto' (used by the bold/pop presets): in blur/pad mode captions go in the free area just under the video so they never cover faces; in crop mode they sit in the lower third. 'bottom' sits above the TikTok/Reels UI safe zone (20% from the bottom); 'center' is mid-screen; 'top' is 14% from the top."
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}