{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok User Profile Scraper — TikTok Followers, Videos, Stats",
    "description": "Scrape TikTok user profiles by username, URL, user id or secUid: exact follower count, likes and video count, user id, secUid, created date, bio link, plus each profile's videos with plays and captions, followers and following lists. TikTok stats and profile data as an API. No login.",
    "version": "0.1",
    "x-build-id": "C5qebL8icUTvu2LbB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/hyperbach~tiktok-profile-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-hyperbach-tiktok-profile-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/hyperbach~tiktok-profile-scraper/runs": {
      "post": {
        "operationId": "runs-sync-hyperbach-tiktok-profile-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/hyperbach~tiktok-profile-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-hyperbach-tiktok-profile-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": {
          "profiles": {
            "title": "Profiles",
            "type": "array",
            "description": "TikTok accounts, one per line, in any form: a handle (notionhq or @notionhq), a profile URL, a video or photo URL (its author is read), a numeric user id, a secUid, a share link (vm.tiktok.com/…), or a playlist or collection URL (its videos are read). Handles are case-insensitive; an account named twice is read once.",
            "items": {
              "type": "string",
              "pattern": "^\\s*(@?[A-Za-z0-9_.]{1,64}/?|MS4wLjABAAAA[A-Za-z0-9_-]{20,}|([A-Za-z]+://)?([A-Za-z0-9-]+\\.)*[Tt][Ii][Kk][Tt][Oo][Kk]\\.[Cc][Oo][Mm](/\\S*)?)\\s*$"
            },
            "default": []
          },
          "readCountries": {
            "title": "Read from countries",
            "type": "array",
            "description": "The country each account is read from. TikTok shows the counts and the videos of the reader's country (Notion: 331 videos to a US reader, 330 to a German one), so every row says which country read it. Two countries give two labelled profile rows per account; videos and lists are read from the first country.",
            "items": {
              "type": "string",
              "enum": [
                "US",
                "GB",
                "DE",
                "FR",
                "ES",
                "IT",
                "NL",
                "PL",
                "SE",
                "IE",
                "CA",
                "AU",
                "BR",
                "MX",
                "JP"
              ],
              "enumTitles": [
                "United States",
                "United Kingdom",
                "Germany",
                "France",
                "Spain",
                "Italy",
                "Netherlands",
                "Poland",
                "Sweden",
                "Ireland",
                "Canada",
                "Australia",
                "Brazil",
                "Mexico",
                "Japan"
              ]
            },
            "default": [
              "US"
            ]
          },
          "maxVideosPerProfile": {
            "title": "Videos per profile",
            "minimum": 0,
            "maximum": 10000,
            "type": "integer",
            "description": "How many of each profile's own videos to deliver; 0 = the profile row only. Up to 10 newest are read from TikTok's embed and each video's page; more are read by walking the profile's video list in a browser, to the end if you ask for more than the account has, with a COMPLETE or TRUNCATED verdict against TikTok's own count. A browser walk (more than 10, Popular or Oldest order, a date window past the newest 10, excludePinned) is charged once per profile as a video_walk event, besides the videos.",
            "default": 0
          },
          "videoOrder": {
            "title": "Video order",
            "enum": [
              "latest",
              "popular",
              "oldest"
            ],
            "type": "string",
            "description": "Which end of the video list to read from: TikTok's own Latest, Popular and Oldest tabs.",
            "default": "latest"
          },
          "videosNewerThan": {
            "title": "Videos posted on or after",
            "pattern": "^\\s*(|\\d{4}-\\d{2}-\\d{2}|\\d{1,4}\\s*([Dd][Aa][Yy]|[Ww][Ee][Ee][Kk]|[Mm][Oo][Nn][Tt][Hh]|[Yy][Ee][Aa][Rr])[Ss]?)\\s*$",
            "type": "string",
            "description": "Only videos posted on or after this date: 2026-05-01, or a span back from today such as 30 days, 2 weeks, 6 months, 1 year (UTC)."
          },
          "videosOlderThan": {
            "title": "Videos posted before",
            "pattern": "^\\s*(|\\d{4}-\\d{2}-\\d{2}|\\d{1,4}\\s*([Dd][Aa][Yy]|[Ww][Ee][Ee][Kk]|[Mm][Oo][Nn][Tt][Hh]|[Yy][Ee][Aa][Rr])[Ss]?)\\s*$",
            "type": "string",
            "description": "Only videos posted before this date: 2026-06-01, or a span back from today (UTC)."
          },
          "excludePinned": {
            "title": "Leave out pinned videos",
            "type": "boolean",
            "description": "Skip the videos the account pinned to the top of its profile. Read in the browser, where TikTok marks them.",
            "default": false
          },
          "includeTranscripts": {
            "title": "Transcripts from captions",
            "type": "boolean",
            "description": "The spoken text of each video, from TikTok's own caption track (automatic or the creator's), in the video's language. A video without a caption track gets none; no AI transcription.",
            "default": false
          },
          "downloadMedia": {
            "title": "Store media files",
            "enum": [
              "none",
              "images",
              "videos"
            ],
            "type": "string",
            "description": "Copy files into the run's key-value store, so the rows carry links that work as long as the store is kept (Apify's data retention for a run's default store; TikTok's own links expire within hours to days). Charged per file written.",
            "default": "none"
          },
          "maxRepostsPerProfile": {
            "title": "Reposts per profile",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Videos the profile reposted, newest first, as video rows.",
            "default": 0
          },
          "maxLikedPerProfile": {
            "title": "Liked videos per profile",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Videos the profile liked, where the account makes its liked tab public (most do not: the profile row's liked_public says which).",
            "default": 0
          },
          "includeStories": {
            "title": "Active stories",
            "type": "boolean",
            "description": "The profile's active stories as video rows (video_source story), when it has any.",
            "default": false
          },
          "includePlaylists": {
            "title": "Playlists",
            "type": "boolean",
            "description": "One free row per playlist of the profile (name, video count, URL). Give a playlist URL in Profiles for its videos.",
            "default": false
          },
          "maxFollowersPerProfile": {
            "title": "Followers per profile",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Accounts that follow the profile, newest follower first, each with its own exact counts.",
            "default": 0
          },
          "maxFollowingPerProfile": {
            "title": "Following per profile",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Accounts the profile follows, where the account shows them.",
            "default": 0
          },
          "outputFormat": {
            "title": "Field names",
            "enum": [
              "full",
              "clockworks"
            ],
            "type": "string",
            "description": "Full gives flat rows with every field below. clockworks gives profile and video rows in the field names of the most used TikTok profile actor, so a pipeline built on it reads this one unchanged — with exact counts instead of rounded ones.",
            "default": "full"
          },
          "maxItems": {
            "title": "Max charged rows",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop after this many charged rows (profiles, videos and users together); 0 = no limit. Free rows (accounts not found, private, empty) do not count. The run also stops inside your maximum charge and says so.",
            "default": 0
          },
          "onlyChanged": {
            "title": "Only profiles that changed",
            "type": "boolean",
            "description": "Monitoring: deliver (and charge) a profile only when a count, the handle, the bio or another watched field changed since the last run that delivered it. Each row carries the previous counts, the change and the change per day.",
            "default": false
          },
          "onlyNewVideos": {
            "title": "Only videos not delivered before",
            "type": "boolean",
            "description": "Monitoring: skip videos an earlier run of the same task already delivered.",
            "default": false
          },
          "stateStoreName": {
            "title": "Monitoring memory name",
            "pattern": "^[A-Za-z0-9._-]{1,100}$",
            "type": "string",
            "description": "The name of the memory that keeps each account's counts between runs (a count history on every row, keyed by the user id, so a renamed account keeps its history). Set by itself from the accounts when onlyChanged or onlyNewVideos is on."
          },
          "runTag": {
            "title": "Run tag",
            "maxLength": 200,
            "type": "string",
            "description": "A label copied onto every row (run_tag), to tell runs apart in a shared dataset."
          },
          "resumeFromRunId": {
            "title": "Continue an earlier run",
            "pattern": "^[A-Za-z0-9]{17}$",
            "type": "string",
            "description": "The id of an earlier run of this actor with the same input that stopped before the end: this run reads only the accounts it had not finished, and delivers nothing twice."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}