{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Transcript Scraper — TikTok Subtitles to Text, No Login",
    "description": "TikTok subtitles and transcripts for a creator's videos: type a handle and get every video as a row — views, likes, comments, shares, saves, caption, hashtags, duration and a playable MP4 link — with an opt-in transcript from TikTok's own captions or speech-to-text. No login.",
    "version": "1.0",
    "x-build-id": "IF4y9T8rwY7MAecdR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/steadyfetch~tiktok-profile-transcripts/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-steadyfetch-tiktok-profile-transcripts",
        "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/steadyfetch~tiktok-profile-transcripts/runs": {
      "post": {
        "operationId": "runs-sync-steadyfetch-tiktok-profile-transcripts",
        "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/steadyfetch~tiktok-profile-transcripts/run-sync": {
      "post": {
        "operationId": "run-sync-steadyfetch-tiktok-profile-transcripts",
        "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": [
          "profiles"
        ],
        "properties": {
          "profiles": {
            "title": "TikTok handles",
            "type": "array",
            "description": "TikTok creator handles, one per line — \"natgeo\", \"@nasa\"; a profile link (tiktok.com/@natgeo) works too, and \"_demo\" is the sample switch, not a handle. A handle that does not exist, a private or deactivated account, a creator TikTok lists no videos for and a feed read that did not go through all ship as labelled rows and are never charged. A link to a single video is refused with a row naming the actor that does take it. Leave it empty in the console and the run returns built-in sample rows instead of collecting anything, so you can see the output shape at no result fee.",
            "default": [
              "_demo"
            ],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "TikTok profile links",
            "type": "array",
            "description": "The same thing in the store’s own field name: TikTok profile links, for buyers moving over from another scraper — e.g. https://www.tiktok.com/@natgeo. A line this actor cannot place is refused on an uncharged row naming the field or the sibling actor that does take it, so a wrong link never costs you anything. Anything this actor can prove is a profile is collected; a single-video link is refused this way and the row names the actor that takes it.",
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "includeTranscripts": {
            "title": "Include transcripts",
            "type": "boolean",
            "description": "ON adds a transcript to every delivered video — `transcript`, `transcriptSource`, `transcriptLanguage` and timestamped `transcriptSegments` — e.g. {\"profiles\": [\"natgeo\"], \"includeTranscripts\": true}. Charged as one Video transcript per transcript actually delivered, $0.015 on the Apify free plan and from $0.0075 on paid plans, plus $0.005 per started minute past the first 3, on top of the video row. Never charged: a video with no speech, a photo post, and a video this account already has. OFF (default): rows carry the caption and metadata only. A photo post carries no video and is delivered without a transcript, uncharged for one.",
            "default": false
          },
          "sortBy": {
            "title": "Order",
            "type": "string",
            "description": "Which of the creator's feeds to walk. \"latest\" (default) is the profile grid newest first. \"popular\" is TikTok's own most-played ordering for that creator, a different set of videos. An order this actor does not recognise is refused on an uncharged row naming the two that work — never quietly swapped.",
            "default": "latest"
          },
          "resultsLimit": {
            "title": "Max videos per profile",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on the videos collected from each handle. The feed is read ten at a time, so a limit of 12 buys two pages and delivers exactly 12. A creator with fewer videos than you asked for leaves an uncharged row saying so. Ask for more than this actor serves per creator and the run still starts: it continues at the actor's own ceiling of 2,000 videos, with one uncharged row saying what was asked and what bound it.",
            "default": 30
          },
          "maxItems": {
            "title": "Max videos in the run",
            "minimum": 1,
            "type": "integer",
            "description": "Hard cap on the videos this whole run delivers, across every handle. Reached first, it stops the run cleanly and the last row says which handles were left undone. Ask for more than this actor serves in one run and the run still starts: it continues at the actor's own ceiling of 20,000 videos, with one uncharged row saying so.",
            "default": 1000
          },
          "maxRunSeconds": {
            "title": "Max run seconds",
            "type": "integer",
            "description": "The run stops cleanly before this many seconds and reports what is left, instead of being killed by a timeout. A time limit ends the collecting, never the delivering: videos already in hand are always written out. With transcripts on, budget roughly 3-6 seconds per video. Anything outside the actor's own range of 30 to 3,600 seconds still starts a run: the clock is set to the nearest end of that range and one uncharged row says so.",
            "default": 1800
          },
          "includeSeen": {
            "title": "Include videos you already have",
            "type": "boolean",
            "description": "OFF (default): a video already delivered to your account is skipped — no row, no charge — and the next new video takes its place, so you still get the number you asked for. ON: those videos are delivered again anyway, marked `repeat: true`, without a transcript leg and still not charged. Videos older than 90 days in your account's memory count as new again either way.",
            "default": false
          },
          "resumeFromDatasetId": {
            "title": "Skip videos in this dataset",
            "type": "string",
            "description": "The dataset ID of a previous run of this actor. Videos already in it are treated as videos you already have and are skipped, so a follow-up run collects only what is new even from a different Apify account. Selecting it here is what grants this run permission to read it."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}