Videos
One video or photo post: counts, comments, transcript, similar videos and the sales it drove. Plus samples of TikTok's own feeds and a fair comment giveaway draw.
One TikTok video
Everything about one video or photo post: detail, comments, replies, caption transcript, similar videos, and Shop Analytics; region picks the market the revenue it drove and the products it sold. Use the post id or link from any other tool. Examples: {"id":"https://vt.tiktok.com/...","method":"transcript"}, {"id":"7694...","method":"sales"}. method=comment_themes lists the keywords TikTok extracts from the comments, each with sample comments. Example: {"id":"7691388445251439924","method":"comment_themes"}.
/v1/videos/{id}Counts, creator, hashtags, sound, place, linked products, caption tracks
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions.
2 more optional parameters
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - regionstring
Market as an ISO country code, default US. Shop Analytics methods: sales data for that market, amounts in its currency. Live methods that take it (search, video detail, creator posts, Shop pages): TikTok as seen in that market where TikTok serves it. Core: US, GB, DE, FR, ES, JP, TH, VN, ID, MY, PH, BR, MX. Extended: PL, IT, NL, IE. Other countries are refused. See
shop_regions.
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: detail. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "detail",
"id": "7691522530129022221"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7691522530129022221" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7691522530129022221",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7691522530129022221", {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"caption": "the shiniest lips on the internet @NOONI #noonipartner #beauty #glitterlips #lipoil #kbeauty",
"comments": 20,
"creator": {
"handle": "ingaterner",
"id": "6915470077362865158",
"nickname": "Inga Terner",
"secUid": "MS4wLjABAAAAj3-0_ug3CN2zVQW1fOIuVgtFq37iFz2-aQNDN9VLKT0Xa1rcEfAAybaLMhLsXCIu"
},
"durationSec": 18,
"hashtags": [
{
"id": "7305074851570516011",
"name": "noonipartner"
},
{
"id": "5393",
"name": "beauty"
},
{
"id": "206503",
"name": "glitterlips"
}
],
"id": "7691522530129022221",
"language": "en",
"likes": 1049,
"posted": "2026-10-01T02:36:03Z",
"saves": 207,
"shares": 39,
"sound": {
"author": "JERI",
"id": "7139362230881094442",
"original": true,
"title": "ariana grande . ill do it"
},
"url": "https://www.tiktok.com/@ingaterner/video/7691522530129022221",
"views": 22632
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.captionstringdata.commentsintegerdata.creatorobjectdata.creator.handlestringdata.creator.idstringdata.creator.nicknamestringdata.creator.secUidstringdata.durationSecintegerdata.hashtagsarraydata.hashtags[].idstringdata.hashtags[].namestringdata.idstringdata.languagestringdata.likesintegerdata.postedstringdata.savesintegerdata.sharesintegerdata.soundobjectdata.sound.authorstringdata.sound.idstringdata.sound.originalbooleandata.sound.titlestringdata.urlstringdata.viewsintegermetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/captionsOne caption file as WebVTT (subtitle_url, or the video id: English track first)
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions.
2 more optional parameters
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - subtitle_urlstring
method=captions: a caption URL frommethod=detail(captions[].url).
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: captions. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "captions",
"id": "7691388445251439924"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7691388445251439924/captions" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7691388445251439924/captions",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7691388445251439924/captions", {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
Every success comes back in the same envelope: the tool's JSON under data, next_cursor when there is another page, and meta with the credits charged. See pagination.
{
"data": { "...": "the tool's JSON" },
"next_cursor": "eyJwYWdlIjoyfQ",
"meta": { "credits_charged": 1, "request_id": "req_…" }
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.metaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/comment-themesKeywords TikTok extracts from the comments, with sample comments
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions.
1 more optional parameter
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: comment_themes. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "comment_themes",
"id": "7691522530129022221"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7691522530129022221/comment-themes" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7691522530129022221/comment-themes",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7691522530129022221/comment-themes", {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"as_of": "2026-10-30T23:27:21Z",
"count": 2,
"has_more": false,
"id": "7691522530129022221",
"items": [
{
"keyword": "looks amazing",
"sample_count": 1,
"samples": [
{
"date": "2026-10-02",
"id": "7692112068871275295",
"likes": 1,
"text": "Wow looks amazing"
}
]
},
{
"keyword": "blonde hair",
"sample_count": 1,
"samples": [
{
"date": "2026-10-01",
"id": "7691593645211861782",
"likes": 1,
"text": "Hello There Inga i like very much how are You make-up and how lip-gloss you used in your make-up and she's stay very good and beautiful with your blonde hair Inga"
}
]
}
],
"notes": [
"Keywords are TikTok's own extraction from the comments, in TikTok's order; sample_count is how many sample comments TikTok attached, not a total."
],
"see_also": [
"video method=comments id=7691522530129022221"
],
"source": "tiktok_live"
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.as_ofstringdata.countintegerdata.has_morebooleandata.idstringdata.itemsarraydata.items[].keywordstringdata.items[].sample_countintegerdata.items[].samplesarraydata.items[].samples[].datestringdata.items[].samples[].idstringdata.items[].samples[].likesintegerdata.items[].samples[].textstringdata.notesarraydata.see_alsoarraydata.sourcestringmetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/commentsTop-level comments
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions. - limitinteger
Results per page. comments and replies max 50, similar max 30; Shop Analytics methods max 100. Values above a method's maximum are lowered and reported in notes.
3 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - sortstring
method=comments: relevant (TikTok's order, default) or newest.One of
relevantnewest
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: comments. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "comments",
"id": "7691522530129022221",
"limit": "3"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7691522530129022221/comments?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7691522530129022221/comments",
params={
"limit": "3",
},
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const params = new URLSearchParams({
limit: "3",
});
const res = await fetch(`https://api.tokconnect.com/v1/videos/7691522530129022221/comments?${params}`, {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"comments": [
{
"author": {
"handle": "analuaviibe",
"nickname": "analuaviibe",
"secUid": "MS4wLjABAAAAgRqViSgAlnNZEzweJCo2ZHj8OIbUh6d7yCY1Vgw_UgHF0NZ8dTLMQMTQFs9gcxHD"
},
"id": "7693243163997602574",
"likes": 0,
"posted": "2026-10-05T17:53:31Z",
"replies": 1,
"text": "Did you use another product before the lip oil?"
},
{
"author": {
"handle": "tarapr1",
"nickname": "TaraPrit",
"secUid": "MS4wLjABAAAA5hvN8SlYQnPwFtES0p2gdlguyyFfsgq47T4roayZCqRQ6U-QuP4CUHtwRkMjCLqE"
},
"id": "7698536869424726785",
"likes": 0,
"posted": "2026-10-20T00:15:26Z",
"text": "All of those colours r so pretty!!!"
},
{
"author": {
"handle": "kc90887",
"nickname": "KC",
"secUid": "MS4wLjABAAAADAQWZ7VS3fs6sc1XqTuGaIl2F2ZuuEa5EKnnz73HyexjS69Ydy7VjObJJDbmEDiG"
},
"id": "7701658459657306912",
"likes": 0,
"posted": "2026-10-28T10:08:41Z",
"text": "Hammer geile Frau 😍🤗"
}
],
"hasMore": true,
"next": "eyJjdXJzb3IiOjN9",
"total": 20
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
},
"next_cursor": "eyJjdXJzb3IiOjN9"
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.commentsarraydata.comments[].authorobjectdata.comments[].author.handlestringdata.comments[].author.nicknamestringdata.comments[].author.secUidstringdata.comments[].idstringdata.comments[].likesintegerdata.comments[].postedstringdata.comments[].repliesintegerdata.comments[].textstringdata.hasMorebooleandata.nextstringdata.totalintegermetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/product-trendDaily sales of the video's products
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions.
7 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - endstring
Shop Analytics methods: custom range end, YYYY-MM-DD (capped at the last complete day).
- limitinteger
Results per page. comments and replies max 50, similar max 30; Shop Analytics methods max 100. Values above a method's maximum are lowered and reported in notes.
- regionstring
Market as an ISO country code, default US. Shop Analytics methods: sales data for that market, amounts in its currency. Live methods that take it (search, video detail, creator posts, Shop pages): TikTok as seen in that market where TikTok serves it. Core: US, GB, DE, FR, ES, JP, TH, VN, ID, MY, PH, BR, MX. Extended: PL, IT, NL, IE. Other countries are refused. See
shop_regions. - startstring
Shop Analytics methods: custom range start, YYYY-MM-DD.
- windowstring
Shop Analytics methods: date range ending at the last complete day (about 2 days ago). Default 30d. Use start/end for a custom range.
One of
7d30d90d180d365d
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: product_trend. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "product_trend",
"id": "7700682843906723103"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7700682843906723103/product-trend" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7700682843906723103/product-trend",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7700682843906723103/product-trend", {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"currency": "USD",
"daily": [
{
"ad": 0,
"adTotalCost": 0,
"adTotalRoas": 0,
"ad_revenue_ratio": 0,
"ad_view_ratio": 0,
"new_followers": 0,
"partition_day": "2026-09-29",
"revenue": 0,
"sale": 0,
"views": 0
},
{
"ad": 0,
"adTotalCost": 0,
"adTotalRoas": 0,
"ad_revenue_ratio": 0,
"ad_view_ratio": 0,
"new_followers": 0,
"partition_day": "2026-09-30",
"revenue": 0,
"sale": 0,
"views": 0
},
{
"ad": 0,
"adTotalCost": 0,
"adTotalRoas": 0,
"ad_revenue_ratio": 0,
"ad_view_ratio": 0,
"new_followers": 0,
"partition_day": "2026-10-01",
"revenue": 0,
"sale": 0,
"views": 0
}
],
"dataEnd": "2026-10-28",
"id": "7700682843906723103",
"market": "US",
"notes": [
"Market US (United States): amounts are in USD."
],
"source": "TokConnect Shop Analytics (TikTok Shop US). Revenue and units are estimates: units track TikTok's sold counter; revenue is units times listed price.",
"window": {
"days": 30,
"end": "2026-10-28",
"start": "2026-09-29"
}
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.currencystringdata.dailyarraydata.daily[].adintegerdata.daily[].adTotalCostintegerdata.daily[].adTotalRoasintegerdata.daily[].ad_revenue_ratiointegerdata.daily[].ad_view_ratiointegerdata.daily[].new_followersintegerdata.daily[].partition_daystringdata.daily[].revenueintegerdata.daily[].saleintegerdata.daily[].viewsintegerdata.dataEndstringdata.idstringdata.marketstringdata.notesarraydata.sourcestringdata.windowobjectdata.window.daysintegerdata.window.endstringdata.window.startstringmetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/productsProducts sold through the video, with revenue
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions.
7 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - endstring
Shop Analytics methods: custom range end, YYYY-MM-DD (capped at the last complete day).
- limitinteger
Results per page. comments and replies max 50, similar max 30; Shop Analytics methods max 100. Values above a method's maximum are lowered and reported in notes.
- regionstring
Market as an ISO country code, default US. Shop Analytics methods: sales data for that market, amounts in its currency. Live methods that take it (search, video detail, creator posts, Shop pages): TikTok as seen in that market where TikTok serves it. Core: US, GB, DE, FR, ES, JP, TH, VN, ID, MY, PH, BR, MX. Extended: PL, IT, NL, IE. Other countries are refused. See
shop_regions. - startstring
Shop Analytics methods: custom range start, YYYY-MM-DD.
- windowstring
Shop Analytics methods: date range ending at the last complete day (about 2 days ago). Default 30d. Use start/end for a custom range.
One of
7d30d90d180d365d
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: products. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "products",
"id": "7700682843906723103"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7700682843906723103/products" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7700682843906723103/products",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7700682843906723103/products", {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"currency": "USD",
"dataEnd": "2026-10-28",
"id": "7700682843906723103",
"market": "US",
"notes": [
"Market US (United States): amounts are in USD."
],
"products": [
{
"id": "1732268320365777584",
"max_price": "$493.99",
"min_price": "$493.99",
"partition_day": "2026-10-29",
"percentage": 100,
"pri_cate_id": "Household Appliances",
"product_title": "Shark PowerPro Flex Reveal Plus Cordless Vacuum - IZ382H",
"revenue": 118627,
"sale": 313,
"sec_cate_id": "Home Appliances",
"ter_cate_id": "Vacuums & Floor Care"
}
],
"source": "TokConnect Shop Analytics (TikTok Shop US). Revenue and units are estimates: units track TikTok's sold counter; revenue is units times listed price.",
"window": {
"days": 30,
"end": "2026-10-28",
"start": "2026-09-29"
}
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.currencystringdata.dataEndstringdata.idstringdata.marketstringdata.notesarraydata.productsarraydata.products[].idstringdata.products[].max_pricestringdata.products[].min_pricestringdata.products[].partition_daystringdata.products[].percentageintegerdata.products[].pri_cate_idstringdata.products[].product_titlestringdata.products[].revenueintegerdata.products[].saleintegerdata.products[].sec_cate_idstringdata.products[].ter_cate_idstringdata.sourcestringdata.windowobjectdata.window.daysintegerdata.window.endstringdata.window.startstringmetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/salesRevenue, units and ad metrics the video drove
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions.
7 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - endstring
Shop Analytics methods: custom range end, YYYY-MM-DD (capped at the last complete day).
- limitinteger
Results per page. comments and replies max 50, similar max 30; Shop Analytics methods max 100. Values above a method's maximum are lowered and reported in notes.
- regionstring
Market as an ISO country code, default US. Shop Analytics methods: sales data for that market, amounts in its currency. Live methods that take it (search, video detail, creator posts, Shop pages): TikTok as seen in that market where TikTok serves it. Core: US, GB, DE, FR, ES, JP, TH, VN, ID, MY, PH, BR, MX. Extended: PL, IT, NL, IE. Other countries are refused. See
shop_regions. - startstring
Shop Analytics methods: custom range start, YYYY-MM-DD.
- windowstring
Shop Analytics methods: date range ending at the last complete day (about 2 days ago). Default 30d. Use start/end for a custom range.
One of
7d30d90d180d365d
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: sales. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "sales",
"id": "7700682843906723103"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7700682843906723103/sales" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7700682843906723103/sales",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7700682843906723103/sales", {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"ads": {
"ad2Cost": "$25.73k",
"ad2Roas": 3.69,
"ad_revenue_ratio": "80.00%",
"ad_view_ratio": "28.88%",
"video_id": "7700682843906723103"
},
"currency": "USD",
"dataEnd": "2026-10-28",
"id": "7700682843906723103",
"market": "US",
"notes": [
"Market US (United States): amounts are in USD."
],
"source": "TokConnect Shop Analytics (TikTok Shop US). Revenue and units are estimates: units track TikTok's sold counter; revenue is units times listed price.",
"totals": {
"day_new_followers": "0",
"day_revenue": "$3.95k",
"day_sale": "10.43",
"day_views": "76.7k",
"new_followers": "0",
"revenue": "$118.63k",
"sale": "313",
"video_id": "7700682843906723103",
"views": "2.3m"
},
"window": {
"days": 30,
"end": "2026-10-28",
"start": "2026-09-29"
}
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.adsobjectdata.ads.ad2Coststringdata.ads.ad2Roasnumberdata.ads.ad_revenue_ratiostringdata.ads.ad_view_ratiostringdata.ads.video_idstringdata.currencystringdata.dataEndstringdata.idstringdata.marketstringdata.notesarraydata.sourcestringdata.totalsobjectdata.totals.day_new_followersstringdata.totals.day_revenuestringdata.totals.day_salestringdata.totals.day_viewsstringdata.totals.new_followersstringdata.totals.revenuestringdata.totals.salestringdata.totals.video_idstringdata.totals.viewsstringdata.windowobjectdata.window.daysintegerdata.window.endstringdata.window.startstringmetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/similarVideos TikTok relates to this one
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions. - limitinteger
Results per page. comments and replies max 50, similar max 30; Shop Analytics methods max 100. Values above a method's maximum are lowered and reported in notes.
2 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: similar. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "similar",
"id": "7691522530129022221",
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/videos/7691522530129022221/similar?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7691522530129022221/similar",
params={
"limit": 3,
},
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const params = new URLSearchParams({
limit: "3",
});
const res = await fetch(`https://api.tokconnect.com/v1/videos/7691522530129022221/similar?${params}`, {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"hasMore": false,
"videos": [
{
"caption": "no need to overpluck your brows anymore 😌 this gel locks every hair in place and keeps them there all day",
"comments": 26,
"creator": {
"followers": 2400000,
"handle": "ingaterner",
"id": "6915470077362865158",
"nickname": "Inga Terner",
"secUid": "MS4wLjABAAAAj3-0_ug3CN2zVQW1fOIuVgtFq37iFz2-aQNDN9VLKT0Xa1rcEfAAybaLMhLsXCIu"
},
"durationSec": 11,
"id": "7652228657624272141",
"isAd": true,
"language": "en",
"likes": 4000,
"posted": "2026-06-17T05:16:00Z",
"products": [
{
"id": "1731195873060032840",
"name": "The Brow Glue Crazy Lift, Brow",
"sellerId": "7495306581925726536",
"title": "The Brow Glue Crazy Lift, Brow Lamination Gel with 16HR Strong Hold & Built-In Styling Comb, NYX Professional Makeup"
}
],
"saves": 638,
"shares": 109,
"sound": {
"author": "ky",
"id": "7574176490877274935",
"original": true,
"title": "original sound"
},
"url": "https://www.tiktok.com/@ingaterner/video/7652228657624272141",
"views": 137700
},
{
"caption": "@MAC Cosmetics night",
"comments": 7,
"creator": {
"followers": 2400000,
"handle": "ingaterner",
"id": "6915470077362865158",
"nickname": "Inga Terner",
"secUid": "MS4wLjABAAAAj3-0_ug3CN2zVQW1fOIuVgtFq37iFz2-aQNDN9VLKT0Xa1rcEfAAybaLMhLsXCIu"
},
"durationSec": 10,
"id": "7673769596033191182",
"language": "en",
"likes": 419,
"posted": "2026-08-14T06:25:58Z",
"saves": 31,
"shares": 1,
"sound": {
"author": "Trendformusic",
"id": "7532565244910308102",
"original": true,
"title": "son original"
},
"url": "https://www.tiktok.com/@ingaterner/video/7673769596033191182",
"views": 8160
},
{
"caption": "my go-to nude shades this summer",
"comments": 11,
"creator": {
"followers": 2400000,
"handle": "ingaterner",
"id": "6915470077362865158",
"nickname": "Inga Terner",
"secUid": "MS4wLjABAAAAj3-0_ug3CN2zVQW1fOIuVgtFq37iFz2-aQNDN9VLKT0Xa1rcEfAAybaLMhLsXCIu"
},
"durationSec": 15,
"id": "7658093031144295693",
"isAd": true,
"language": "en",
"likes": 403,
"posted": "2026-07-03T00:32:32Z",
"products": [
{
"id": "1729401426661773360",
"name": "Lip Gloss",
"sellerId": "7495171395322742832",
"title": "Lip Gloss - High-Shine, Vanilla-Scented, Ultra Smooth Gloss with Luminous Finish Matte"
}
],
"saves": 101,
"shares": 5,
"sound": {
"author": "burner.wave",
"id": "7633979701119306510",
"original": true,
"title": "burner wave pour it up x all the way turnt up"
},
"url": "https://www.tiktok.com/@ingaterner/video/7658093031144295693",
"views": 10100
}
]
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.hasMorebooleandata.videosarraydata.videos[].captionstringdata.videos[].commentsintegerdata.videos[].creatorobjectdata.videos[].creator.followersintegerdata.videos[].creator.handlestringdata.videos[].creator.idstringdata.videos[].creator.nicknamestringdata.videos[].creator.secUidstringdata.videos[].durationSecintegerdata.videos[].idstringdata.videos[].isAdbooleandata.videos[].languagestringdata.videos[].likesintegerdata.videos[].postedstringdata.videos[].productsarraydata.videos[].products[].idstringdata.videos[].products[].namestringdata.videos[].products[].sellerIdstringdata.videos[].products[].titlestringdata.videos[].savesintegerdata.videos[].sharesintegerdata.videos[].soundobjectdata.videos[].sound.authorstringdata.videos[].sound.idstringdata.videos[].sound.originalbooleandata.videos[].sound.titlestringdata.videos[].urlstringdata.videos[].viewsintegermetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/similar-revenueHow similar videos performed
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions.
7 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - endstring
Shop Analytics methods: custom range end, YYYY-MM-DD (capped at the last complete day).
- limitinteger
Results per page. comments and replies max 50, similar max 30; Shop Analytics methods max 100. Values above a method's maximum are lowered and reported in notes.
- regionstring
Market as an ISO country code, default US. Shop Analytics methods: sales data for that market, amounts in its currency. Live methods that take it (search, video detail, creator posts, Shop pages): TikTok as seen in that market where TikTok serves it. Core: US, GB, DE, FR, ES, JP, TH, VN, ID, MY, PH, BR, MX. Extended: PL, IT, NL, IE. Other countries are refused. See
shop_regions. - startstring
Shop Analytics methods: custom range start, YYYY-MM-DD.
- windowstring
Shop Analytics methods: date range ending at the last complete day (about 2 days ago). Default 30d. Use start/end for a custom range.
One of
7d30d90d180d365d
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: similar_revenue. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "similar_revenue",
"id": "7700682843906723103"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7700682843906723103/similar-revenue" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7700682843906723103/similar-revenue",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7700682843906723103/similar-revenue", {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"currency": "USD",
"dataEnd": "2026-10-28",
"id": "7700682843906723103",
"market": "US",
"notes": [
"Market US (United States): amounts are in USD."
],
"similar": {
"revenue": [
{
"ad": 1,
"ai_video": 0,
"content_type": "video",
"create_time": "2026/10/21 19:35:52",
"creator_id": "7408927728046933038",
"description": "Which one do you think? #stickvacuum #petallergies #petparents #shark #sharkpowerproflex ",
"duration": "1m 22s",
"handle": "kid.shops",
"id": "7699268904157334815",
"music_title": "original sound - kid.shops",
"original_duration": 81.834,
"revenue": "$68.98k",
"sale": 182,
"views": "1.09m"
},
{
"ad": 1,
"ai_video": 0,
"content_type": "video",
"create_time": "2026/10/25 17:47:08",
"creator_id": "7275090345011414059",
"description": "Which cordless vacuum is better? What price they have this one at today you can’t beat it.. #vacuum #cordlessvacuum #stickvacuum #sharkvacuum #cleaning ",
"duration": "1m 46s",
"handle": "dealswithty",
"id": "7700725240166436127",
"music_title": "original sound",
"original_duration": 106,
"revenue": "$65.95k",
"sale": 174,
"views": "1.3m"
},
{
"ad": 1,
"ai_video": 0,
"content_type": "video",
"create_time": "2026/10/26 11:22:54",
"creator_id": "7289195477476262958",
"description": "Why pay more for a vacuum that does less… when you can pay less for one that does more?🤔 #vacuum #cleaning #petvacuum #sharkpowerproflexreveal ",
"duration": "1m 34s",
"handle": "ericsfindss",
"id": "7700997310842490126",
"music_title": "original sound",
"original_duration": 94,
"revenue": "$38.28k",
"sale": 101,
"views": "589.94k"
}
],
"type": "product"
},
"source": "TokConnect Shop Analytics (TikTok Shop US). Revenue and units are estimates: units track TikTok's sold counter; revenue is units times listed price.",
"window": {
"days": 30,
"end": "2026-10-28",
"start": "2026-09-29"
}
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.currencystringdata.dataEndstringdata.idstringdata.marketstringdata.notesarraydata.similarobjectdata.similar.revenuearraydata.similar.revenue[].adintegerdata.similar.revenue[].ai_videointegerdata.similar.revenue[].content_typestringdata.similar.revenue[].create_timestringdata.similar.revenue[].creator_idstringdata.similar.revenue[].descriptionstringdata.similar.revenue[].durationstringdata.similar.revenue[].handlestringdata.similar.revenue[].idstringdata.similar.revenue[].music_titlestringdata.similar.revenue[].original_durationnumberdata.similar.revenue[].revenuestringdata.similar.revenue[].saleintegerdata.similar.revenue[].viewsstringdata.similar.typestringdata.sourcestringdata.windowobjectdata.window.daysintegerdata.window.endstringdata.window.startstringmetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/transcriptExisting captions as plain text (nothing is transcribed)
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions.
2 more optional parameters
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - languagestring
method=transcript: preferred caption language, e.g. en.
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: transcript. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "transcript",
"id": "7691522530129022221"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7691522530129022221/transcript" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7691522530129022221/transcript",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7691522530129022221/transcript", {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"available": [],
"message": "TikTok has no captions for this video, so there is no transcript. Nothing was transcribed or generated.",
"noCaptions": true,
"segments": [],
"text": "",
"video": {
"authorUniqueId": "ingaterner",
"desc": "the shiniest lips on the internet @NOONI #noonipartner #beauty #glitterlips #lipoil #kbeauty ",
"durationMs": 18000,
"id": "7691522530129022221",
"playCount": 22632
}
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.availablearraydata.messagestringdata.noCaptionsbooleandata.segmentsarraydata.textstringdata.videoobjectdata.video.authorUniqueIdstringdata.video.descstringdata.video.durationMsintegerdata.video.idstringdata.video.playCountintegermetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/videos/{id}/comments/{comment_id}/repliesReplies to one comment (comment_id)
Parameters
- idstringPathRequired
Video or photo post: a TikTok link (short vm./vt. links work), or the numeric post id (
videos[].id). Not needed formethod=captions. - comment_idstringPathRequired
method=replies: the comment id frommethod=comments.
3 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - limitinteger
Results per page. comments and replies max 50, similar max 30; Shop Analytics methods max 100. Values above a method's maximum are lowered and reported in notes.
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video tool with method: replies. Same data, same credit. MCP setup
{
"tool": "video",
"arguments": {
"method": "replies",
"id": "7691522530129022221"
}
}Request
curl "https://api.tokconnect.com/v1/videos/7691522530129022221/comments/7701885045296956174/replies" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/videos/7691522530129022221/comments/7701885045296956174/replies",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7691522530129022221/comments/7701885045296956174/replies", {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"comments": [],
"hasMore": false
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.commentsarraydata.hasMorebooleanmetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
TikTok feeds
Samples TikTok's own feeds: For You (as a neutral US viewer), Explore categories, and Discover creators/hashtags/sounds. Samples, not rankings. Example: {"method":"explore","category_id":3}. Category ids come from reference method=explore_categories.
/v1/feeds/discoverDiscover picks: creators, hashtags, sounds
Parameters
- limitinteger
Results per page.
for_you, discover max 30; explore,discover_hashtagsmax 20. Values above a method's maximum are lowered and reported in notes.
3 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull - sceneinteger
method=discover: Discover scene (15 is the full catalogue).
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video_feed tool with method: discover. Same data, same credit. MCP setup
{
"tool": "video_feed",
"arguments": {
"method": "discover",
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/feeds/discover?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/feeds/discover",
params={
"limit": 3,
},
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const params = new URLSearchParams({
limit: "3",
});
const res = await fetch(`https://api.tokconnect.com/v1/feeds/discover?${params}`, {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"creators": [
{
"followers": 74600000,
"handle": "billieeilish",
"id": "6879693940111901701",
"nickname": "BILLIE EILISH",
"secUid": "MS4wLjABAAAAQC9D0J9C7zCdiToBJvaCHEZZl1FXTKeeSVoyGQld--0hcxb3lqDTxaSRjByAVlAs",
"verified": true
},
{
"followers": 16900000,
"handle": "rihanna",
"id": "6621955904844021765",
"nickname": "Rihanna",
"secUid": "MS4wLjABAAAAd04PpJrQJrRv5QpeLCz-tj41zTwuemXz6WBpyycnVNGeYqJjlOzJ5fpV9QWK5h4B",
"verified": true
},
{
"followers": 18100000,
"handle": "edsheeran",
"id": "173245838817808384",
"nickname": "Ed Sheeran",
"secUid": "MS4wLjABAAAAW-m9le-3IwWQcihDj2Io53yCuEgz0wb1Np_JY3chG8vAsK_fzWmK2NWaz1nzttoD",
"verified": true
}
],
"hashtags": [
{
"id": "7701142521555976205",
"name": "tiktokshopcollectiblescarnivals",
"views": 99200
},
{
"id": "7029514091618123822",
"name": "blackfridayearlyaccess",
"views": 29800000
},
{
"id": "1674571239209989",
"name": "discoveryourgift",
"views": 741000000
}
],
"sounds": [
{
"author": "3.1M videos",
"id": "6740248251825391617",
"title": "Forever (From \"Euphoria: Season 1\" Soundtrack)",
"videos": 3100000
},
{
"author": "87.1K videos",
"id": "5000000001008467945",
"title": "Quinceañera",
"videos": 87100
},
{
"author": "221.7K videos",
"id": "222453230176251905",
"title": "Hasta la Raíz",
"videos": 221700
}
]
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.creatorsarraydata.creators[].followersintegerdata.creators[].handlestringdata.creators[].idstringdata.creators[].nicknamestringdata.creators[].secUidstringdata.creators[].verifiedbooleandata.hashtagsarraydata.hashtags[].idstringdata.hashtags[].namestringdata.hashtags[].viewsintegerdata.soundsarraydata.sounds[].authorstringdata.sounds[].idstringdata.sounds[].titlestringdata.sounds[].videosintegermetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/feeds/discover/hashtagsDiscover hashtags with sample videos
Parameters
- limitinteger
Results per page.
for_you, discover max 30; explore,discover_hashtagsmax 20. Values above a method's maximum are lowered and reported in notes.
2 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video_feed tool with method: discover_hashtags. Same data, same credit. MCP setup
{
"tool": "video_feed",
"arguments": {
"method": "discover_hashtags",
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/feeds/discover/hashtags?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/feeds/discover/hashtags",
params={
"limit": 3,
},
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const params = new URLSearchParams({
limit: "3",
});
const res = await fetch(`https://api.tokconnect.com/v1/feeds/discover/hashtags?${params}`, {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"hasMore": true,
"hashtags": [
{
"id": "1612000725392390",
"name": "cindytest",
"sampleVideos": [
{
"caption": "#cindytest #",
"comments": 4,
"creator": {
"followers": 2908,
"handle": "edgar.alex.alcedo0",
"id": "7319128708127409158",
"nickname": "EL TERROR 🇵🇪🇵🇪🇵🇪🇵🇪🇵🇪",
"secUid": "MS4wLjABAAAA7zr7Ai1E_tdLqQ2Gxylv8rCmfRghekX5O_UpU3d9JABWoesADQITcAA3WYbS6ZLv"
},
"durationSec": 52,
"hashtags": [
{
"id": "1612000725392390",
"name": "cindytest"
}
],
"id": "7665797426422287637",
"language": "un",
"likes": 24,
"posted": "2026-07-23T18:49:20Z",
"saves": 1,
"shares": 7,
"sound": {
"author": "Ragal Ironbull",
"id": "7624518713740118806",
"original": true,
"title": "original sound"
},
"url": "https://www.tiktok.com/@edgar.alex.alcedo0/video/7665797426422287637",
"views": 941
},
{
"caption": "Well, not #gorgeous But that @beachwaver is the freaking bomb #emptynester #hairtok #beachwaver #fyp",
"comments": 0,
"creator": {
"followers": 164,
"handle": "justcindy59andholding",
"id": "7613894746034308109",
"nickname": "JustCindy",
"secUid": "MS4wLjABAAAAnI9ulHJfHJ8Yj-FpmaO8wh4QJELHonBK2ck2t-CXtp17Ly_ehzv-MCGoouhQNbvj"
},
"durationSec": 7,
"hashtags": [
{
"id": "10959",
"name": "gorgeous"
},
{
"id": "1620699584019462",
"name": "emptynester"
},
{
"id": "1631187004035077",
"name": "hairtok"
}
],
"id": "7688569373887450398",
"language": "en",
"likes": 2,
"posted": "2026-09-23T03:36:09Z",
"saves": 0,
"shares": 1,
"sound": {
"author": "Taylor Swift",
"id": "6752003160799201281",
"title": "Gorgeous"
},
"url": "https://www.tiktok.com/@justcindy59andholding/video/7688569373887450398",
"views": 309
},
{
"caption": "I know. You want this recipe! ##emptynester #rice #homemade #yummy",
"comments": 0,
"creator": {
"followers": 164,
"handle": "justcindy59andholding",
"id": "7613894746034308109",
"nickname": "JustCindy",
"secUid": "MS4wLjABAAAAnI9ulHJfHJ8Yj-FpmaO8wh4QJELHonBK2ck2t-CXtp17Ly_ehzv-MCGoouhQNbvj"
},
"durationSec": 23,
"hashtags": [
{
"id": "1620699584019462",
"name": "emptynester"
},
{
"id": "28775",
"name": "rice"
},
{
"id": "120886",
"name": "homemade"
}
],
"id": "7688565274487885087",
"language": "en",
"likes": 3,
"posted": "2026-09-23T03:20:09Z",
"saves": 0,
"shares": 0,
"sound": {
"author": "Spandau Ballet",
"id": "5000000001102939173",
"title": "True"
},
"url": "https://www.tiktok.com/@justcindy59andholding/video/7688565274487885087",
"views": 18
}
],
"url": "https://www.tiktok.com/tag/cindytest",
…Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.hasMorebooleandata.hashtagsarraydata.hashtags[].idstringdata.hashtags[].namestringdata.hashtags[].sampleVideosarraydata.hashtags[].sampleVideos[].captionstringdata.hashtags[].sampleVideos[].commentsintegerdata.hashtags[].sampleVideos[].creatorobjectdata.hashtags[].sampleVideos[].durationSecintegerdata.hashtags[].sampleVideos[].hashtagsarraydata.hashtags[].sampleVideos[].idstringdata.hashtags[].sampleVideos[].languagestringdata.hashtags[].sampleVideos[].likesintegerdata.hashtags[].sampleVideos[].postedstringdata.hashtags[].sampleVideos[].savesintegerdata.hashtags[].sampleVideos[].sharesintegerdata.hashtags[].sampleVideos[].soundobjectdata.hashtags[].sampleVideos[].urlstringdata.hashtags[].sampleVideos[].viewsintegerdata.hashtags[].urlstringdata.hashtags[].videosintegerdata.hashtags[].viewsintegerdata.nextstringmetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/feeds/exploreVideos from one Explore category
Parameters
- category_idinteger
method=explore: id fromreferencemethod=explore_categories. - limitinteger
Results per page.
for_you, discover max 30; explore,discover_hashtagsmax 20. Values above a method's maximum are lowered and reported in notes.
2 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video_feed tool with method: explore. Same data, same credit. MCP setup
{
"tool": "video_feed",
"arguments": {
"method": "explore",
"category_id": 120,
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/feeds/explore?category_id=120&limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/feeds/explore",
params={
"category_id": 120,
"limit": 3,
},
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const params = new URLSearchParams({
category_id: "120",
limit: "3",
});
const res = await fetch(`https://api.tokconnect.com/v1/feeds/explore?${params}`, {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"explore_item_source": "ug_same_country",
"hasMore": true,
"videos": [
{
"caption": "(✨️life changing title✨️)#kitten #why #confetti #weirdshithappenstome #whyandhowthefuckisthisconfettiflying",
"comments": 12600,
"creator": {
"followers": 4315,
"handle": "ech0d0gg",
"id": "7609364764213527573",
"nickname": "🌀//-Ech0._.D0gg-//🏳️⚧️",
"secUid": "MS4wLjABAAAAWvoibP5ag1boCZQKyWxN2IAWjXUi5JCEZsa97O_f8nTG-BXFORDu7j8QR60jpbxX"
},
"durationSec": 7,
"hashtags": [
{
"id": "6845",
"name": "kitten"
},
{
"id": "7754",
"name": "why"
},
{
"id": "87899",
"name": "confetti"
}
],
"id": "7699977998820281620",
"language": "en",
"likes": 1100000,
"place": {
"id": "42203860546907036",
"name": "Behind You"
},
"posted": "2026-10-23T21:27:25Z",
"saves": 82300,
"shares": 57100,
"sound": {
"author": "Jacket2026",
"id": "7673220508500052756",
"original": true,
"title": "оригинальный звук"
},
"url": "https://www.tiktok.com/@ech0d0gg/video/7699977998820281620",
"views": 9100000
},
{
"caption": "тгк: lybima411 шота у нас не получился этот тренд",
"comments": 2185,
"creator": {
"followers": 38200,
"handle": "onlyfrantsss",
"id": "6704968772954801158",
"nickname": "onlyfrants",
"secUid": "MS4wLjABAAAAPi5HECJh2vsFAzNTPJQxJvG5LVNUpWi-Ba4RQtLmhpZNfIfrAtLSfxHYEbp_LQqR"
},
"durationSec": 7,
"id": "7699537178774359317",
"language": "ru",
"likes": 689900,
"posted": "2026-10-22T16:56:43Z",
"saves": 29700,
"shares": 11100,
"sound": {
"author": "jamal",
"id": "7687759421904096013",
"original": true,
"title": "original sound"
},
"url": "https://www.tiktok.com/@onlyfrantsss/video/7699537178774359317",
"views": 9200000
},
{
"caption": "#fyp @Sextar",
"comments": 34500,
"creator": {
"followers": 327600,
"handle": "b4rbbbiee",
"id": "6879235892633109505",
"nickname": "Barbibu",
"secUid": "MS4wLjABAAAAJ-o2JbN9PO4eb2oc_bGkfQFnM1yrwp22rshsTEKhm9AP0rw-yn_rS2EoF1mfH7dD"
},
"durationSec": 7,
"hashtags": [
{
"id": "229207",
"name": "fyp"
}
],
"id": "7699677067105144085",
"language": "un",
"likes": 7500000,
"posted": "2026-10-23T01:59:36Z",
"saves": 712800,
"shares": 1100000,
"sound": {
"author": "‽",
"id": "7521507656105151248",
"original": true,
"title": "original sound"
},
"url": "https://www.tiktok.com/@b4rbbbiee/video/7699677067105144085",
"views": 41200000
}
]
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.explore_item_sourcestringdata.hasMorebooleandata.videosarraydata.videos[].captionstringdata.videos[].commentsintegerdata.videos[].creatorobjectdata.videos[].creator.followersintegerdata.videos[].creator.handlestringdata.videos[].creator.idstringdata.videos[].creator.nicknamestringdata.videos[].creator.secUidstringdata.videos[].durationSecintegerdata.videos[].hashtagsarraydata.videos[].hashtags[].idstringdata.videos[].hashtags[].namestringdata.videos[].idstringdata.videos[].languagestringdata.videos[].likesintegerdata.videos[].placeobjectdata.videos[].place.idstringdata.videos[].place.namestringdata.videos[].postedstringdata.videos[].savesintegerdata.videos[].sharesintegerdata.videos[].soundobjectdata.videos[].sound.authorstringdata.videos[].sound.idstringdata.videos[].sound.originalbooleandata.videos[].sound.titlestringdata.videos[].urlstringdata.videos[].viewsintegermetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
/v1/feeds/for-youA page of the For You feed
Parameters
- limitinteger
Results per page.
for_you, discover max 30; explore,discover_hashtagsmax 20. Values above a method's maximum are lowered and reported in notes.
2 more optional parameters
- cursorstring
Paging: pass the next value from the previous response unchanged. Omit on the first page.
- detailstring
compact (default) returns the useful fields; full adds the raw upstream payload (large).
Default
compactOne ofcompactfull
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the video_feed tool with method: for_you. Same data, same credit. MCP setup
{
"tool": "video_feed",
"arguments": {
"method": "for_you",
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/feeds/for-you?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/feeds/for-you",
params={
"limit": 3,
},
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const params = new URLSearchParams({
limit: "3",
});
const res = await fetch(`https://api.tokconnect.com/v1/feeds/for-you?${params}`, {
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"hasMore": true,
"home_model": 1,
"log_info": {
"impr_id": "20261030233320252DED3F3D4CA96C0082",
"pull_type": "1"
},
"max_cursor": 7,
"min_cursor": 0,
"preload_ads": [],
"preload_awemes": null,
"refresh_clear": 1,
"videos": [
{
"caption": "7",
"comments": 1,
"creator": {
"handle": "joyreelsshort.ca",
"id": "7639195000521786388",
"nickname": "JoyReelsshort CA",
"secUid": "MS4wLjABAAAAZl2od8WK6lFoTSzxEquguEIyb_eWjZe7JjzMS7s2juhEVkMwu7yYvcbcMXycxwZ0",
"verified": true
},
"durationSec": 84.44,
"id": "7700899193195449621",
"language": "un",
"likes": 330,
"posted": "2026-10-26T13:02:30Z",
"saves": 172,
"shares": 13,
"sound": {
"author": "JoyReelsshort CA",
"id": "7700899226716244757",
"title": "suono originale - joyreelsshort.ca"
},
"url": "https://www.tiktok.com/@joyreelsshort.ca/video/7700899193195449621",
"views": 58888
},
{
"caption": "magari tornare a parigi",
"comments": 1013,
"creator": {
"handle": "caterinamellusii",
"id": "6696822421436253190",
"nickname": "cate",
"secUid": "MS4wLjABAAAAd0Bb-tLv2sD8KUA0H7yUo0Gnf2nYFOW63dPyWbng7gNGmZMj48yKBzBAgv2WR5Fp",
"verified": true
},
"durationSec": 10.634,
"id": "7683308873704394016",
"language": "it",
"likes": 191772,
"posted": "2026-09-08T23:22:41Z",
"saves": 14604,
"shares": 6840,
"sound": {
"author": "SoundWaves",
"id": "7600964198817893142",
"title": "suono originale - soundwaves.it"
},
"url": "https://www.tiktok.com/@caterinamellusii/video/7683308873704394016",
"views": 1066264
},
{
"caption": "Il carico è arrivato 🚛🪵 Faggio stagionato, pronto da bruciare. Fai scorta prima del freddo 🔥 Consegna a Lecco e in Brianza 📲 WhatsApp 320 746 7020 #legnadaardere #lecco #camino #stufaalegna #inverno",
"comments": 10,
"creator": {
"handle": "radasnc",
"id": "7047523516694217734",
"nickname": "Rada",
"secUid": "MS4wLjABAAAAr51i3kp6Kzu7217gB3jsySH2jPNZZZXBxAmpsv4WEBGavzxuTO-QRfQczc2VBuGv",
"verified": true
},
"durationSec": 19.318,
"hashtags": [
{
"id": "1663053011916806",
"name": "legnadaardere"
},
{
"id": "27958339",
"name": "lecco"
},
{
"id": "24299",
"name": "camino"
}
],
"id": "7690872488833584417",
"language": "it",
"likes": 135,
"posted": "2026-09-29T08:33:19Z",
"saves": 37,
"shares": 110,
"sound": {
"author": "🎧",
"id": "7478091635340626710",
"title": "suono originale - lyrics.7670"
},
"url": "https://www.tiktok.com/@radasnc/video/7690872488833584417",
"views": 4172
}
]
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.hasMorebooleandata.home_modelintegerdata.log_infoobjectdata.log_info.impr_idstringdata.log_info.pull_typestringdata.max_cursorintegerdata.min_cursorintegerdata.preload_adsarraydata.preload_awemesnulldata.refresh_clearintegerdata.videosarraydata.videos[].captionstringdata.videos[].commentsintegerdata.videos[].creatorobjectdata.videos[].creator.handlestringdata.videos[].creator.idstringdata.videos[].creator.nicknamestringdata.videos[].creator.secUidstringdata.videos[].creator.verifiedbooleandata.videos[].durationSecnumberdata.videos[].idstringdata.videos[].languagestringdata.videos[].likesintegerdata.videos[].postedstringdata.videos[].savesintegerdata.videos[].sharesintegerdata.videos[].soundobjectdata.videos[].sound.authorstringdata.videos[].sound.idstringdata.videos[].sound.titlestringdata.videos[].urlstringdata.videos[].viewsintegermetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503
Try it Live call, 1 credit
Comment giveaway draw
/v1/videos/{video}/giveawayComment giveaway draw
Parameters
- videostringPathRequired
Post id or full https://www.tiktok.com/@creator/video/<id> URL.
7 more optional parameters
- detailstring
full adds TikTok's raw payload (large).
Default
compactOne ofcompactfull - exclude_creatorboolean
Exclude comments by the video's creator.
Default
true - max_commentsinteger
Comments to fetch, in pages of 50.
Default
300 - must_includestring
Optional text a comment must contain (case-insensitive), e.g. a hashtag or keyword.
- seedstring
Optional seed for a reproducible draw. Publish it so anyone can re-run the draw.
- unique_usersboolean
Count each commenter once (their earliest fetched comment).
Default
true - winnersinteger
How many winners to draw.
Default
1
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the pick_comment_winners tool. Same data, same credit. MCP setup
{
"tool": "pick_comment_winners",
"arguments": {
"id": "7691522530129022221"
}
}Request
curl -X POST "https://api.tokconnect.com/v1/videos/7691522530129022221/giveaway" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.post(
"https://api.tokconnect.com/v1/videos/7691522530129022221/giveaway",
headers={"X-API-Key": os.environ["TOKCONNECT_API_KEY"]},
timeout=100,
)
r.raise_for_status()
body = r.json()
print(body["data"])const res = await fetch("https://api.tokconnect.com/v1/videos/7691522530129022221/giveaway", {
method: "POST",
headers: { "X-API-Key": process.env.TOKCONNECT_API_KEY },
});
if (!res.ok) throw new Error((await res.json()).error?.message);
const { data, next_cursor } = await res.json();Response
{
"data": {
"awemeId": "7691522530129022221",
"coverage": 0.95,
"eligible": 16,
"excluded": {
"duplicateUser": 3
},
"fairness": "Only the 19 fetched top-level comments were eligible; replies, hidden, filtered or deleted comments are not included. TikTok returns comments in its own order, so on large videos the fetched set is TikTok's selection, not a random sample of all comments. TikTok reports 20 comments; 19 were fetched.",
"fetched": 19,
"pages": 1,
"random": "crypto/rand (not reproducible; pass seed for a verifiable draw)",
"rules": {
"creatorHandle": "ingaterner",
"excludeCreator": true,
"maxComments": 300,
"mustInclude": "",
"uniqueUsers": true,
"winners": 1
},
"seed": null,
"totalReported": 20,
"winners": [
{
"authorNickname": "R.",
"authorUniqueId": "r9079756",
"createTime": 1791056562,
"diggCount": 0,
"id": "7692529272121000725",
"isAuthor": false,
"text": "😳😳😳"
}
]
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
}
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.awemeIdstringdata.coveragenumberdata.eligibleintegerdata.excludedobjectdata.excluded.duplicateUserintegerdata.fairnessstringdata.fetchedintegerdata.pagesintegerdata.randomstringdata.rulesobjectdata.rules.creatorHandlestringdata.rules.excludeCreatorbooleandata.rules.maxCommentsintegerdata.rules.mustIncludestringdata.rules.uniqueUsersbooleandata.rules.winnersintegerdata.seednulldata.totalReportedintegerdata.winnersarraydata.winners[].authorNicknamestringdata.winners[].authorUniqueIdstringdata.winners[].createTimeintegerdata.winners[].diggCountintegerdata.winners[].idstringdata.winners[].isAuthorbooleandata.winners[].textstringmetaobjectmeta.credits_chargedinteger1 on success.meta.credits_remainingintegerCredits left this period, when known.meta.request_idstringQuote it to support.next_cursorstringPresent when there is another page: pass it back as cursor.
Errors
400401402403404429502503