{
  "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": "mYWnufTQ3dandoZ6r"
  },
  "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. This field is only used by the three region-based modes (🔥 Trending Feed, 📈 Popular Hashtags, 🌟 Popular Creators) - every other mode ignores it, so you can leave it on United States if you are not using those 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 by the data provider before results come back (so this does not increase your bill - it reduces it when set). 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. Ignored by every mode except 🔎 Search by Keyword and 🏆 Top Search.",
            "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 that keep a '0' run from producing a runaway bill. This is the main lever to control your cost: lower it to spend less, leave it at 0 for the maximum amount of data.",
            "default": 0
          },
          "enableTrendIntelligence": {
            "title": "📊 Trend intelligence   (opt-in enrichment, $5 per 1,000 rows)",
            "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, $5 per 1,000 rows)",
            "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 and nothing is charged.",
            "default": false
          },
          "enableAiBrief": {
            "title": "📝 AI brand brief   (opt-in, uses YOUR LLM API key, $15 per 1,000 rows)",
            "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 and nothing is charged.",
            "default": false
          },
          "enableRegionSummary": {
            "title": "🗺️ Region summary report   (opt-in, $0.05 per report)",
            "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\nYou pay YOUR LLM provider directly for the tokens consumed (typical cost: ~$0.50 per 1,000 industry classifications or ~$1 per 1,000 AI briefs with Claude Haiku 4.5). See Terms of Service section 17 for full details.\n\nLeave empty to disable Industry Classification and AI Brief entirely (no charge, 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. 'Cheap default' uses Claude Haiku 4.5 or GPT-5 nano - fast and inexpensive, more than enough quality for classification and short briefs. 'Premium' uses Claude Sonnet 5.5 or GPT-5 - more expensive on YOUR LLM bill, 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}