Search DevTools

Jump to any tool or page

TikTok Trends API

Unexplored

TikTok hashtag volume over time, with growth for any hashtag. Free key at trendsapi.ai

trendsapi-ai1 stars0 forksDeveloper Tools
View source

Install

mcp_config.json

{
  "mcpServers": {
    "ai-trendsapi-tiktok": {
      "url": "https://tiktok.api.trendsapi.ai/mcp",
      "type": "streamable-http"
    }
  }
}

Documentation

TikTok hashtag volume API

TikTok hashtag and search interest trends via the Trends API. History, growth, and live trending hashtags.

Key: trendsapi.ai/#get-key. HTTP contract and every source: trendsapi-ai/trendsapi.

Authentication

pip install trendsapi-tiktok
export TRENDSAPI_KEY=your_key

Python 3.9+. Same key as the HTTP API.

from trendsapi_tiktok import TrendsAPI

client = TrendsAPI()                    # TRENDSAPI_KEY
# client = TrendsAPI(api_key="YOUR_KEY")

Keyword helpers default to source: "tiktok". Pass source= to hit any other platform with the same client. Official full client (every source, no preset): trendsapi.

Methods

MethodREST modeReturns
get_time_series(keyword, source=, data_mode=)get_time_serieslist[TrendsDataPoint]
get_growth(keyword, percent_growth=, source=, data_mode=)get_growthGetGrowthResponse
get_live(limit=, offset=, category=)get_top_trendsGetTopTrendsResponse
get_top_trends(type=, ...)get_top_trendsGetTopTrendsResponse

source is lowercase (tiktok). type is exact (TikTok Trending Hashtags). Mixing them is a 400.

from trendsapi_tiktok import TrendsAPI

client = TrendsAPI()                    # TRENDSAPI_KEY
# client = TrendsAPI(api_key="YOUR_KEY")

series = client.get_time_series("matcha")
print(series[-1].date, series[-1].value)

growth = client.get_growth("matcha", percent_growth=["3M", "12M"])
print(growth.results[0].growth, growth.results[0].direction)

hot = client.get_live(limit=10)
print(hot.data)                         # [[1, "..."], ...]

get_time_series

points = client.get_time_series("matcha")

Each point:

FieldAlwaysMeaning
dateyesYYYY-MM-DD
valueyes0-100 index for this series
keywordyesEcho
volumenoAbsolute volume when available
source or datatypenoPipeline label

Python returns list[TrendsDataPoint]. Use .date and .value, not ["date"]. JS returns the same fields as object properties.

get_growth

g = client.get_growth("matcha", percent_growth=["12M", "3M", "YTD"])
print(g.results[0].growth, g.results[0].direction)

percent_growth default: ["12M"]. Presets: 7D 14D 30D 1M 2M 3M 6M 9M 12M/1Y 18M 24M/2Y 36M/3Y 48M 60M/5Y MTD QTD YTD. Custom: {"name": "Launch", "recent": "2024-06-01", "baseline": "2024-01-01"}.

FieldMeaning
search_termKeyword
data_sourceSource
resultsOne object per window (period, growth, direction, dates, values)
metadataCounts / success flag

Several windows still count as one request. Python: growth.results[0].growth. JS: growth.results[0].growth.

get_live

hot = client.get_live(limit=10)
FieldMeaning
as_of_tsSnapshot time
typeFeed name
limit, offset, countPagination
data[rank, label] rows

Python: hot.data. JS: hot.data. Optional offset= and category= (Amazon Best Sellers by Category, Top Websites only).

Async

import asyncio
from trendsapi_tiktok import AsyncTrendsAPI

async def main():
    c = AsyncTrendsAPI()
    return await asyncio.gather(
        c.get_time_series("matcha"),
        c.get_time_series("matcha", source="google search"),
    )

asyncio.run(main())

Each 200 is one billed request.

Pandas

from dataclasses import asdict
import pandas as pd
from trendsapi_tiktok import TrendsAPI

df = pd.DataFrame(asdict(p) for p in TrendsAPI().get_time_series("matcha"))
df["date"] = pd.to_datetime(df["date"])
print(df.set_index("date")["value"].resample("ME").mean().tail())

JavaScript / TypeScript

npm install trendsapi-tiktok

Node 18+, Deno, Bun, Workers. Same API key. Field tables above apply.

Methods

MethodREST modeReturns
getTimeSeries(keyword, { source, data_mode })get_time_seriesweekly points
getGrowth(keyword, { percent_growth, source, data_mode })get_growthgrowth object
getLive({ limit, offset, category })get_top_trendslive feed
getTopTrends({ type, ... })get_top_trendslive feed
import { TrendsAPI } from "trendsapi-tiktok";

const client = new TrendsAPI({ apiKey: process.env.TRENDSAPI_KEY! });
const series = await client.getTimeSeries("matcha");
console.log(series.at(-1)?.date, series.at(-1)?.value);

const growth = await client.getGrowth("matcha", {
  percent_growth: ["3M", "12M"],
});
console.log(growth.results[0].growth, growth.results[0].direction);

const live = await client.getLive({ limit: 10 });
console.log(live.data);                 // [[1, "..."], ...]

Call (curl)

FieldValue
EndpointPOST https://api.trendsapi.ai/api
AuthAuthorization: Bearer $TRENDSAPI_KEY
Historysource: tiktok with get_time_series or get_growth
KeywordHashtag or topic, e.g. matcha (# optional)
Live typeTikTok Trending Hashtags, TikTok Trending Searches, TikTok Shop Hot Products
curl -sS -X POST https://api.trendsapi.ai/api \
  -H "Authorization: Bearer $TRENDSAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{"mode":"get_time_series","source":"tiktok","keyword":"matcha"}'

Source notes

  • value is 0-100 for this hashtag, not view count.
  • tiktok trending hashtags (wrong case) is 400.
  • Publishing videos still requires TikTok's own APIs. This endpoint is demand only.

Errors

HTTPClient
200Parsed payload. Python dataclasses / JS typed objects
400Raises. Fix source or type spelling
401Raises. Check TRENDSAPI_KEY
404Raises. No series for that keyword. Do not retry
429Raises. Quota
5xxClient retries, then raises

The HTTP body field is a JSON string. SDKs decode it. Raw curl must parse body a second time.

Site: https://trendsapi.ai/trends/tiktok-trends.

License

MIT. See LICENSE.

Sourced from the repository README.

More in Developer Tools