{
  "openapi": "3.0.1",
  "info": {
    "title": "Video to Text: TikTok, Instagram Reels & MP4 Transcriber",
    "description": "Convert video to text: transcribe TikTok videos, Instagram Reels, X and Facebook videos and MP4, MOV, WEBM files (or Google Drive / Dropbox links) to a full transcript, timestamps and SRT/VTT subtitles in 99 languages, or translate to English. Open-source Whisper, no API key, pay per minute.",
    "version": "1.0",
    "x-build-id": "bbF2tkL3phPhKJWKy"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fguiraud~video-to-text-transcriber/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fguiraud-video-to-text-transcriber",
        "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/fguiraud~video-to-text-transcriber/runs": {
      "post": {
        "operationId": "runs-sync-fguiraud-video-to-text-transcriber",
        "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/fguiraud~video-to-text-transcriber/run-sync": {
      "post": {
        "operationId": "run-sync-fguiraud-video-to-text-transcriber",
        "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": {
          "sources": {
            "title": "Video URLs",
            "type": "array",
            "description": "Links to your videos: TikTok, Instagram (Reels, posts), X (Twitter) and Facebook (videos, Reels, Watch) links, or direct links to media files (MP4, MOV, MKV, WEBM, MP3, M4A, WAV and more). Google Drive, Dropbox, OneDrive and GitHub share links work too (shared as 'Anyone with the link'). YouTube is not supported: use YouTube Transcript Scraper for YouTube videos.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "profiles": {
            "title": "TikTok or Instagram accounts",
            "type": "array",
            "description": "Accounts to transcribe: TikTok as '@username' or https://www.tiktok.com/@username, Instagram as a profile link (https://www.instagram.com/username/). The newest videos of each account are transcribed (see 'Videos per account'; Instagram shows at most its 12 newest reels without login).",
            "items": {
              "type": "string"
            }
          },
          "maxVideosPerProfile": {
            "title": "Videos per account",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many of the newest videos to transcribe from each account (Instagram: at most 12).",
            "default": 10
          },
          "onlyNewVideos": {
            "title": "Only new videos",
            "type": "boolean",
            "description": "Skip videos already transcribed by previous runs of this Actor in your account (remembered in a key-value store named 'transcriber-state-video'). Ideal for a weekly schedule: you only pay for new videos.",
            "default": true
          },
          "base64Files": {
            "title": "Files as base64 (optional)",
            "type": "array",
            "description": "Short media files without a URL, e.g. from an AI agent: [{\"fileName\": \"memo.m4a\", \"content\": \"<base64>\"}]. Keep the total input under ~9 MB; use URLs for longer recordings."
          },
          "datasetId": {
            "title": "Read links from another Actor's dataset (optional)",
            "type": "string",
            "description": "A dataset from another Actor run, e.g. a podcast, TikTok or Google Drive scraper. The audio or video link in each row is transcribed, whatever the field is called (audioUrl, videoUrl, mediaUrl, url...), up to 10,000 rows. Pick the dataset here so the Actor is allowed to read it. Rows without a link are listed in a free warning row."
          },
          "datasetItems": {
            "title": "Or paste dataset rows (optional)",
            "type": "array",
            "description": "Rows from another Actor's dataset, e.g. [{\"audioUrl\": \"https://example.com/episode.mp3\"}], or plain links. The media link in each row is found automatically; set 'Dataset field with the link' if it is not."
          },
          "datasetField": {
            "title": "Dataset field with the link (optional)",
            "type": "string",
            "description": "Field of the dataset rows that holds the media link, e.g. audioUrl or media.url (dot path for nested fields). Leave empty to detect it."
          },
          "model": {
            "title": "Model",
            "enum": [
              "base",
              "small",
              "tiny"
            ],
            "type": "string",
            "description": "'base': good accuracy, fast (recommended). 'small': best accuracy, especially for accents, noisy audio and non-English speech; slower and billed at a higher per-minute price. 'tiny': fastest draft quality.",
            "default": "base"
          },
          "transcriptSource": {
            "title": "Transcript source (TikTok)",
            "enum": [
              "auto",
              "whisper"
            ],
            "type": "string",
            "description": "For TikTok videos. Auto reads TikTok's own speech-to-text captions when the video has them (about 1 second per video, same price) and uses Whisper otherwise; translation, SRT/VTT files, word timestamps, the small model and custom vocabulary always use Whisper. Some TikTok captions have no punctuation: choose Always Whisper for punctuated text.",
            "default": "auto"
          },
          "language": {
            "title": "Spoken language",
            "type": "string",
            "description": "ISO code of the spoken language (en, es, de, fr, pt, it, ja, zh, ...) or 'auto' to detect it. Setting it avoids misdetection on short clips.",
            "default": "auto"
          },
          "task": {
            "title": "Task",
            "enum": [
              "transcribe",
              "translate"
            ],
            "type": "string",
            "description": "'transcribe': text in the spoken language. 'translate': translate the speech to English text.",
            "default": "transcribe"
          },
          "vocabulary": {
            "title": "Vocabulary (names, jargon)",
            "type": "array",
            "description": "Words the speech recognition should favour: people and company names, product names, technical terms (e.g. 'Kubernetes', 'Dr. Nguyen', 'Apify'). Improves spelling of rare words.",
            "items": {
              "type": "string"
            }
          },
          "termCorrections": {
            "title": "Term corrections (optional)",
            "type": "object",
            "description": "Up to 50 heard forms and their correct spelling, e.g. {\"Cloud flare\": \"Cloudflare\", \"a pie fi\": \"Apify\"}. Applied to the text, segments, subtitles and documents (whole words, case-insensitive). 'Vocabulary' helps Whisper hear names; this fixes what it still gets wrong."
          },
          "searchTerms": {
            "title": "Search the transcripts for (optional)",
            "type": "array",
            "description": "Up to 50 brands, names or topics to find. Each result gets 'mentions' (term, time, speaker and the sentence) and 'mentionCounts'. Combine with a schedule and 'Only new episodes' to monitor podcasts for mentions. No extra charge.",
            "items": {
              "type": "string"
            }
          },
          "outputs": {
            "title": "What to return",
            "type": "array",
            "description": "'text': full transcript split into paragraphs at pauses. 'segments': timestamped segments. 'srt' / 'vtt': ready-to-use subtitle files. 'chunks': ~chunkSize-character passages with start/end times and a token estimate, ready for vector databases. 'markdown': paragraphs prefixed with their start time, e.g. '**[00:01:23]** ...'. 'docx' / 'pdf': the transcript as a Word or PDF document (title, details, paragraphs with timestamps and speakers), saved in the run's storage with its download link in 'files'.",
            "items": {
              "type": "string",
              "enum": [
                "text",
                "markdown",
                "segments",
                "srt",
                "vtt",
                "chunks",
                "docx",
                "pdf"
              ],
              "enumTitles": [
                "Text",
                "Markdown with timestamps",
                "Timestamped segments",
                "SRT subtitles",
                "WebVTT subtitles",
                "RAG chunks with timestamps",
                "Word document (.docx)",
                "PDF document"
              ]
            },
            "default": [
              "text",
              "srt"
            ]
          },
          "speakerLabels": {
            "title": "Speaker labels (who said what)",
            "type": "boolean",
            "description": "Label each sentence with its speaker (Speaker 1, Speaker 2...) for interviews, meetings and podcasts. The text, segments, SRT/VTT, Markdown and chunks show who speaks. Adds $0.003 per minute. Off by default.",
            "default": false
          },
          "numSpeakers": {
            "title": "Number of speakers",
            "minimum": 0,
            "maximum": 20,
            "type": "integer",
            "description": "How many people speak, if you know it (more exact labels). 0 = detect automatically.",
            "default": 0
          },
          "speakerNames": {
            "title": "Speaker names (optional)",
            "type": "object",
            "description": "With speaker labels on: names for the numbered speakers, e.g. {\"1\": \"Host\", \"2\": \"Guest\"}. Speakers are numbered in order of first appearance."
          },
          "subtitleMaxChars": {
            "title": "Subtitle line length (characters)",
            "minimum": 0,
            "maximum": 80,
            "type": "integer",
            "description": "Characters per subtitle line in SRT/VTT (42 is the broadcast and YouTube standard; 32-37 for vertical video). 0 keeps Whisper's long raw segments.",
            "default": 42
          },
          "subtitleMaxLines": {
            "title": "Lines per subtitle",
            "minimum": 1,
            "maximum": 3,
            "type": "integer",
            "description": "Maximum lines shown at once in each subtitle (when line length is set).",
            "default": 2
          },
          "subtitleMaxDuration": {
            "title": "Max seconds per subtitle",
            "minimum": 1,
            "maximum": 15,
            "type": "number",
            "description": "Longest time a single subtitle stays on screen (when line length is set).",
            "default": 6
          },
          "maxTotalMinutes": {
            "title": "Max total minutes per run",
            "minimum": 0,
            "type": "integer",
            "description": "Stop once this many audio minutes were charged in the run. The files not reached come back as free rows with status 'skipped'. 0 = no limit. Together with Apify's own run spending limit, this keeps a large batch within budget.",
            "default": 0
          },
          "skipFilesLongerThanMinutes": {
            "title": "Skip files longer than (minutes)",
            "minimum": 0,
            "type": "integer",
            "description": "Files longer than this are not transcribed and not charged (a free row says how long they were). 0 = no limit. Different from 'Max minutes per file', which transcribes only the beginning of long files.",
            "default": 0
          },
          "aiInsights": {
            "title": "AI summary, chapters and action items",
            "type": "boolean",
            "description": "Analyse each transcript with Claude: title, summary, key points, chapters with start times, action items and topics (in 'insights'). Requires your Anthropic API key; Claude usage is billed to your Anthropic account, plus one small 'AI insights' event per file.",
            "default": false
          },
          "anthropicApiKey": {
            "title": "Anthropic API key",
            "type": "string",
            "description": "Your key from console.anthropic.com. Stored as a secret input; used only to call Claude for this run."
          },
          "insightsModel": {
            "title": "Claude model",
            "enum": [
              "claude-opus-5-5",
              "claude-sonnet-5-5",
              "claude-haiku-5-5",
              "claude-opus-5",
              "claude-sonnet-5",
              "claude-haiku-4-5"
            ],
            "type": "string",
            "description": "'claude-opus-5-5': best quality (default). 'claude-sonnet-5-5': cheaper, great for meetings and podcasts. 'claude-haiku-5-5': cheapest. The older models still work.",
            "default": "claude-opus-5-5"
          },
          "insightsInstructions": {
            "title": "Insights instructions",
            "type": "string",
            "description": "Optional, e.g. 'Summarise in Spanish', 'Focus on decisions and owners', 'Chapters every ~10 minutes'."
          },
          "meetingNotes": {
            "title": "Meeting notes (decisions, action items with owner and due date)",
            "type": "boolean",
            "description": "Adds 'meetingNotes' to the AI insights: decisions, action items with owner and due date as said in the recording, and open questions. With speaker labels, each result also has 'talkTime' per speaker. Needs your Anthropic API key; billed as the AI insights event.",
            "default": false
          },
          "subtitleLanguages": {
            "title": "Translated subtitles (optional)",
            "type": "array",
            "description": "Also make SRT and VTT subtitles in these languages (up to 5), e.g. Spanish, German, Japanese. Timings and speaker labels are kept; returned in 'translatedSubtitles' (and as files with 'Also save downloadable files'). Translated by Claude with your Anthropic API key; billed as the AI insights event, once per file.",
            "items": {
              "type": "string"
            }
          },
          "saveFiles": {
            "title": "Also save downloadable files",
            "type": "boolean",
            "description": "Save the transcript (.txt) and subtitles (.srt / .vtt, if selected in outputs) as files in the run's key-value store; the result includes their download links.",
            "default": true
          },
          "wordTimestamps": {
            "title": "Word-level timestamps",
            "type": "boolean",
            "description": "Add start/end times for every word inside each segment (for karaoke-style captions or precise search). Slightly slower.",
            "default": false
          },
          "chunkSize": {
            "title": "Chunk size (characters)",
            "minimum": 200,
            "maximum": 20000,
            "type": "integer",
            "description": "Target size of 'RAG chunks'.",
            "default": 1000
          },
          "skipSilence": {
            "title": "Skip silence",
            "type": "boolean",
            "description": "Detect speech first and skip silent parts. Faster and reduces hallucinated text in long pauses.",
            "default": true
          },
          "audioChannel": {
            "title": "Stereo channel",
            "enum": [
              "mix",
              "left",
              "right"
            ],
            "type": "string",
            "description": "For call recordings with each person on one channel: transcribe only the left or right side. Mono files are the same either way.",
            "default": "mix"
          },
          "maxDurationMinutes": {
            "title": "Max minutes per file",
            "minimum": 1,
            "maximum": 1440,
            "type": "integer",
            "description": "Only the first N minutes of each file are transcribed (and billed).",
            "default": 240
          },
          "maxFileSizeMb": {
            "title": "Max file size (MB)",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Larger files are skipped (not billed).",
            "default": 1000
          },
          "failOnError": {
            "title": "Fail the run if any file fails",
            "type": "boolean",
            "description": "Mark the run as FAILED when a file cannot be transcribed. Useful for pipelines and monitoring.",
            "default": false
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}