There is no public Creator Search Insights API. TikTok ships the tool in the app and at tiktok.com/csi, and has never documented an endpoint for it. The Research API does not return search topics, the Business API does not either, and there is no scope, partner tier or application that unlocks one.
What does exist is a way to call the same topic records from code: an MCP endpoint with a bearer key, one tool call per question. Below is the runnable Python, the JSON it returns, a field reference for every value in a topic record, and the follow-up calls that expand one topic into a cluster.
Why there is no Creator Search Insights API
Creator Search Insights is a creator-facing product, not a developer one. TikTok's developer portal is organised around four surfaces, and none of them touches search demand.
| Official API | What it returns | Search topics? |
|---|---|---|
| Research API | Videos, comments, user info, playlists, reposts, for approved academic and research accounts | No |
| Display API | A logged-in user's own public videos and profile | No |
| Content Posting API | Publishing and draft upload | No |
| Business API | Ad accounts, campaigns, reporting, Creative Center keyword and trend data for advertisers | No, and its keyword insights are ad-side, not organic search popularity |
The Research API comes closest and still cannot answer the question. Its video query specification filters by keyword, hashtag, region and date, and returns videos. It has no concept of a search topic, a 7-day search count or a content gap. You can count how many videos mention sourdough. You cannot learn that 4.7 million people searched for it last week.
The broader map of every TikTok API and what each one is good for is in the TikTok API guide.
The endpoint that does return topics
TokConnect exposes the Creator Search Insights topic records, plus ordinary TikTok search, over the Model Context Protocol. It is one HTTP endpoint speaking Streamable HTTP and JSON-RPC.
| Setting | Value |
|---|---|
| Endpoint | https://mcp.tokconnect.com/mcp |
| Auth | Authorization: Bearer YOUR_TOKCONNECT_KEY |
| Transport | Streamable HTTP (POST, with SSE responses) |
| Discovery | tools/list after initialize |
MCP is not REST. There is no /search_topics URL to curl. You open a session, initialize, then call named tools with tools/call. Any MCP client library handles that sequence for you, which is the point of using one. If you want the same thing in a chat window rather than a script, the connect pages cover Claude, Codex, Cursor and Gemini CLI, and the TikTok MCP guide explains the protocol.
A Python example that runs
This uses the official mcp package. Install it with pip install mcp, put your key in TOKCONNECT_KEY, and run it.
import asyncio
import json
import os
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client
URL = "https://mcp.tokconnect.com/mcp"
HEADERS = {"Authorization": f"Bearer {os.environ['TOKCONNECT_KEY']}"}
async def main():
async with streamablehttp_client(URL, headers=HEADERS) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
print([t.name for t in tools.tools])
result = await session.call_tool(
"search_topics",
{"keyword": "sourdough starter", "limit": 5, "language": "en"},
)
data = json.loads(result.content[0].text)
for topic in data["topics"]:
print(
f"{topic['searchVolume']:>10,} "
f"{topic['videoCount']:>6} "
f"{topic['queryText']}"
)
print("next offset:", data["nextOffset"])
asyncio.run(main())
The example above uses the Python SDK's 1.x line. In mcp 2.0 and later, which is what pip install mcp gives you today, the helper is streamable_http_client, the headers move onto an httpx2.AsyncClient passed as http_client, and the context manager yields two streams:
import httpx2
from mcp.client.streamable_http import streamable_http_client
async with streamable_http_client(URL, http_client=httpx2.AsyncClient(headers={"Authorization": f"Bearer {KEY}"})) as (read, write):
async with ClientSession(read, write) as session:
...Both forms return the same 26 tools. We ran both against the server on 19 September 2026.
Two things to note. Tool results arrive as text content, so you parse result.content[0].text as JSON rather than reading a typed object. And list_tools() is worth calling once in development: the tool set grows, and the schemas it returns are the authoritative argument list.
Running it on 19 September 2026 printed this:
2,923,707 0 dry sourdough starter and dough
3,721,671 0 sourdough starter making and uses
4,418,725 0 sourdough eating and starter care
4,685,193 0 sourdough baking and starter care
3,205,561 546 sourdough starter making and feeding
next offset: 5
Data: TikTok Creator Search Insights via TokConnect, pulled 19 September 2026. Open the snapshot.
The JSON search_topics returns
Here is one full record from that call plus the envelope around it, trimmed to a single topic:
{
"topics": [
{
"queryId": "7668817079025287188",
"queryText": "sourdough baking and starter care",
"popularity": 87,
"searchVolume": 4685193,
"videoCount": 0,
"trend7d": [9597, 106468, 291212, 442767, 1091572, 1611616, 4685193],
"trendScore7d": [45, 70, 74, 78, 85, 85, 87],
"categoryL1": "Gourmet",
"categoryL2": "Food Tutorials",
"isFavorited": false,
"channel": "search",
"tab": "SEARCH"
}
],
"hasMore": true,
"nextOffset": 5,
"count": 5,
"channel": "search",
"tab": "SEARCH"
}
That record is a content gap in JSON form: 4.69 million searches in a week against zero matched videos. The content gap guide explains what TikTok counts as a match.
Field reference
| Field | Type | Meaning |
|---|---|---|
queryId | string | Topic identifier. Pass it to every follow-up tool. Store it beside the text, because the same phrase can come back with a different id on a later search. |
queryText | string | TikTok's label for the topic cluster, not one exact phrase. Capitalisation varies and is TikTok's. |
searchVolume | integer | Searches over the last 7 days, global. This is the figure the app prints as "Search popularity". See the search volume guide. |
popularity | integer 0–100 | TikTok's index of how hot the topic is against everything else. Not a percentage and not derived from searchVolume. |
videoCount | integer | Videos TikTok has matched to the topic. Zero is common and is the signal behind the content-gap badge. |
trend7d | array of 7 integers | Daily search counts behind the chart, oldest first. The last value equals searchVolume. |
trendScore7d | array of 7 integers | The same seven days as the 0–100 popularity index. |
categoryL1 … categoryL4 | string | TikTok's category path, L1 broadest. L3 and L4 are present only on topics filed that deeply. |
isFavorited | boolean | Whether the topic is saved on the underlying account. |
channel, tab | string | Which feed the record came from. search/SEARCH for keyword results, other values for browse and trending feeds. |
Keep an absent field absent when you store these. A videoCount of zero and a videoCount that never arrived are different states, and collapsing them ruins any content-gap filter you build on top.
Follow-up tools
Each of these takes the queryId from a topic record and costs one credit.
| Tool | Arguments | Returns |
|---|---|---|
topic_detail | query_id | Full record for one topic: category path, top countries, related-product signals |
search_popularity | query_id, days ("7", "30", "60", "180"), countries | The search series over a longer window, optionally split by country |
audience_demographics | query_id, days | Share of searchers by country, gender and age group |
related_topics | query_id, limit, offset | Adjacent topics with their own volumes, for building a cluster from one proven seed |
The useful pattern is one broad search_topics call, then follow-ups on the two or three topics that survive your filter. Calling audience_demographics on all ten results is nine wasted credits, because you will drop most of them on volume alone.
Pagination, credits and rate
search_topics takes limit from 1 to 20 and an offset. The response returns hasMore and nextOffset; pass that nextOffset straight back as offset for the next page. In the example above the response came back with nextOffset: 5, so the next page starts at 5. Do not compute the offset yourself from page numbers, because the server decides the step.
Billing is one credit per tool call, whatever the call returns, including a call that returns an empty list. Every account starts with 100 free credits, which is enough to build and test a real pipeline rather than one demo request.
Two practical notes. Keep the key out of source control and read it from the environment, as the example does. And if a call comes back with an upstream error, wait and retry once before failing the job: these are live TikTok reads, and a transient failure on one topic is not a reason to abandon the batch.
If you would rather ask questions than write a client, the desktop guide shows the same data through Claude or ChatGPT with no code at all.
Frequently asked questions
Is there a TikTok Creator Search Insights API?
No. TikTok documents Creator Search Insights as a creator feature, not a developer one. There is no endpoint for it in the Research API, the Display API, the Content Posting API or the Business API, and no scope you can request for search popularity data.
Can the TikTok Research API return search volume?
No. The Research API queries videos, comments, user info, playlists and reposts for approved academic and research accounts. It has no notion of a search topic, a search popularity figure or a content gap, so it cannot answer "how many people searched for this".
What does search_topics return?
A list of topic records and a pagination cursor. Each record has queryId, queryText, popularity (0 to 100), searchVolume (7-day global searches), videoCount, the trend7d and trendScore7d series, and TikTok's category path. The full shape is on this page.
How much does it cost?
One MCP tool call is one credit, and every account starts with 100 free credits. A ten-topic search plus a follow-up on the best three is four credits, so the free tier covers real evaluation rather than a single hello-world call.