{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Transcript Scraper API - Video to Text, SRT & Bulk",
    "description": "Transcribe TikTok videos: TikTok transcript API, TikTok video to text, TikTok captions and subtitles as text, SRT or VTT, in bulk. Each TikTok video transcript uses TikTok's own captions, or Whisper speech to text (TikTok transcription, audio to text) when there are none. API or MCP. From $0.002.",
    "version": "1.0",
    "x-build-id": "d9UwosUtKWKCiQeXW"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/sauliusautomatesit~tiktok-transcript-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-sauliusautomatesit-tiktok-transcript-scraper",
        "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/sauliusautomatesit~tiktok-transcript-scraper/runs": {
      "post": {
        "operationId": "runs-sync-sauliusautomatesit-tiktok-transcript-scraper",
        "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/sauliusautomatesit~tiktok-transcript-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-sauliusautomatesit-tiktok-transcript-scraper",
        "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",
        "required": [
          "videoUrls"
        ],
        "properties": {
          "videoUrls": {
            "title": "TikTok video URLs",
            "minItems": 1,
            "type": "array",
            "description": "TikTok video URLs to transcribe — one per line, from a single link to thousands. Share links (`vm.tiktok.com/…`, `tiktok.com/t/…`) and embed URLs work too. Profile, hashtag and search URLs are not video URLs and will be reported as errors.",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Transcript language",
            "type": "string",
            "description": "Two-letter language code (`en`, `es`, `pt`, `de`, `ru`…). Leave blank to keep the video's own language — the default, and what you want for a transcript. TikTok often publishes machine translations alongside the original captions; setting this picks that language's track when it exists (which may be one of those translations) and tells Whisper what to expect."
          },
          "allowWhisperFallback": {
            "title": "Transcribe with Whisper when a TikTok has no captions",
            "type": "boolean",
            "description": "On (default): TikToks without native captions are transcribed with Whisper speech-to-text, charged at the higher `asr_transcript` rate. Off: those videos return a `CAPTIONS_UNAVAILABLE` error and cost you nothing — the cheapest way to run large batches. Most TikToks have no usable native captions, so leaving this on is what makes the Actor useful.",
            "default": true
          },
          "forceWhisper": {
            "title": "Always use Whisper, even when captions exist",
            "type": "boolean",
            "description": "Off (default): TikTok's own caption track is used whenever there is one. On: every video is transcribed with Whisper and charged at the `asr_transcript` rate — 20× the caption price. Worth it only when you have judged TikTok's auto-captions too poor for your use.",
            "default": false
          },
          "maxDurationSeconds": {
            "title": "Maximum video length (seconds)",
            "minimum": 5,
            "maximum": 1200,
            "type": "integer",
            "description": "Videos longer than this are skipped with a `DURATION_EXCEEDED` error and are not charged. The default of 600 s (10 min) covers TikTok's longest uploads.",
            "default": 600
          },
          "maxAsrDurationSeconds": {
            "title": "Maximum length for Whisper transcription (seconds)",
            "minimum": 5,
            "maximum": 1200,
            "type": "integer",
            "description": "Applies only to videos with no native captions. Whisper costs roughly a second of CPU per 1.5 seconds of audio, so a per-video price only works up to a point; past this length a caption-less video returns `ASR_DURATION_EXCEEDED` and costs nothing. Videos **with** captions are never subject to this — they run to the full `maxDurationSeconds`.",
            "default": 180
          },
          "maxVideos": {
            "title": "Maximum videos per run",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Safety cap on how many URLs from the list are processed.",
            "default": 1000
          },
          "whisperModel": {
            "title": "Whisper model",
            "enum": [
              "tiny",
              "base",
              "small"
            ],
            "type": "string",
            "description": "Accuracy vs speed for the Whisper fallback only — videos with native captions ignore this. `base` is the recommended balance.",
            "default": "base"
          },
          "beamSize": {
            "title": "Whisper beam size",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Decoding beam width for the Whisper fallback. 1 is fastest; higher is marginally more accurate and slower.",
            "default": 1
          },
          "concurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many videos to resolve at once. Whisper transcription is always serialised regardless of this setting, to keep the run inside its memory limit.",
            "default": 5
          },
          "includeFailedItems": {
            "title": "Include failed videos in the dataset",
            "type": "boolean",
            "description": "On (default): unavailable, private, too-long and non-TikTok URLs get a dataset row carrying an `error` code, so you can reconcile inputs to outputs. Failed rows are never charged.",
            "default": true
          },
          "useResidentialFallback": {
            "title": "Retry on a residential IP when TikTok refuses the request",
            "type": "boolean",
            "description": "On (default): when TikTok answers the normal proxy with a bot check, that one request is retried through Apify's residential proxy. TikTok serves datacenter IPs perfectly well — both its pages and its media CDN — so this route is almost never used and TikTok runs measure zero residential traffic. It exists for the occasional individually-blocked IP.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Proxy used to reach TikTok. Apify Proxy is recommended: the run pins one proxy session so that a video's media file is fetched from the same IP that resolved the page, which is what TikTok's CDN requires.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}