{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Followers & Following Scraper: TikTok Followers List",
    "description": "TikTok followers scraper and following scraper: export the followers list and following list of any TikTok account, one row per follower with exact follower count, user id, secUid, bio, verified flag and follow time window. Newest first up to 10,000; only new followers on a schedule. No login.",
    "version": "0.1",
    "x-build-id": "goHcUsZ9OYRrGJhyD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/hyperbach~tiktok-followers-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-hyperbach-tiktok-followers-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-followers-scraper/runs": {
      "post": {
        "operationId": "runs-sync-hyperbach-tiktok-followers-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-followers-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-hyperbach-tiktok-followers-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": {
          "accounts": {
            "title": "Accounts",
            "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's lists are read), a numeric user id, a secUid, or a share link (vm.tiktok.com/…). Handles are case-insensitive; an account named twice is read once.",
            "items": {
              "type": "string",
              "pattern": "^\\s*(@?[A-Za-z0-9_.%]{1,80}([?#]\\S*)?/?|MS4wLjABAAAA[A-Za-z0-9_-]{20,}|[0-9]{5,25}|([A-Za-z]+://)?([A-Za-z0-9-]+\\.)+[A-Za-z]{2,}(/\\S*)?)\\s*$"
            },
            "default": []
          },
          "lists": {
            "title": "Lists",
            "enum": [
              "followers",
              "following",
              "both"
            ],
            "type": "string",
            "description": "Which list of each account to read: its followers, the accounts it follows, or both. Each row says which (relation).",
            "default": "followers"
          },
          "maxFollowersPerAccount": {
            "title": "Followers per account",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "How many of each account's followers to deliver, newest first; 0 = everything TikTok serves (about the newest 10,000, of a few large accounts 50; then the list ends: the account row says SOURCE-LIMIT and the oldest follow time reached). Exact: 2 asked = 2 delivered and charged.",
            "default": 0
          },
          "maxFollowingPerAccount": {
            "title": "Following per account",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "How many of the accounts each account follows to deliver, newest first; 0 = the whole list TikTok serves (to its end; one page of 50 on a few large accounts). Accounts that hide their following list give a free row that says so.",
            "default": 0
          },
          "followedAfter": {
            "title": "Followed 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 the rows followed on or after this date: 2026-10-01, or a span back from the run's start such as 3 days (72 hours), 2 weeks, 6 months (UTC). TikTok gives each page a follow-time window, not a second per row, so the last page delivered may hold up to 30 rows older than the date (the account row says so)."
          },
          "onlyNew": {
            "title": "Only new since the last run",
            "type": "boolean",
            "description": "Deliver only the followers (or following) that appeared since the last run of the same task, newest first, and nothing when none did (0 rows, $0). The first run with this on delivers the whole list as the baseline. The memory is kept per account and list (by the user id) under stateStoreName, or under one default memory of your Apify account. Inside TikTok's window (the newest ≈ 10,000; 50 on a few large accounts) a scheduled run catches every new follower of an account that gains fewer than that between runs.",
            "default": false
          },
          "stateStoreName": {
            "title": "Memory name",
            "pattern": "^[A-Za-z0-9._-]{1,100}$",
            "type": "string",
            "description": "The name of the memory onlyNew uses between runs (per account and list, keyed by the user id, so a renamed account or another form of it keeps its memory). Empty = one default memory for your Apify account; give a name to keep two tasks on the same account apart."
          },
          "minFollowers": {
            "title": "Min followers of the listed account",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "integer",
            "description": "Deliver only listed accounts with at least this many followers (exact count); 0 = no filter. Rows left out are not charged and do not count against the caps.",
            "default": 0
          },
          "maxFollowers": {
            "title": "Max followers of the listed account",
            "minimum": 0,
            "maximum": 1000000000,
            "type": "integer",
            "description": "Deliver only listed accounts with at most this many followers; 0 = no filter.",
            "default": 0
          },
          "verifiedOnly": {
            "title": "Verified accounts only",
            "type": "boolean",
            "description": "Deliver only listed accounts with TikTok's verified badge.",
            "default": false
          },
          "withEmailOnly": {
            "title": "Accounts with an e-mail in the bio only",
            "type": "boolean",
            "description": "Deliver only listed accounts whose bio carries an e-mail address (bio_emails). Extraction from the bio text only; no contact finding.",
            "default": false
          },
          "bioKeywords": {
            "title": "Bio keywords",
            "type": "array",
            "description": "Deliver only listed accounts whose bio, name or handle contains one of these words (case-insensitive). Empty = no filter.",
            "items": {
              "type": "string",
              "maxLength": 100
            },
            "default": []
          },
          "includeProfileDetails": {
            "title": "Profile details per listed account",
            "type": "boolean",
            "description": "Read each delivered account's own profile page too (one request per row) for its created date, language, bio link, business category and organization flag. Charged per row as a profile_detail event, besides the row. TikTok shows no region to a logged-out reader, so none is given.",
            "default": false
          },
          "maxItems": {
            "title": "Max charged rows",
            "minimum": 0,
            "maximum": 1000000,
            "type": "integer",
            "description": "Stop after this many charged rows across all accounts and lists; 0 = no limit. Free rows (the account rows, misses) do not count. The run also stops inside your maximum charge and says so.",
            "default": 0
          },
          "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 and pages 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}