Sounds, hashtags and places
Sounds, hashtags and tagged places, each with the videos that use it.
Find sounds
Finds TikTok sounds by keyword, or lists TikTok's hot sounds, beats and licensed music. Pass a sound id to sound for its videos. Example: {"keyword":"sped up"} or {"method":"hot"}.
/v1/search/soundsSounds matching keyword
Parameters
- keywordstring
method=keyword: search phrase. - limitinteger
Results per page. Max 30. 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 - 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 sound_search tool with method: keyword. Same data, same credit. MCP setup
{
"tool": "sound_search",
"arguments": {
"method": "keyword",
"keyword": "lip oil",
"limit": "3"
}
}Request
curl "https://api.tokconnect.com/v1/search/sounds?keyword=lip%20oil&limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/search/sounds",
params={
"keyword": "lip oil",
"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({
keyword: "lip oil",
limit: "3",
});
const res = await fetch(`https://api.tokconnect.com/v1/search/sounds?${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": {
"ad_info": {},
"feedback_type": "music",
"global_doodle_config": {
"display_filter_bar": 1,
"enable_music_mix_rank": 1,
"feedback_survey": [
{
"feedback_type": "music",
"long_stress_info": null,
"multiple_choices": [
{
"key": "Dislike",
"value": "Dislike"
},
{
"key": "Unrelated result",
"value": "Unrelated result"
},
{
"key": "No original version",
"value": "No original version"
}
],
"send_us_multiple_choices": null
}
],
"hide_results": false,
"hit_dolphin": false,
"hit_shark": false,
"keyword": "lip oil",
"new_source": "normal_search",
"search_channel": "musically_music",
"tns_search_result": "Pass"
},
"hasMore": true,
"next": "eyJjdXJzb3IiOjMsInNlYXJjaF9pZCI6InUuMjAyNjEwMzAyMzI2NDdGNjcxQUI5OTlGOTQ1MjRCNzNEQyJ9",
"qc": "",
"search_id": "u.20261030232647F671AB999F94524B73DC",
"sounds": [
{
"album": "INTRAVENOSA",
"author": "Mellysa Catty & xTurbo",
"durationSec": 16,
"id": "7551425165536643088",
"title": "Lip Oil",
"url": "https://www.tiktok.com/music/-7551425165536643088",
"videos": 2
},
{
"author": "Lipi",
"commercialUse": true,
"durationSec": 15,
"id": "7379968945522739984",
"original": true,
"title": "original sound - tahaminalipi",
"url": "https://www.tiktok.com/music/-7379968945522739984",
"videos": 12373
},
{
"album": "Forever with You",
"author": "SebaLazi",
"durationSec": 60,
"id": "7478886011436894225",
"title": "Lipsi",
"url": "https://www.tiktok.com/music/-7478886011436894225",
"videos": 676
}
],
"version": "v2"
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
},
"next_cursor": "eyJjdXJzb3IiOjMsInNlYXJjaF9pZCI6InUuMjAyNjEwMzAyMzI2NDdGNjcxQUI5OTlGOTQ1MjRCNzNEQyJ9"
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.ad_infoobjectdata.feedback_typestringdata.global_doodle_configobjectdata.global_doodle_config.display_filter_barintegerdata.global_doodle_config.enable_music_mix_rankintegerdata.global_doodle_config.feedback_surveyarraydata.global_doodle_config.feedback_survey[].feedback_typestringdata.global_doodle_config.feedback_survey[].long_stress_infonulldata.global_doodle_config.feedback_survey[].multiple_choicesarraydata.global_doodle_config.feedback_survey[].send_us_multiple_choicesnulldata.global_doodle_config.hide_resultsbooleandata.global_doodle_config.hit_dolphinbooleandata.global_doodle_config.hit_sharkbooleandata.global_doodle_config.keywordstringdata.global_doodle_config.new_sourcestringdata.global_doodle_config.search_channelstringdata.global_doodle_config.tns_search_resultstringdata.hasMorebooleandata.nextstringdata.qcstringdata.search_idstringdata.soundsarraydata.sounds[].albumstringdata.sounds[].authorstringdata.sounds[].durationSecintegerdata.sounds[].idstringdata.sounds[].titlestringdata.sounds[].urlstringdata.sounds[].videosintegerdata.versionstringmetaobjectmeta.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/sounds/beatsRecommended beats
Parameters
- limitinteger
Results per page. Max 30. 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 sound_search tool with method: beats. Same data, same credit. MCP setup
{
"tool": "sound_search",
"arguments": {
"method": "beats",
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/sounds/beats?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/sounds/beats",
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/sounds/beats?${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": {
"from_recommend": true,
"hasMore": false,
"sounds": [
{
"album": "Cute",
"author": "CLOUDEE",
"commercialUse": true,
"durationSec": 60,
"id": "7284220358223005697",
"title": "Cute",
"url": "https://www.tiktok.com/music/-7284220358223005697",
"videos": 577480
},
{
"author": "Staceyπ¦",
"commercialUse": true,
"durationSec": 35,
"id": "7702366598140676886",
"original": true,
"title": "original sound - stacey.shops",
"url": "https://www.tiktok.com/music/-7702366598140676886",
"videos": 1
},
{
"author": "Eirini β¨",
"commercialUse": true,
"durationSec": 7,
"id": "7702130662115166979",
"original": true,
"title": "original sound - _eirinikatsigianni",
"url": "https://www.tiktok.com/music/-7702130662115166979"
}
]
},
"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.from_recommendbooleandata.hasMorebooleandata.soundsarraydata.sounds[].albumstringdata.sounds[].authorstringdata.sounds[].commercialUsebooleandata.sounds[].durationSecintegerdata.sounds[].idstringdata.sounds[].titlestringdata.sounds[].urlstringdata.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/sounds/hotCurrently hot original sounds
Parameters
- limitinteger
Results per page. Max 30. 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 sound_search tool with method: hot. Same data, same credit. MCP setup
{
"tool": "sound_search",
"arguments": {
"method": "hot",
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/sounds/hot?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/sounds/hot",
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/sounds/hot?${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": {
"from_recommend": true,
"hasMore": true,
"next": "eyJjdXJzb3IiOjN9",
"sounds": [
{
"album": "Cute",
"author": "CLOUDEE",
"commercialUse": true,
"durationSec": 60,
"id": "7284220358223005697",
"title": "Cute",
"url": "https://www.tiktok.com/music/-7284220358223005697",
"videos": 577480
},
{
"author": "naran sitaula",
"commercialUse": true,
"durationSec": 21,
"id": "7702238644861553411",
"original": true,
"title": "original sound - naran.sitaula",
"url": "https://www.tiktok.com/music/-7702238644861553411",
"videos": 1
},
{
"album": "Do Not Give Up Easily",
"author": "Gareta Johan",
"durationSec": 45,
"id": "7609944367696906257",
"title": "Do Not Give Up Easily",
"url": "https://www.tiktok.com/music/-7609944367696906257",
"videos": 19337
}
]
},
"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.from_recommendbooleandata.hasMorebooleandata.nextstringdata.soundsarraydata.sounds[].albumstringdata.sounds[].authorstringdata.sounds[].commercialUsebooleandata.sounds[].durationSecintegerdata.sounds[].idstringdata.sounds[].titlestringdata.sounds[].urlstringdata.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/sounds/licensedLicensed tracks cleared for use
Parameters
- limitinteger
Results per page. Max 30. 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 sound_search tool with method: licensed. Same data, same credit. MCP setup
{
"tool": "sound_search",
"arguments": {
"method": "licensed",
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/sounds/licensed?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/sounds/licensed",
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/sounds/licensed?${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,
"sounds": [
{
"author": "Galantis",
"durationSec": 18,
"id": "6575698583637461761",
"title": "Love On Me",
"url": "https://www.tiktok.com/music/-6575698583637461761",
"videos": 1441190
},
{
"album": "One Call Away",
"author": "Charlie Puth",
"durationSec": 41,
"id": "6353936740163521282",
"title": "One Call Away",
"url": "https://www.tiktok.com/music/-6353936740163521282",
"videos": 3602251
},
{
"album": "SQUARE UP",
"author": "BLACKPINK",
"durationSec": 18,
"id": "6569011430538873607",
"original": true,
"title": "Forever Young",
"url": "https://www.tiktok.com/music/-6569011430538873607",
"videos": 704647
}
]
},
"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.soundsarraydata.sounds[].authorstringdata.sounds[].durationSecintegerdata.sounds[].idstringdata.sounds[].titlestringdata.sounds[].urlstringdata.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
One sound
One TikTok sound (id = sound id from any post or sound_search, or a sound link): detail or the videos using it. Example: {"id":"7012...","method":"videos"}.
/v1/sounds/{id}Title, author, duration, original or licensed, post count
Parameters
- idstringPathRequired
Sound id (sound.id on a post) or a TikTok sound link.
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 sound tool with method: detail. Same data, same credit. MCP setup
{
"tool": "sound",
"arguments": {
"method": "detail",
"id": "7139362230881094442"
}
}Request
curl "https://api.tokconnect.com/v1/sounds/7139362230881094442" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/sounds/7139362230881094442",
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/sounds/7139362230881094442", {
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": {
"author": "JERI",
"commercialUse": true,
"durationSec": 40,
"id": "7139362230881094442",
"original": true,
"title": "ariana grande . ill do it",
"url": "https://www.tiktok.com/music/-7139362230881094442",
"videos": 37373
},
"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.authorstringdata.commercialUsebooleandata.durationSecintegerdata.idstringdata.originalbooleandata.titlestringdata.urlstringdata.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/sounds/{id}/videosVideos using the sound
Parameters
- idstringPathRequired
Sound id (sound.id on a post) or a TikTok sound link.
- limitinteger
Results per page. Max 50. 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 sound tool with method: videos. Same data, same credit. MCP setup
{
"tool": "sound",
"arguments": {
"method": "videos",
"id": "7139362230881094442",
"limit": "3"
}
}Request
curl "https://api.tokconnect.com/v1/sounds/7139362230881094442/videos?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/sounds/7139362230881094442/videos",
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/sounds/7139362230881094442/videos?${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": {
"can_pin_video": false,
"hasMore": true,
"need_lazy_loading": false,
"next": "eyJjdXJzb3IiOiIxMiJ9",
"version": "v2",
"videos": [
{
"caption": "ariana grande - ill do it x the light is coming #arianator #ariana #heidimontag #music #fyp #remix #mashup",
"comments": 334,
"creator": {
"handle": "princesstar101",
"id": "6546365462278575104",
"nickname": "JERI",
"secUid": "MS4wLjABAAAA2S0o_ga6XnDO0O9EIB13PxSS5v0MJIewfBPq2FWHO6PirmDwcPNrqyvOwqPtg_Cv"
},
"durationSec": 41.12,
"hashtags": [
{
"id": "28006",
"name": "arianator"
},
{
"id": "12326",
"name": "ariana"
},
{
"id": "730612",
"name": "heidimontag"
}
],
"id": "7139362264565501226",
"language": "en",
"likes": 30956,
"posted": "2022-09-04T03:31:54Z",
"saves": 16384,
"shares": 683,
"sound": {
"author": "JERI",
"id": "7139362230881094442",
"original": true,
"title": "ariana grande . ill do it"
},
"url": "https://www.tiktok.com/@princesstar101/video/7139362264565501226",
"views": 673675
},
{
"caption": "Amber is the best",
"comments": 187,
"creator": {
"handle": "heidimontag",
"id": "114703556082917376",
"nickname": "heidimontag",
"secUid": "MS4wLjABAAAAr_d_sgXvtLe_VPVE1-toCiS8hgaBFNbytBBh77sqTSfMiXDXOhH9W5fKDdbstpsY",
"verified": true
},
"durationSec": 13.258,
"id": "6896945616031632646",
"language": "en",
"likes": 6166,
"posted": "2020-11-19T21:12:05Z",
"saves": 1387,
"shares": 106,
"sound": {
"author": "Heidi Montag",
"id": "238606941294632960",
"title": "I'll Do It"
},
"url": "https://www.tiktok.com/@heidimontag/video/6896945616031632646",
"views": 507712
},
{
"caption": "Its a twin thingy yall ππ₯° #twintelepathy",
"comments": 5128,
"creator": {
"handle": "razzi_boo",
"id": "7169714537069888554",
"nickname": "Londyn & LaWayne",
"secUid": "MS4wLjABAAAAJXx1DxOntxKrJdIZw_SivXtPH7Kj_ZNMu59w52z3875Op3xh4rJvWeAdsZHvGZAS"
},
"durationSec": 30.367,
"hashtags": [
{
"id": "638669",
"name": "twintelepathy"
}
],
"id": "7354772929457966382",
"language": "en",
"likes": 1372006,
"posted": "2024-04-06T15:15:49Z",
"saves": 93108,
"shares": 38731,
"sound": {
"author": "JERI",
"id": "7139362230881094442",
"original": true,
"title": "ariana grande . ill do it"
},
"url": "https://www.tiktok.com/@razzi_boo/video/7354772929457966382",
"views": 18229626
}
]
},
"meta": {
"credits_charged": 1,
"credits_remaining": 7906,
"request_id": "req_3f9c2a1b7d4e"
},
"next_cursor": "eyJjdXJzb3IiOiIxMiJ9"
}Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.can_pin_videobooleandata.hasMorebooleandata.need_lazy_loadingbooleandata.nextstringdata.versionstringdata.videosarraydata.videos[].captionstringdata.videos[].commentsintegerdata.videos[].creatorobjectdata.videos[].creator.handlestringdata.videos[].creator.idstringdata.videos[].creator.nicknamestringdata.videos[].creator.secUidstringdata.videos[].durationSecnumberdata.videos[].hashtagsarraydata.videos[].hashtags[].idstringdata.videos[].hashtags[].namestringdata.videos[].idstringdata.videos[].languagestringdata.videos[].likesintegerdata.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
One hashtag
One hashtag (id from hashtag_search or hashtags[].id on a post): detail, its videos (hot or newest), or related hashtags. Example: {"id":"229207","method":"videos","sort":"newest"}.
/v1/hashtags/{id}Views, video count, description
Parameters
- idstringPathRequired
Hashtag id (
hashtags[].id).
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 hashtag tool with method: detail. Same data, same credit. MCP setup
{
"tool": "hashtag",
"arguments": {
"method": "detail",
"id": "504245"
}
}Request
curl "https://api.tokconnect.com/v1/hashtags/504245" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/hashtags/504245",
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/hashtags/504245", {
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": {
"description": "From routines to glow ups, discover how the skincare community on TikTok keeps their skin cared for.",
"id": "504245",
"name": "SkinCare",
"url": "https://www.tiktok.com/tag/SkinCare",
"videos": 62776858,
"views": 1002857221064
},
"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.descriptionstringdata.idstringdata.namestringdata.urlstringdata.videosintegerdata.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/hashtags/{id}/videosVideos using the hashtag
Parameters
- idstringPathRequired
Hashtag id (
hashtags[].id). - limitinteger
Results per page. videos max 50, related max 20. Values above a method's maximum are lowered and reported in notes.
4 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 - 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. - sortstring
method=videos: hot (TikTok's ranking, default) or newest.One of
hotnewest
Use it in Claude or ChatGPT
Connect https://mcp.tokconnect.com/mcp and your AI calls this as the hashtag tool with method: videos. Same data, same credit. MCP setup
{
"tool": "hashtag",
"arguments": {
"method": "videos",
"id": "504245",
"limit": "3"
}
}Request
curl "https://api.tokconnect.com/v1/hashtags/504245/videos?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/hashtags/504245/videos",
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/hashtags/504245/videos?${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,
"next": "eyJjdXJzb3IiOjN9",
"videos": [
{
"caption": "4 Step Beginner Skincare routine πΈβ¨ #skincare #beginnerskincareroutine #skincaretipsforeveryone #blackgirlskincare",
"comments": 1155,
"creator": {
"handle": "mayriahm.a",
"id": "6532038966940549121",
"nickname": "Mariam π€",
"secUid": "MS4wLjABAAAAD3qd3TUwzYmyLsecBZa8h_NysIiFd8bZp-8IwV_eFBNBhfh9oihgSEjLrw7FrtOX",
"verified": true
},
"durationSec": 44.534,
"hashtags": [
{
"id": "504245",
"name": "SkinCare"
},
{
"id": "1690942436043778",
"name": "beginnerskincareroutine"
},
{
"id": "1665214116743170",
"name": "skincaretipsforeveryone"
}
],
"id": "7107330561206734086",
"language": "en",
"likes": 140759,
"posted": "2022-06-09T19:52:32Z",
"saves": 58342,
"shares": 3536,
"sound": {
"author": "Burna Boy",
"id": "7096289813334083585",
"title": "Last Last"
},
"url": "https://www.tiktok.com/@mayriahm.a/video/7107330561206734086",
"views": 4340166
},
{
"caption": "The fact it doesnβt sting her eyes π i need #kylie #kyliejenner #skincare",
"comments": 98,
"creator": {
"handle": "koreababe1",
"id": "6981218295518299137",
"nickname": "Korea Babe",
"secUid": "MS4wLjABAAAAepazH0jrDXmFaU8uFeQbD8MkWRhuXxy1ijlbb-arPTtS1K4qcHhpGIyjjK8Ac7i6",
"verified": true
},
"durationSec": 7.151,
"hashtags": [
{
"id": "23295",
"name": "kylie"
},
{
"id": "18830",
"name": "kyliejenner"
},
{
"id": "504245",
"name": "skincare"
}
],
"id": "7692712348200504583",
"language": "en",
"likes": 57559,
"posted": "2026-10-04T07:32:52Z",
"saves": 8792,
"shares": 728,
"sound": {
"author": "β³πΆππ πͺ½",
"id": "7596069087663459084",
"original": true,
"title": "MONTAGEM ALQUIMIA"
},
"url": "https://www.tiktok.com/@koreababe1/video/7692712348200504583",
"views": 1296455
},
{
"caption": "Skincare routine for glass skin #skincare #ai #aivids #animation #healthy",
"comments": 62,
"creator": {
"handle": "healthhandwellness",
"id": "7295346887061341217",
"nickname": "healthandwellness",
"secUid": "MS4wLjABAAAAAWuLv1V6Ti8czBxz1lhPxnVhGXdu-vDtPmULvWZBUszqJZYc1afnVNvc61lcr9SX",
"verified": true
},
"durationSec": 37.801,
"hashtags": [
{
"id": "504245",
"name": "SkinCare"
},
{
"id": "183145",
"name": "ai"
},
{
"id": "1681909226079234",
"name": "aivids"
}
],
"id": "7599023958746238230",
"language": "en",
"likes": 7798,
"posted": "2026-01-24T20:14:03Z",
"saves": 4728,
"shares": 975,
"sound": {
"author": "Limbo",
"id": "6754175395743926274",
"title": "Airplane Mode"
},
β¦Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.hasMorebooleandata.nextstringdata.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[].hashtagsarraydata.videos[].hashtags[].idstringdata.videos[].hashtags[].namestringdata.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
One place
One tagged place: business, venue or landmark (id from place_search, a post's place.id, or a place link): detail, videos tagged there, or TikTok's public reviews. Example: {"id":"2214...","method":"reviews"}.
/v1/places/{id}Name, category, address, tagged video count
Parameters
- idstringPathRequired
Place id (place.id on a post, or from
place_search) or a place link.
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 place tool with method: detail. Same data, same credit. MCP setup
{
"tool": "place",
"arguments": {
"method": "detail",
"id": "42203860535857971"
}
}Request
curl "https://api.tokconnect.com/v1/places/42203860535857971" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/places/42203860535857971",
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/places/42203860535857971", {
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": {
"address": "Haarlemmerstraat 44, 1013 ES Amsterdam, Netherlands",
"category": "Coffee Shop",
"city": "Amsterdam",
"hours": "1:00 AM β 8:00 AM",
"id": "42203860535857971",
"name": "Coffeeshop Amsterdam",
"rating": 5,
"reviews": 19,
"url": "https://www.tiktok.com/place/-42203860535857971",
"videos": 285
},
"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.addressstringdata.categorystringdata.citystringdata.hoursstringdata.idstringdata.namestringdata.ratingintegerdata.reviewsintegerdata.urlstringdata.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/places/{id}/reviewsPublic reviews with stars, text and photos
Parameters
- idstringPathRequired
Place id (place.id on a post, or from
place_search) or a place link. - limitinteger
Results per page. videos max 30, reviews max 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 place tool with method: reviews. Same data, same credit. MCP setup
{
"tool": "place",
"arguments": {
"method": "reviews",
"id": "42203860535857971",
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/places/42203860535857971/reviews?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/places/42203860535857971/reviews",
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/places/42203860535857971/reviews?${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,
"next": "eyJjdXJzb3IiOjN9",
"place": "Coffeeshop Amsterdam",
"reviews": [
{
"id": "7686931645366600481",
"language": "mk",
"posted": "2026-09-19T15:51:36Z",
"rating": 5,
"reviewer": ".qcold3",
"text": "Π·Π°Π΅Π±Π°ΡΠΎ"
},
{
"id": "7679038250304045857",
"language": "nl",
"posted": "2026-08-29T14:57:57Z",
"rating": 5,
"reviewer": "user.anoniem033",
"text": "lekker wietje"
}
],
"score": 5,
"scoreLabel": "Eccezionale",
"totalReviews": 19
},
"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.hasMorebooleandata.nextstringdata.placestringdata.reviewsarraydata.reviews[].idstringdata.reviews[].languagestringdata.reviews[].postedstringdata.reviews[].ratingintegerdata.reviews[].reviewerstringdata.reviews[].textstringdata.scoreintegerdata.scoreLabelstringdata.totalReviewsintegermetaobjectmeta.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/places/{id}/videosVideos tagged at the place
Parameters
- idstringPathRequired
Place id (place.id on a post, or from
place_search) or a place link. - limitinteger
Results per page. videos max 30, reviews max 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 place tool with method: videos. Same data, same credit. MCP setup
{
"tool": "place",
"arguments": {
"method": "videos",
"id": "42203860535857971",
"limit": 3
}
}Request
curl "https://api.tokconnect.com/v1/places/42203860535857971/videos?limit=3" \
-H "X-API-Key: $TOKCONNECT_API_KEY"import os
import requests
r = requests.get(
"https://api.tokconnect.com/v1/places/42203860535857971/videos",
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/places/42203860535857971/videos?${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,
"next": "eyJjdXJzb3IiOiIxNTkxNCJ9",
"videos": [
{
"caption": "i really need some video ideas π#viral #foryou #xyzcba #bikelife #boyfriend",
"comments": 125,
"creator": {
"followers": 2437,
"handle": "skppy.x",
"id": "6843364600545575942",
"nickname": "pindaπ¦π",
"secUid": "MS4wLjABAAAAmLBnir6TTibzwb0g7YJg_7hCOWxu6fStF2XQjEtsHvT2_CL9B3eqMRIaFkD7819G"
},
"durationSec": 10,
"hashtags": [
{
"id": "20884",
"name": "viral"
},
{
"id": "42164",
"name": "foryou"
},
{
"id": "1652823554560005",
"name": "xyzcba"
}
],
"id": "7598997004211014944",
"language": "en",
"likes": 90300,
"place": {
"id": "42203860535857971",
"name": "Coffeeshop Amsterdam"
},
"posted": "2026-01-24T18:29:40Z",
"saves": 7251,
"shares": 5526,
"sound": {
"author": "Aurora π«",
"id": "7135134965590657834",
"original": true,
"title": "original sound"
},
"url": "https://www.tiktok.com/@skppy.x/video/7598997004211014944",
"views": 679400
},
{
"caption": "lekkerste ontbijt in nederland #fyp #viral #tosti #antidepresivo #ontbijt",
"comments": 119,
"creator": {
"followers": 6713,
"handle": "kroketa.memes",
"id": "7445298973416211488",
"nickname": "kroketa memes",
"secUid": "MS4wLjABAAAAlBOLPepjOXfIm81qNQI2tEkm5diCvzBOUqckXgBP-f3XzMaWE4erJw6XoEBHKW52"
},
"durationSec": 7,
"hashtags": [
{
"id": "229207",
"name": "fyp"
},
{
"id": "20884",
"name": "viral"
},
{
"id": "3019133",
"name": "tosti"
}
],
"id": "7592287717405297952",
"language": "nl",
"likes": 49800,
"place": {
"id": "42203860535857971",
"name": "Coffeeshop Amsterdam"
},
"posted": "2026-01-06T16:34:13Z",
"saves": 6600,
"shares": 19300,
"sound": {
"author": "kroketa memes",
"id": "7592287775769070368",
"original": true,
"title": "origineel geluid"
},
"url": "https://www.tiktok.com/@kroketa.memes/video/7592287717405297952",
"views": 643200
},
{
"caption": "@JERJERRR :: final diva #fyp #diva #veryverytugf #jeremy #edit @ΰΌκ©π¦ππ’πΊπ’ππ§©πππΊπδΈ°γππΉ @κͺπ²κͺπ² αΰ½²ΰΌα«ΰΎ (α΄ΚΚΙͺα΄βs α΄ α΄ΚsΙͺα΄Ι΄) @amelia.mamuti13 @πππππ β― Ν @ayoub_0164 @β₯οΈπΏππ§π§ππ",
"comments": 75,
"creator": {
"followers": 286,
"handle": "doe_maar",
"id": "7605724897726383126",
"nickname": "ππ¦π©ππ―π|ποΈ",
"secUid": "MS4wLjABAAAA-8YvQCd6wGpH3mRgg_hFZiHIy4TA6DBqTcEKUiKhjGk5XIltlCUchVSxuKYNZcW_"
},
"durationSec": 14,
"hashtags": [
{
"id": "229207",
"name": "fyp"
},
{
"id": "16087",
"name": "diva"
},
{
"id": "7640578335592218657",
"name": "veryverytugf"
}
],
"id": "7640909707703536929",
"language": "en",
β¦Response fields
dataobjectThe tool's result. Compact by default; passdetail=fullfor the complete record.data.hasMorebooleandata.nextstringdata.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