{
  "openapi": "3.0.1",
  "info": {
    "title": "TikTok Scraper - Trends, Creators, Hashtags [NO COOKIES] ✅",
    "description": "Trending TikTok videos, hashtags, creators, and songs - all in one Actor across 8 search modes. Flat $3.50 per 1,000 results. No cookies, no login, no run-start fee. Direct TikTok Creator Marketplace link included on every creator row.",
    "version": "0.0",
    "x-build-id": "buYh1shunHfRSOCzj"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/unseenuser~TikTok-Search-Scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-unseenuser-TikTok-Search-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/unseenuser~TikTok-Search-Scraper/runs": {
      "post": {
        "operationId": "runs-sync-unseenuser-TikTok-Search-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/unseenuser~TikTok-Search-Scraper/run-sync": {
      "post": {
        "operationId": "run-sync-unseenuser-TikTok-Search-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "STEP 1 - Pick what you want to do",
            "enum": [
              "trending_feed",
              "popular_hashtags",
              "popular_creators",
              "search_keyword",
              "search_hashtag",
              "search_users",
              "top_search",
              "song_intel"
            ],
            "type": "string",
            "description": "Pick one mode from the list. Each label ends with the Step 2 field you need to fill - the emoji at the end of the label matches the emoji on that Step 2 field. For example, 🔥 Trending Feed ends with 'fill: 🌍 Region', so after picking it you go to Step 2 and set 🌍 Region (and leave the other three Step 2 fields empty). The default mode (🔥 Trending Feed in United States) gives you a working one-click demo without touching anything else.",
            "default": "trending_feed"
          },
          "queries": {
            "title": "💬 Search terms   (only for: 🔎 Search by Keyword, 👤 Search Users, 🏆 Top Search)",
            "uniqueItems": true,
            "type": "array",
            "description": "Type any free-text search terms, one per row. Each row runs as its own separate search - so if you type 'mexican food' on one row and 'ramen recipe' on another, you get two independent sets of results side by side in your output. Good examples: 'mexican food', 'fitness coach', 'skincare 2026'. Leave this empty unless your mode is 🔎 Search by Keyword, 👤 Search Users, or 🏆 Top Search.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "hashtags": {
            "title": "#️⃣ Hashtags   (only for: #️⃣ Search by Hashtag)",
            "uniqueItems": true,
            "type": "array",
            "description": "Type one hashtag per row - with or without the leading # (both forms work). Each hashtag runs as its own separate pull of every video posted under it. For example, 'foryou' and '#skincare2026' both work. Leave this empty unless your mode is #️⃣ Search by Hashtag.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "songUrls": {
            "title": "🎵 Song URLs   (only for: 🎵 Song Intel)",
            "uniqueItems": true,
            "type": "array",
            "description": "Paste one TikTok song page URL per row. To find a song URL: open any TikTok video that uses the song, tap on the song's name at the bottom of the video, and copy the link that opens. The URL looks like 'https://www.tiktok.com/music/Original-Sound-7234567890123456789'. For each URL you paste, the Actor returns the song's details plus every video that currently uses it. Leave this empty unless your mode is 🎵 Song Intel.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "region": {
            "title": "🌍 Region   (only for: 🔥 Trending Feed, 📈 Popular Hashtags, 🌟 Popular Creators)",
            "enum": [
              "US",
              "GB",
              "CA",
              "AU",
              "IL",
              "JP",
              "KR",
              "BR",
              "IN",
              "DE",
              "FR",
              "ES",
              "IT",
              "MX",
              "ID",
              "PH",
              "VN",
              "TH",
              "TR",
              "AE",
              "SA",
              "EG",
              "ZA",
              "NG",
              "AR",
              "CL",
              "CO",
              "PE",
              "PL",
              "NL",
              "SE",
              "NO",
              "FI",
              "DK",
              "BE",
              "PT",
              "GR",
              "CZ",
              "RO",
              "MY",
              "SG",
              "PK",
              "BD",
              "HK",
              "TW",
              "RU",
              "AT",
              "CH",
              "IE",
              "NZ",
              "HU",
              "UA",
              "MA",
              "KE",
              "QA",
              "KW",
              "LB",
              "DO",
              "VE",
              "EC",
              "CR",
              "PR",
              "BG",
              "SK",
              "HR",
              "SI",
              "LT",
              "LV",
              "EE"
            ],
            "type": "string",
            "description": "Pick the country whose trends you want to pull. For example, pick 🇺🇸 United States to see what is viral in the US today, or 🇯🇵 Japan to see Japan's trending feed.\n\nThis field only geo-scopes the three region-based modes (🔥 Trending Feed, 📈 Popular Hashtags, 🌟 Popular Creators). In every other mode (🔎 Search by Keyword, #️⃣ Search by Hashtag, 👤 Search Users, 🏆 Top Search, 🎵 Song Intel), TikTok's search endpoints do not accept a country filter, so results come back global - the value you pick here is only stamped onto each output row as a label and does not change which videos are returned. Leave it on United States when you are using any of those five modes.",
            "default": "US"
          },
          "videoPostedWithin": {
            "title": "📅 Video posted within   (only for: 🔎 Search by Keyword, 🏆 Top Search)",
            "enum": [
              "",
              "yesterday",
              "this-week",
              "this-month",
              "last-3-months",
              "last-6-months",
              "all-time"
            ],
            "type": "string",
            "description": "Only return videos posted within a specific time window, applied before results come back. Leave empty to get videos from any time period.\n\nExample: pick 'Last 7 days (this week)' to focus on recent content, or 'Last 24 hours (yesterday)' for fresh viral spikes.\n\nOnly 🔎 Search by Keyword and 🏆 Top Search honor this field - every other mode (🔥 Trending Feed, 📈 Popular Hashtags, 🌟 Popular Creators, #️⃣ Search by Hashtag, 👤 Search Users, 🎵 Song Intel) ignores it entirely, because TikTok's endpoints for those modes do not accept a time filter. Leave this empty when you are using any of those six modes.",
            "default": ""
          },
          "maxResults": {
            "title": "📦 Max results per query / hashtag / song   (0 = fetch everything available)",
            "minimum": 0,
            "type": "integer",
            "description": "Caps how many rows the Actor returns per input. 'Per input' means per query, per hashtag, or per song URL you provided in Step 2 - so if your mode is 🔎 Search by Keyword and you entered three queries, setting this to 50 gives you up to 50 videos for each query (up to 150 rows in total). Set this to 0 to keep pulling until there is no more data to fetch for each input - typically around 1000-2000 rows per input depending on the mode, with internal safety caps on the '0' setting.",
            "default": 0
          },
          "enableTrendIntelligence": {
            "title": "📊 Trend intelligence   (opt-in enrichment)",
            "type": "boolean",
            "description": "Add rank velocity (points per day), saturation score (0-100), early-trend flag, related hashtags, and cross-region rank comparison to every hashtag, song, and creator row. Requires at least 2 prior runs of the same mode+region to produce velocity data.\n\nFires only on hashtag, song, and creator rows from popular_* and trending_* modes. Skipped on search_* modes.",
            "default": false
          },
          "enableIndustryClassification": {
            "title": "🏭 Industry classification   (opt-in, uses YOUR LLM API key)",
            "type": "boolean",
            "description": "Classify each hashtag or song into one of 20 TikTok Creative Center industry categories (Food, Beauty, Gaming, Fitness, etc.) using an LLM call via YOUR API key.\n\nRequires 🔑 AI Enrichment API Key to be set below. If no key is provided, this event is silently skipped.",
            "default": false
          },
          "enableAiBrief": {
            "title": "📝 AI brand brief   (opt-in, uses YOUR LLM API key)",
            "type": "boolean",
            "description": "Generate a 2-3 sentence actionable brief per hashtag or song: what the trend is, which brand categories fit it, one example campaign angle. Uses an LLM call via YOUR API key.\n\nRequires 🔑 AI Enrichment API Key to be set below. If no key is provided, this event is silently skipped.",
            "default": false
          },
          "enableRegionSummary": {
            "title": "🗺️ Region summary report   (opt-in)",
            "type": "boolean",
            "description": "Add one aggregated row per region at the end of each region-based mode run (trending_feed, popular_hashtags, popular_creators). The row (rowType='region_summary') contains total trends scanned, top hashtags/sounds/creators, dominant industries (if classification is also on), and average rank velocity (if trend intelligence is also on).",
            "default": false
          },
          "aiEnrichmentApiKey": {
            "title": "🔑 AI Enrichment API Key   (required only for Industry Classification and AI Brief)",
            "type": "string",
            "description": "Your own Anthropic or OpenAI API key. Used only during this run, passed in-memory to the LLM provider's SDK, and discarded when the run ends. The Publisher never stores, logs, or substantively processes this key.\n\nToken usage goes through YOUR LLM provider account directly, not the Publisher's. See Terms of Service section 17 for full details.\n\nLeave empty to disable Industry Classification and AI Brief entirely (no event fires)."
          },
          "aiEnrichmentProvider": {
            "title": "🤖 AI Enrichment provider   (only used if an API key is set)",
            "enum": [
              "anthropic",
              "openai"
            ],
            "type": "string",
            "description": "Which LLM provider's API your key belongs to. Default is Anthropic.",
            "default": "anthropic"
          },
          "aiEnrichmentModel": {
            "title": "⚡ AI Enrichment model   (only used if an API key is set)",
            "enum": [
              "cheap-default",
              "premium"
            ],
            "type": "string",
            "description": "Which specific model to call. 'Fast default' uses Claude Haiku 4.5 or GPT-5 nano - quick, more than enough quality for classification and short briefs. 'Premium' uses Claude Sonnet 5.5 or GPT-5 - slightly better narrative quality on AI briefs.",
            "default": "cheap-default"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}