{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Follower Count Scraper & TikTok User Info - Exact Counts",
    "description": "For influencer vetting, sponsorship reporting and growth dashboards: the exact follower, like and video counts TikTok publishes, not the rounded ones on screen. Of 14 profiles measured, 11 were wrong on screen, by up to 41,519 followers. Monitoring returns a profile only when a count moves.",
    "version": "0.1",
    "x-build-id": "vMRlFgjsWiGajzP7R"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/neverempty~tiktok-follower-count-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-neverempty-tiktok-follower-count-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/neverempty~tiktok-follower-count-scraper/runs": {
      "post": {
        "operationId": "runs-sync-neverempty-tiktok-follower-count-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/neverempty~tiktok-follower-count-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-neverempty-tiktok-follower-count-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": {
          "usernames": {
            "title": "TikTok usernames",
            "type": "array",
            "description": "Usernames (@nasa), plain names (nasa) or profile URLs (https://www.tiktok.com/@nasa, with or without the scheme). A video URL works too - the username is taken from it. Only /@username pages are requested, because TikTok's robots.txt disallows /search, /embed/@ and the shop pages; anything whose path is not a /@username page - a hashtag, a sound, a shop link - is rejected rather than read as a username. A name TikTok returns nothing for is reported as 'no such profile' with TikTok's own code, never guessed and never called banned.",
            "default": [
              "@nasa",
              "@duolingo"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxProfiles": {
            "title": "Maximum profiles to return",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many rows to return in total. You are charged for the rows you actually receive.",
            "default": 100
          },
          "monitoringMode": {
            "title": "Monitoring mode: return a profile only when its counts change",
            "type": "boolean",
            "description": "Off = return every profile you listed, charged per row. On = remember the counts and, on later runs, return a profile only when one of them actually moved; unchanged profiles cost nothing. The counts are remembered per account, not per list, so adding a username to the list does not re-charge the ones already being watched. **Monitoring adds a flat access fee of $5, charged once per calendar month (UTC)** on the first monitoring run of that month, no matter how many lists or scheduled tasks you run. That fee is what pays for watching on the days when nothing moved - those runs return no rows and cost nothing else. Runs with monitoring off never trigger it.",
            "default": false
          },
          "monitorMode": {
            "title": "What counts as a change",
            "enum": [
              "any-change",
              "follower-change"
            ],
            "type": "string",
            "description": "Any change = the profile comes back when followers, following, likes, videos or friends move. Follower change only = it comes back only when the follower count moves. Both compare the exact figures TikTok publishes, not the rounded ones it displays - a rounded count can sit at the same value for weeks on a large account, which is why monitoring built on the displayed number reports 'no change' when the account is in fact growing.",
            "default": "any-change"
          },
          "resetMonitoringState": {
            "title": "Forget what was remembered and start over",
            "type": "boolean",
            "description": "Clears every remembered count for this Actor, so the next run returns each profile once again and starts a fresh history. This affects all your monitoring runs, because the counts are stored per account rather than per list.",
            "default": false
          },
          "minFollowers": {
            "title": "Minimum followers",
            "minimum": 0,
            "type": "integer",
            "description": "Drop profiles below this follower count. Compared against the exact figure, not the rounded one in TikTok's page data. 0 = no minimum.",
            "default": 0
          },
          "maxFollowers": {
            "title": "Maximum followers",
            "minimum": 0,
            "type": "integer",
            "description": "Drop profiles above this follower count. 0 = no maximum.",
            "default": 0
          },
          "onlyVerified": {
            "title": "Verified accounts only",
            "type": "boolean",
            "description": "Keep only accounts TikTok marks as verified.",
            "default": false
          },
          "onlyWithBioLink": {
            "title": "Only accounts with a link in the bio",
            "type": "boolean",
            "description": "Keep only accounts that put a link in their bio. The link is returned as the creator typed it, which is often 'example.com' without https:// - no scheme is added, because adding one would invent an address the creator never wrote. An e-mail address or phone number written into that field is removed.",
            "default": false
          },
          "excludePrivate": {
            "title": "Skip private accounts",
            "type": "boolean",
            "description": "Drop accounts TikTok marks as private. They are returned by default. (No private account appeared in the 16 profiles measured on 2026-09-06, so how much TikTok publishes for them has not been measured here.)",
            "default": false
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only profiles whose display name, bio or username contains these words.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "keywordMatch": {
            "title": "Keyword match",
            "enum": [
              "any",
              "all"
            ],
            "type": "string",
            "description": "Any = at least one keyword. All = every keyword.",
            "default": "any"
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Drop profiles whose display name, bio or username contains any of these words.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "useProxy": {
            "title": "Use a proxy if TikTok answers with a bot check",
            "type": "boolean",
            "description": "Every profile is requested directly first, which is the fastest and cheapest path and works from Apify (measured 3 out of 3 on 2026-09-06). From some networks TikTok answers instead with HTTP 200 and a 1,462-byte page containing no profile data at all. That page is reported as a bot check, never as an account with no followers. With this on, the run switches to a proxy session and tries again; with it off, the bot check is returned as a row and no proxy is paid for.",
            "default": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}