{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Transcripts Scraper | Bulk Captions, SRT & Translations",
    "description": "Get TikTok transcripts in bulk from video links, share links or IDs: plain text, timed segments, SRT and WebVTT subtitles, spoken language and TikTok's own translations, plus views, likes and creator stats. Videos without captions get a free row; only transcripts are charged.",
    "version": "0.1",
    "x-build-id": "rsrXDdc5cK7TyIEBk"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/corvuslab~tiktok-transcripts-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-corvuslab-tiktok-transcripts-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/corvuslab~tiktok-transcripts-scraper/runs": {
      "post": {
        "operationId": "runs-sync-corvuslab-tiktok-transcripts-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/corvuslab~tiktok-transcripts-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-corvuslab-tiktok-transcripts-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",
        "properties": {
          "videoUrls": {
            "title": "🔗 TikTok video URLs",
            "type": "array",
            "description": "One TikTok video per line. Each video becomes one row. Links that are not videos get a row explaining why they were skipped.",
            "items": {
              "type": "string"
            }
          },
          "profileUrls": {
            "title": "👤 Profiles",
            "type": "array",
            "description": "TikTok accounts as @handle or profile link. Transcribes each account's most recent videos that can be found, up to 'Videos per profile, search or hashtag'. This is a recent selection, not the account's full archive.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "🔍 Search keywords",
            "type": "array",
            "description": "Find videos by keyword and transcribe them, for example 'iphone 17 review'.",
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "#️⃣ Hashtags",
            "type": "array",
            "description": "Find videos by hashtag and transcribe them. With or without the #.",
            "items": {
              "type": "string"
            }
          },
          "videosPerSource": {
            "title": "🎯 Videos per profile, search or hashtag",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "How many videos to transcribe from each profile, search or hashtag. Videos you paste directly are always all included.",
            "default": 10
          },
          "maxResults": {
            "title": "🔢 Max transcripts",
            "minimum": 1,
            "type": "integer",
            "description": "Stop after this many transcripts. Leave empty to transcribe every video in the list."
          },
          "translateTo": {
            "title": "🌐 Also get translations into",
            "type": "array",
            "description": "TikTok's own caption translations, added to the translations field when TikTok has one for that video. Not every video is translated into every language. An English translation of non-English videos is included whenever TikTok has one, even without selecting it.",
            "items": {
              "type": "string",
              "enum": [
                "en",
                "es",
                "fr",
                "pt",
                "de",
                "ar",
                "zh-Hans"
              ],
              "enumTitles": [
                "English",
                "Spanish",
                "French",
                "Portuguese",
                "German",
                "Arabic",
                "Chinese (Simplified)"
              ]
            }
          },
          "includeSegments": {
            "title": "⏱️ Timed segments",
            "type": "boolean",
            "description": "Add each spoken line with its start and end time in seconds.",
            "default": true
          },
          "includeSrt": {
            "title": "🎞️ SRT subtitle file",
            "type": "boolean",
            "description": "Add the transcript as SRT subtitles, ready to import into a video editor.",
            "default": false
          },
          "includeVtt": {
            "title": "🌐 WebVTT subtitle file",
            "type": "boolean",
            "description": "Add the transcript as WebVTT subtitles, the format web video players use.",
            "default": false
          },
          "includeVideosWithoutCaptions": {
            "title": "🚫 List videos without a transcript",
            "type": "boolean",
            "description": "Add a row (free of charge) for videos TikTok has no captions for, and for photo posts, so you can see which videos in your list had no transcript. Turn off to skip them. Dead or invalid links always get a row.",
            "default": true
          },
          "compact": {
            "title": "📦 Compact records",
            "type": "boolean",
            "description": "Return only the transcript and the core video fields. Ideal for AI agents and LLM pipelines.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "🧹 Drop empty fields",
            "type": "boolean",
            "description": "Remove null, empty-string and empty-array fields from each record.",
            "default": false
          },
          "incrementalMode": {
            "title": "♻️ Incremental mode",
            "type": "boolean",
            "description": "Remember which transcripts earlier runs returned and tag every record with a changeType (NEW / UPDATED / UNCHANGED / EXPIRED). Unchanged transcripts are skipped and not charged. View and like counts changing does not count as a change.",
            "default": false
          },
          "stateKey": {
            "title": "🗝️ State key",
            "type": "string",
            "description": "Stable name for the tracked list. Leave empty to derive one from your video URLs. Set it yourself if you add videos to the list over time."
          },
          "emitUnchanged": {
            "title": "🔁 Include unchanged transcripts",
            "type": "boolean",
            "description": "Also return transcripts that have not changed since the previous run.",
            "default": false
          },
          "emitExpired": {
            "title": "🗑️ Include removed videos",
            "type": "boolean",
            "description": "Add a row for videos that were in the previous run but are gone now.",
            "default": false
          },
          "telegramToken": {
            "title": "💬 Telegram bot token",
            "type": "string",
            "description": "Bot token from @BotFather."
          },
          "telegramChatId": {
            "title": "🆔 Telegram chat ID",
            "type": "string",
            "description": "Chat or channel ID, e.g. \"-100123456789\" or \"@yourchannel\"."
          },
          "slackWebhookUrl": {
            "title": "💼 Slack webhook URL",
            "type": "string",
            "description": "Slack incoming-webhook URL."
          },
          "discordWebhookUrl": {
            "title": "🎮 Discord webhook URL",
            "type": "string",
            "description": "Discord incoming-webhook URL."
          },
          "webhookUrl": {
            "title": "🪝 Webhook URL",
            "type": "string",
            "description": "Any HTTPS endpoint. Receives a JSON POST with the new transcripts. Works with n8n, Make and Zapier."
          },
          "webhookHeaders": {
            "title": "🧾 Webhook headers",
            "type": "object",
            "description": "Extra headers for the webhook request, e.g. {\"Authorization\": \"Bearer xyz\"}."
          },
          "notificationLimit": {
            "title": "🔢 Transcripts per notification",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many transcripts to include in each notification message.",
            "default": 5
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy configuration",
            "type": "object",
            "description": "Not needed: the scraper works without a proxy. Turn one on only if TikTok starts refusing requests.",
            "default": {
              "useApifyProxy": false
            }
          },
          "maxConcurrency": {
            "title": "⚡ Videos in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many videos to read at the same time.",
            "default": 5
          },
          "maxRequestRetries": {
            "title": "🔄 Max request retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "How many times to retry a failed request before giving up on it.",
            "default": 3
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}