{
  "openapi": "3.0.1",
  "info": {
    "title": "Tiktok Trending Hashtags Analytics Scraper - Videos Per Tag",
    "description": "Scrape real time TikTok trending hashtags with analytics, including views, posts, growth, related tags, and engagement insights. Ideal for tracking viral topics, researching niches, analyzing trends, and supporting content strategies for marketers, creators, and brands.",
    "version": "0.1",
    "x-build-id": "C2XZMKkEWaeqAnIX3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapier~tiktok-trending-hashtags-analytics-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapier-tiktok-trending-hashtags-analytics-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/scrapier~tiktok-trending-hashtags-analytics-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapier-tiktok-trending-hashtags-analytics-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/scrapier~tiktok-trending-hashtags-analytics-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapier-tiktok-trending-hashtags-analytics-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": {
          "result_type": {
            "title": "🎛️ Result type",
            "enum": [
              "top100",
              "top100_with_analytics",
              "analytics"
            ],
            "type": "string",
            "description": "⚡ top100 = board ranking only (analytics stays an empty object). 🎯 top100_with_analytics = ranking + the trend curve, industry ids and the 3 named creators. 🧪 analytics = restrict to the names you put in 'Custom hashtag list'.",
            "default": "top100_with_analytics"
          },
          "country": {
            "title": "🌍 Country / region",
            "enum": [
              "ALL",
              "AL",
              "AR",
              "AT",
              "AU",
              "BD",
              "BE",
              "BG",
              "BH",
              "BR",
              "BY",
              "CA",
              "CH",
              "CL",
              "CN",
              "CO",
              "CZ",
              "DE",
              "DK",
              "EE",
              "EG",
              "ES",
              "FI",
              "FR",
              "GB",
              "GR",
              "HK",
              "HR",
              "HU",
              "ID",
              "IE",
              "IL",
              "IN",
              "IQ",
              "IS",
              "IT",
              "JO",
              "JP",
              "KH",
              "KR",
              "KW",
              "KZ",
              "LB",
              "LT",
              "LU",
              "LV",
              "MA",
              "MN",
              "MO",
              "MX",
              "MY",
              "NG",
              "NL",
              "NO",
              "NZ",
              "OM",
              "PE",
              "PH",
              "PK",
              "PL",
              "PT",
              "QA",
              "RO",
              "SA",
              "SE",
              "SG",
              "SK",
              "TH",
              "TR",
              "TW",
              "UA",
              "AE",
              "US",
              "UZ",
              "VN",
              "ZA"
            ],
            "type": "string",
            "description": "🎪 The country board to read. ✅ 27 codes are really served by TikTok (US FR DE IT ES GB AR AU BR CA CO EG ID IL JP KR MY MX PH SA SG ZA TW TH TR AE VN). Every other value — including ALL — silently returns the US board upstream; this actor accepts them and tells you with countrySupported / countryFallbackApplied.",
            "default": "US"
          },
          "top100_period": {
            "title": "📅 Ranking window (days)",
            "enum": [
              "7",
              "30",
              "90",
              "120"
            ],
            "type": "string",
            "description": "🕒 The board window. ✅ 7, 30 and 90 are real and return different hashtags. ⚠️ 120 is kept for backwards compatibility but TikTok silently serves the 7-day board for it — the run flags that as periodAliasApplied.",
            "default": "7"
          },
          "analytics_period": {
            "title": "📊 Analytics period (legacy, no effect)",
            "enum": [
              "7",
              "30",
              "120",
              "365",
              "1095"
            ],
            "type": "string",
            "description": "🧯 Kept so old run configurations keep working. TikTok's public board has no second analytics window: the trend curve length follows the ranking window above, and 365 / 1095 do not exist upstream. Every row reports analyticsPeriodSupported=false.",
            "default": "30"
          },
          "top100_industry": {
            "title": "🏷️ Industry filter",
            "enum": [
              "",
              "Apparel & Accessories",
              "Baby, Kids & Maternity",
              "Beauty & Personal Care",
              "Business Services",
              "Education",
              "Financial Services",
              "Food & Beverage",
              "Games",
              "Healthcare",
              "Home Improvement",
              "Household Products",
              "Life Services",
              "News & Entertainment",
              "Pets",
              "Real Estate",
              "Software & Apps",
              "Sports & Outdoor",
              "Tech & Electronics",
              "Travel",
              "Vehicle & Transportation"
            ],
            "type": "string",
            "description": "🧩 Applied CLIENT-SIDE on each hashtag's industry ids — TikTok exposes no server-side industry filter (19 parameter spellings had zero effect). Only 10 buckets ever appear on the public board: News & Entertainment, Sports & Outdoor, Games, Apparel & Accessories, Beauty & Personal Care, Travel, Food & Beverage, Education, Pets, Financial Services. Any other value is accepted, applies no filter, and sets industryFilterUnsupported=true.",
            "default": ""
          },
          "top100_new_on_board": {
            "title": "✨ New to the board only (legacy, no effect)",
            "type": "boolean",
            "description": "🧯 Kept for backwards compatibility. TikTok ignores this server-side — four parameter spellings returned byte-identical rows — and publishes no 'new on board' marker, so no row is filtered by it. Rows report newOnBoardSupported=false.",
            "default": false
          },
          "hashtag_list": {
            "title": "📝 Custom hashtag list",
            "type": "array",
            "description": "🎯 Hashtag names without '#'. Used when Result type = 🧪 analytics: names on today's board keep their board metrics; names that are not on the board are still swept for videos through the tag page, with board metrics left null.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "total_hashtags": {
            "title": "🔢 Max hashtags",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "🎚️ Upper bound on hashtag rows. TikTok's board hard-caps at 3 hashtags per region + window (totalCount:3 on 185/185 measured slices), so anything above 3 simply returns everything available.",
            "default": 10
          },
          "include_all_tag_videos": {
            "title": "🎞️ Fetch videos for each hashtag",
            "type": "boolean",
            "description": "▶️ ON = every hashtag row is followed by one row per video found for that tag. OFF = hashtag rows only (base behaviour).",
            "default": true
          },
          "max_videos_per_hashtag": {
            "title": "🔢 Max videos per hashtag",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "🎚️ Cap on video rows per hashtag. Measured supply: 6–10 from the tag page and 12–72 in total with creator expansion (3 tags, 2026-07-23). There is no cursor on any reachable route, so a higher number cannot create more videos.",
            "default": 25
          },
          "expand_via_creators": {
            "title": "🧑‍🤝‍🧑 Creator-expansion pass",
            "type": "boolean",
            "description": "🔍 Opens the profile of every video author plus the 3 creators TikTok names on the board, and keeps their recent clips whose caption carries this exact hashtag. Adds ~10–13 requests per hashtag. Each extra clip is tagged foundVia = creator_expansion.",
            "default": true
          },
          "fetch_video_details": {
            "title": "📊 Fetch per-video engagement",
            "type": "boolean",
            "description": "💥 One extra request per video for likes, comments, shares, post date, duration, sound, location and co-occurring hashtags. OFF = only the play count and caption that the listing already carries. Required by the 'Posted after' filter.",
            "default": true
          },
          "video_concurrency": {
            "title": "⚡ Concurrent video requests",
            "minimum": 1,
            "maximum": 16,
            "type": "integer",
            "description": "🚀 Parallel requests for creator profiles and video details. 8 was measured stable with no proxy and no blocks.",
            "default": 8
          },
          "posted_after": {
            "title": "📅 Posted after (post-fetch)",
            "type": "string",
            "description": "🗓️ Keep only videos posted on or after this date (YYYY-MM-DD or full ISO-8601). Needs per-video engagement, which is switched on automatically. Clips whose timestamp cannot be resolved are dropped and counted in the log.",
            "default": ""
          },
          "min_plays": {
            "title": "🔥 Minimum plays (post-fetch)",
            "minimum": 0,
            "type": "integer",
            "description": "📈 Keep only videos with at least this many plays. Applied on the play count from the listing, before the detail request, so it also saves requests. 0 = off.",
            "default": 0
          },
          "proxyConfiguration": {
            "title": "🛡️ Proxy configuration",
            "type": "object",
            "description": "🎛️ Apify Proxy or your own URLs. Used as a fallback for the trending-board request when a direct connection is refused.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}