{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Profile Scraper With Bio Link & Contact Leads",
    "description": "The TikTok Profile Scraper extracts public TikTok profile data, including usernames, bios, followers, following counts, likes, and profile URLs. Ideal for marketers, analysts, and researchers to track influencer metrics, study engagement, and build accurate audience insights efficiently.",
    "version": "0.1",
    "x-build-id": "kVkd9BoioVSGQhIa1"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/api-empire~tiktok-profile-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-api-empire-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/api-empire~tiktok-profile-scraper/runs": {
      "post": {
        "operationId": "runs-sync-api-empire-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/api-empire~tiktok-profile-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-api-empire-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": {
          "creatorHandles": {
            "title": "🎯 TikTok Creator Handles",
            "type": "array",
            "description": "One creator per line. Accepts a handle (`mrbeast`), an @handle (`@thekoreanvegan`) or a full profile URL (`https://www.tiktok.com/@nike`).\n\nEach creator produces exactly ONE charged contact-record row.",
            "items": {
              "type": "string"
            }
          },
          "contactsOnly": {
            "title": "📇 Keep only creators that expose a contact",
            "type": "boolean",
            "description": "When on, a creator with no bio link, email or phone is dropped from the results — but still writes an UNCHARGED accounting row naming the reason, so a 100-in / 8-out run is auditable instead of looking broken. Default is off.",
            "default": false
          },
          "expandLinkAggregators": {
            "title": "🔗 Follow bio links to their real destinations",
            "type": "boolean",
            "description": "Follows a Linktree / hoo.be / Beacons / bio.link style bio link and returns the real destination URLs behind it (website, shop, booking page, socials).\n\nAggregators that render their links purely in JavaScript expose nothing to fetch — those return an empty list with status `no_ssr_links` rather than a guessed destination. Default is on.",
            "default": true
          },
          "scanVideoCaptions": {
            "title": "💬 Also scan video captions for contacts",
            "type": "boolean",
            "description": "Runs the email / phone / URL extractor over the fetched video captions as well as the bio. Useful for creators who publish a booking address in a campaign caption. Default is on.",
            "default": true
          },
          "customDomains": {
            "title": "📨 Only accept emails on these domains",
            "type": "array",
            "description": "Optional allowlist. Example: `gmail.com`, `mycompany.com`. Leave empty to keep every extracted address.\n\nA social @handle can never be parsed as an email and a bare licence or ID number can never be parsed as a phone — both guards are built in.",
            "items": {
              "type": "string"
            }
          },
          "maxVideosPerCreator": {
            "title": "🎬 Videos to pull per creator",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "How many recent videos to fetch behind each contact record. They feed the caption contact scan and ship as uncharged child rows. Set to 0 for a profile-only, contacts-only run (fastest). Default is 10, maximum 200.",
            "default": 10
          },
          "includeVideoRows": {
            "title": "📄 Include the video rows in the output",
            "type": "boolean",
            "description": "Off = the dataset holds contact records only, while captions are still scanned for contacts. Video rows are never charged either way — only the creator record is. Default is on.",
            "default": true
          },
          "profileSorting": {
            "title": "🔀 Order of the fetched video window",
            "enum": [
              "latest",
              "popular",
              "oldest"
            ],
            "type": "string",
            "description": "Client-side ordering of the videos that were fetched. TikTok's API does not sort server-side, so this reorders the recent window only — it does not reach further back in a creator's history.",
            "default": "latest"
          },
          "oldestPostDateUnified": {
            "title": "📅 Only videos published after",
            "type": "string",
            "description": "Absolute date (YYYY-MM-DD) or relative days-ago (e.g. 30). Filters the video rows and the caption contact scan; the contact record itself is always produced."
          },
          "newestPostDate": {
            "title": "📅 Only videos published before",
            "type": "string",
            "description": "Absolute date (YYYY-MM-DD) or relative days-ago (e.g. 0 for today)."
          },
          "leastDiggs": {
            "title": "❤️ Only videos with at least this many hearts",
            "minimum": 1,
            "type": "integer",
            "description": "Minimum heart (like) count on a video row."
          },
          "mostDiggs": {
            "title": "🤍 Only videos with fewer hearts than",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum heart (like) count on a video row."
          },
          "profiles": {
            "title": "👤 Creator handles (original key)",
            "type": "array",
            "description": "Backward-compatible alias for 🎯 TikTok Creator Handles. An input written for the original TikTok Profile Scraper runs here unchanged; when both are supplied this one wins.",
            "items": {
              "type": "string"
            }
          },
          "resultsPerPage": {
            "title": "🔢 Posts per profile (original key)",
            "minimum": 0,
            "maximum": 200,
            "type": "integer",
            "description": "Backward-compatible alias for 🎬 Videos to pull per creator. Capped at 200."
          },
          "profileScrapeSections": {
            "title": "📂 Content sections (original key)",
            "type": "array",
            "description": "Accepted for backward compatibility. This actor reads a creator's own videos; reposts are out of scope for a contact record.",
            "items": {
              "type": "string",
              "enum": [
                "videos",
                "reposts"
              ]
            }
          },
          "maxFollowersPerProfile": {
            "title": "👥 Skip videos whose author is above this follower count",
            "minimum": 1,
            "type": "integer",
            "description": "Author-level ceiling applied to video rows."
          },
          "maxFollowingPerProfile": {
            "title": "👣 Skip videos whose author follows more than",
            "minimum": 1,
            "type": "integer",
            "description": "Author-level ceiling applied to video rows."
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy",
            "type": "object",
            "description": "Optional. The scraper starts direct and escalates to datacenter, then residential, only while a creator has produced no rows yet — so a retry can never duplicate or double-charge a row."
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}