{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Email Scraper — Influencer Creator Leads",
    "description": "TikTok influencer email & creator-lead scraper. Niche hashtag packs (beauty, fitness, local). Optional contact, shop-link, and metrics events. Pay per billed event. No official TikTok API key.",
    "version": "2.2",
    "x-build-id": "wAuQmHiLyUxymNX6v"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/intelscrape~tiktok-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-intelscrape-tiktok-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/intelscrape~tiktok-scraper/runs": {
      "post": {
        "operationId": "runs-sync-intelscrape-tiktok-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/intelscrape~tiktok-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-intelscrape-tiktok-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": {
          "hashtags": {
            "title": "Videos with this hashtag",
            "type": "array",
            "description": "TIP: For influencer outreach, start with niche packs like 'skincare', 'fitnesstok', or 'localbusiness'. Add one or more TikTok hashtags and the scraper collects creator/video leads.",
            "items": {
              "type": "string"
            }
          },
          "resultsPerPage": {
            "title": "💯 Number of videos per hashtag, profile or search",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Add the number of TikToks you want to scrape per hashtag, profile, or search query. This field is applicable to #️⃣ Hashtags, 😎 Profiles, and 🔍 Search.",
            "default": 100
          },
          "profiles": {
            "title": "Usernames",
            "type": "array",
            "description": "Add one or multiple TikTok usernames or user IDs you want to scrape. You can enter the usernames one by one, or use the Bulk edit section to add a prepared list.",
            "items": {
              "type": "string"
            }
          },
          "scrapeReposts": {
            "title": "Scrape reposts",
            "type": "boolean",
            "description": "Tick to scrape reposted videos from user profiles in addition to their own videos. (Note: May require specific API conditions)",
            "default": false
          },
          "profileSorting": {
            "title": "Profile video sorting",
            "enum": [
              "latest",
              "oldest",
              "popular"
            ],
            "type": "string",
            "description": "Select Latest to scrape the most recent videos first, Oldest — the oldest videos first, Popular — the most popular videos first. Date filters only work with Latest and Oldest.",
            "default": "latest"
          },
          "excludePinnedPosts": {
            "title": "Exclude pinned posts",
            "type": "boolean",
            "description": "Tick to exclude pinned posts from profiles. Pinned posts are usually the first videos on a profile's page.",
            "default": false
          },
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Your keyword will apply to both videos and profiles. Use the Search sorting field below to specify whether you want your search to apply to top content, videos or users.\nAs for your query's format, you can use any query that works on TikTok.",
            "items": {
              "type": "string"
            }
          },
          "searchSection": {
            "title": "Search sorting",
            "enum": [
              "",
              "video",
              "user"
            ],
            "type": "string",
            "description": "By default, this scraper will sort the search results by whatever shows up in the Top section of TikTok search. But you can narrow it down: if you want to apply your search query to just videos, use Video, just profiles — Profile.",
            "default": ""
          },
          "maxProfilesPerQuery": {
            "title": "Max profiles per search query",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Only applies to profile searches. In this case ignore the 💯 Number of videos section and choose the number of profiles you want to scrape here.",
            "default": 10
          },
          "videoSearchSorting": {
            "title": "Video search sorting",
            "enum": [
              "MOST_RELEVANT",
              "MOST_LIKED",
              "NEWEST"
            ],
            "type": "string",
            "description": "Select how you want the search results to be sorted when searching for videos. Only valid with Video search section.",
            "default": "MOST_RELEVANT"
          },
          "videoSearchDateFilter": {
            "title": "Video search date filter",
            "enum": [
              "ALL_TIME",
              "LAST_DAY",
              "THIS_WEEK",
              "THIS_MONTH",
              "LAST_THREE_MONTHS",
              "LAST_SIX_MONTHS"
            ],
            "type": "string",
            "description": "Select a date range in which to search for videos. Only valid with Video search section.",
            "default": "ALL_TIME"
          },
          "postURLs": {
            "title": "Video URLs",
            "type": "array",
            "description": "Add the URLs of TikTok videos you want to scrape. You can paste video URLs one by one, or use the Bulk edit section to add a prepared list.",
            "items": {
              "type": "string"
            }
          },
          "scrapeRelatedVideos": {
            "title": "Scrape related videos",
            "type": "boolean",
            "description": "Tick to scrape related videos for the post URLs you provide. The maximum number of scraped related videos is set by the resultsPerPage count. Note that this only works for direct video URLs from the postURLs field.",
            "default": false
          },
          "shouldDownloadVideos": {
            "title": "Download TikTok videos",
            "type": "boolean",
            "description": "This is a charged add-on. Tick to download TikTok videos to the key-value store.",
            "default": false
          },
          "shouldDownloadCovers": {
            "title": "Download cover images (thumbnails)",
            "type": "boolean",
            "description": "Tick to download TikTok video cover images (thumbnails).",
            "default": false
          },
          "shouldDownloadSlideshowImages": {
            "title": "Download slideshow images",
            "type": "boolean",
            "description": "Tick to download TikTok slideshow images.",
            "default": false
          },
          "shouldDownloadAvatars": {
            "title": "Download profile avatars",
            "type": "boolean",
            "description": "Tick to download authors' profile pictures.",
            "default": false
          },
          "shouldDownloadMusicCovers": {
            "title": "Download music covers",
            "type": "boolean",
            "description": "Tick to download cover images of sounds used in posts.",
            "default": false
          },
          "shouldDownloadSubtitles": {
            "title": "Download subtitles",
            "type": "boolean",
            "description": "Download subtitles provided by TikTok for videos that have them.",
            "default": false
          },
          "commentsPerPost": {
            "title": "Comments per post",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "The number of comments extracted from every result. Due to TikTok API limitations, the actual number of scraped comments may differ, especially for posts with thousands of comments. The link to the dataset will be under a field commentsDatasetURL in the output.",
            "default": 0
          },
          "oldestPostDate": {
            "title": "Oldest post date",
            "type": "string",
            "description": "Only videos uploaded after or on this date will be scraped. Format: YYYY-MM-DD. Alternatively, specify how old the scraped videos should be in days. Putting 1 will get you only today's posts, 2 — yesterday's and today's, and so on."
          },
          "newestPostDate": {
            "title": "Newest post date",
            "type": "string",
            "description": "Only videos uploaded before or on this date will be scraped. Format: YYYY-MM-DD."
          },
          "minLikes": {
            "title": "Minimum likes (hearts)",
            "minimum": 0,
            "type": "integer",
            "description": "Only scrape videos with no less hearts than the number you add. Doesn't work with date filters."
          },
          "maxLikes": {
            "title": "Maximum likes (hearts)",
            "minimum": 0,
            "type": "integer",
            "description": "Only scrape videos with less hearts than the number you add. Doesn't work with date filters."
          },
          "proxyCountryCode": {
            "title": "Proxy country",
            "enum": [
              "None",
              "US",
              "GB",
              "DE",
              "FR",
              "ES",
              "IT",
              "NL",
              "PL",
              "JP",
              "KR",
              "BR",
              "MX",
              "IN",
              "AU",
              "CA",
              "TH",
              "VN",
              "ID",
              "PH",
              "MY",
              "SG",
              "AE",
              "SA",
              "TR",
              "ZA",
              "NG",
              "EG"
            ],
            "type": "string",
            "description": "This is an additional charged filter. By selecting a proxy country, the Actor will use residential proxy group to get country-specific data. Note that using proxies might slow down your runs.",
            "default": "None"
          },
          "extractContactInfo": {
            "title": "Extract Emails & Socials",
            "type": "boolean",
            "description": "💡 TIP: Use this to build influencer outreach lists. Parses bios for emails, Instagram, Twitter/X, and YouTube handles (rival: funny_ground).",
            "default": true
          },
          "uniqueAuthors": {
            "title": "One row per creator (unique authors)",
            "type": "boolean",
            "description": "Deduplicate to one dataset row per TikTok creator (keeps the richest contact row). On by default for influencer lead lists — turn off if you need every video.",
            "default": true
          },
          "minFollowers": {
            "title": "Minimum followers",
            "minimum": 0,
            "type": "integer",
            "description": "Skip creators below this follower count (0 = no filter). Useful for micro/mid-tier outreach."
          },
          "maxFollowers": {
            "title": "Maximum followers",
            "minimum": 0,
            "type": "integer",
            "description": "Skip creators above this follower count (0 = no max). Pair with Minimum followers for nano/micro bands (rival: afanasenko).",
            "default": 0
          },
          "mustBeVerified": {
            "title": "Verified creators only",
            "type": "boolean",
            "description": "Keep only TikTok blue-check verified creators. Off by default — too restrictive for most outreach.",
            "default": false
          },
          "extractWebsiteUrl": {
            "title": "Extract bio website / link-in-bio URL",
            "type": "boolean",
            "description": "Capture the creator's bio link URL when present (authorMeta.websiteUrl). No extra fetch.",
            "default": true
          },
          "followBioLink": {
            "title": "Follow link-in-bio for emails",
            "type": "boolean",
            "description": "When bio has no email, fetch the link-in-bio page (Linktree, Beacons, personal site) and extract mailto/visible emails. Cached per creator. Rival: apricot/nexgendata.",
            "default": true
          },
          "verifyMx": {
            "title": "MX-verify emails",
            "type": "boolean",
            "description": "DNS MX lookup on each found email domain (cached). Sets authorMeta.emailMxOk + emailMxHosts. Rival: apricot.",
            "default": true
          },
          "onlyWithContact": {
            "title": "Only creators with a contact handle",
            "type": "boolean",
            "description": "Keep only rows where email, Instagram, Twitter/X, or YouTube was extracted (bio and/or link-in-bio). Contact PPE still bills only when email or Instagram is found.",
            "default": false
          },
          "bioKeywords": {
            "title": "Bio / name keywords (OR)",
            "type": "array",
            "description": "Keep creators whose bio, nickname, or username contains ANY keyword (case-insensitive substring). Empty = no filter. Rival: afanasenko keywords @ bio_or_name.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minEngagementRatio": {
            "title": "Min engagement ratio (%)",
            "minimum": 0,
            "type": "number",
            "description": "Skip creators below this follower-based engagement %: ((likes+comments+shares)/followers)*100 on the kept video. 0 = disabled. Typical 1–5 for mid-tier. Rival: afanasenko minEngagementRatio.",
            "default": 0
          },
          "lastPostDays": {
            "title": "Last post within N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only creators whose kept video was posted within the last N days (createTime). 0 = disabled. Examples: 7 very active, 30 typical. Rival: afanasenko lastPostDays.",
            "default": 0
          },
          "extractShopAnchors": {
            "title": "Extract TikTok Shop Links",
            "type": "boolean",
            "description": "Optional. Extract attached TikTok Shop product links when present. Off by default — this Actor's primary product is creator emails & influencer leads, not Shop catalogs.",
            "default": true
          },
          "calculateAnalytics": {
            "title": "Calculate AI-Ready Metrics",
            "type": "boolean",
            "description": "Automatically calculate Engagement Rate and Virality Score for every video so you don't have to use Excel.",
            "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}