{"openapi":"3.2.0","info":{"title":"TikTok API","description":"Public TikTok data through one predictable REST API: profiles with exact, follower and like counts, videos, comments, hashtags, music, effects, search and trending — plus a /stream endpoint that returns the actual playable MP4. Same JSON envelope on every response, cursor pagination, stable error codes. No login, no TikTok keys, no watermark tooling required.","version":"1.0.0"},"servers":[{"url":"https://tiktok1.jojapi.net"}],"security":[{"ApiKeyAuth":[]}],"tags":[{"name":"Search"},{"name":"Users"},{"name":"Videos"},{"name":"Lookup"},{"name":"Hashtag"},{"name":"Music"},{"name":"Effect"},{"name":"Place"},{"name":"Trending"}],"x-agent-commerce":{"catalog_url":"https://tiktok1.jojapi.net/_jojapi/agent/plans","discovery_url":"https://tiktok1.jojapi.net/.well-known/x402","directory_url":"https://agents.jojapi.net/apis/tiktok-data","docs":"https://docs.jojapi.com/consumers/agents"},"paths":{"/v1/search/suggestions":{"get":{"operationId":"get_v1_search_suggestions","summary":"Search Suggestions","description":"Returns TikTok's own search suggestions for a keyword.\n\n**These are suggestions, not search results.** For the actual result posts, use `/v1/search/videos`; this one is cheap enough for autocomplete.","tags":["Search"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"keyword":"cat","suggestions":[{"text":"cat in the hat","language":"en","groupId":"8269768591544170364"},{"text":"cat and the hat house","language":"en","groupId":"2164119076479742065"}]},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"keyword","in":"query","description":"Search term","required":true,"schema":{"type":"string","title":"Keyword"}},{"name":"limit","in":"query","description":"How many suggestions to return","required":false,"schema":{"type":"integer","title":"Limit","default":10}}]}},"/v1/search/videos":{"get":{"operationId":"get_v1_search_videos","summary":"Search Videos","description":"Returns the video posts TikTok serves on its results page for a keyword, across many creators, with each post's author handle. Play and like counts are rounded by TikTok to three significant digits at any size, so rows report `statsPrecision` `approximate`; comment, share and save counts arrive exact.\n\nPaged: hand back the envelope's `cursor` as `cursor`, or pass **both** `offset` and `searchId` from the body - they are the same two values. An `offset` on its own reads as the end of the results, which is why the envelope cursor carries the pair joined by a colon.","tags":["Search"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"keyword":"cats","videos":[{"id":"7678376901903207700","description":"#funnycatsoftiktok😂😂😍cute #kitty #cats #kittens #fyp ","authorUsername":"cat.sheri.kittens","cover":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/okDxPyfJFCPxqFlE1ZpBAuUfEjIBEIGgRIisT4~tplv-tiktokx-origin.image?…","originCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/o8YEyEJeVeDhKfIPCnWQATMdIHAjnNcQQE8goi~tplv-tiktokx-origin.image?…","dynamicCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/oE8VegjII1MHIebQhJWTdgNkD8oYgACnifKoEA~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-pve-0037c001/o0qIEmKfEFAxSjQgERJDUuCIxPEBJpqPCBGfBz/?…","width":576,"height":1024,"ratio":"540p","privateItem":false,"createTime":1787761442,"duration":17,"isPhotoPost":false,"hashtags":["funnycatsoftiktok😂😂😍cute","kitty","cats","kittens","fyp"],"music":{"id":"7096475339173431297","title":"Our Love Was Beautiful - Instrumental Version","authorName":"Straight White Teeth","duration":233,"original":false},"stats":{"playCount":92500,"diggCount":9163,"commentCount":69,"shareCount":10300,"collectCount":903,"repostCount":0},"statsPrecision":"approximate"},{"id":"7469173807102610696","description":"#cat #cats #catoftheday #catlover #lovecats #lovekittens #adopt #meow #gato #pet #pets #weeklyfluff","authorUsername":"catsloversclub","cover":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/oEdMBgfBcE28RNnEq1sHCpRenCgAXisAiAADIg~tplv-tiktokx-origin.image?…","originCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/ooIanneE0B9g9gR29aIAyFEBX1D7KpAt6fHygc~tplv-tiktokx-origin.image?…","dynamicCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/oEdMBgfBcE28RNnEq1sHCpRenCgAXisAiAADIg~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-pve-0037c001/okPBAXnEn2KDRBa1gycg9fEtFEARSQp95He6BI/?…","width":576,"height":1024,"ratio":"540p","privateItem":false,"createTime":1739052553,"duration":7,"isPhotoPost":false,"hashtags":["cat","cats","catoftheday","catlover","lovecats","lovekittens","adopt","meow"],"music":{"id":"7469173844037634833","title":"nhạc nền - Cat Lovers Club","authorName":"Cat Lovers Club","duration":7,"original":true},"stats":{"playCount":17300000,"diggCount":2600000,"commentCount":11600,"shareCount":755100,"collectCount":136163,"repostCount":0},"statsPrecision":"approximate"}],"hasMore":true,"nextOffset":2,"searchId":"20260902090924C719496B5A3DF0C3CEFB"},"cursor":"2:20260902090924C719496B5A3DF0C3CEFB","hasMore":true}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - TikTok answered with something unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"keyword","in":"query","description":"Search term","required":true,"schema":{"type":"string","title":"Keyword"}},{"name":"limit","in":"query","description":"Stop after this many. Omitted means 36.","required":false,"schema":{"type":"string","title":"Limit"}},{"name":"cursor","in":"query","description":"The envelope's cursor from the previous page - offset and searchId joined","required":false,"schema":{"type":"string","title":"Cursor"}},{"name":"offset","in":"query","description":"Resume from a nextOffset","required":false,"schema":{"type":"string","title":"Offset"}},{"name":"searchId","in":"query","description":"Pass `searchId` back with `offset` to continue a search","required":false,"schema":{"type":"string","title":"Searchid"}}]}},"/v1/profile/{username}":{"get":{"operationId":"get_v1_profile_username","summary":"User Details","description":"Returns an account's public profile: identity, avatars, bio and link, account settings, and **exact** follower, following, like and post counts.\n\nIf you only need followers, `secUid` or live state, `/v1/profile/{username}/live` answers the same question far more cheaply.\n\n**`include=videos`** returns the account's posts in the same answer, for a creator screen that would otherwise take two round trips. The cover images in each row load straight from TikTok's CDN in a browser, so a grid of thumbnails costs no further calls; only playback does, through `/v1/video/{video_id}/stream`.\n\nIt is opt-in because it changes what the call costs: a profile with its posts takes several times longer than the profile alone. The envelope's `cursor` and `hasMore` then describe the posts, since they are the only part that pages, and `cursor` is accepted back here to walk them without asking for the profile again.","tags":["Users"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"id":"127905465618821121","username":"khaby.lame","nickname":"Khabane lame","bio":"Se vuoi ridere sei nel posto giusto😎 If u wanna laugh u r in the right place😎","bioLink":null,"avatars":{"thumb":"https://p16-common-sign.tiktokcdn-eu.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?…","medium":"https://p16-common-sign.tiktokcdn-eu.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:720:720.jpeg?…","larger":"https://p16-common-sign.tiktokcdn-eu.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?…"},"verified":true,"privateAccount":false,"secUid":"MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA","createTime":null,"language":null,"isOrganization":false,"commerceUser":false,"stats":{"followerCount":162764894,"followingCount":81,"heartCount":2667397726,"videoCount":1350,"diggCount":0,"friendCount":77},"settings":{"canExpPlaylist":true,"duetSetting":0,"downloadSetting":0,"profileEmbedPermission":1,"isEmbedBanned":false,"commentSetting":0,"followingVisibility":1,"openFavorite":false,"stitchSetting":0},"extra":{"UserStoryStatus":0,"commerceUserInfo":{"commerceUser":false},"ftc":false,"isADVirtual":false,"profileTab":{"showPlayListTab":false},"relation":0,"secret":false,"shortDramaCreator":{},"ttSeller":false}},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`user_not_found` - TikTok has no account with that handle","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"504":{"description":"`deadline_exceeded` - the request timed out","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"username","in":"path","description":"TikTok handle, with or without @","required":true,"schema":{"type":"string","title":"Username"}},{"name":"include","in":"query","description":"`videos` to return the account's posts alongside the profile","required":false,"schema":{"type":"string","title":"Include"}},{"name":"limit","in":"query","description":"Posts to collect when `include=videos`","required":false,"schema":{"type":"string","title":"Limit"}},{"name":"cursor","in":"query","description":"A previous answer's cursor, to walk the posts without refetching the profile","required":false,"schema":{"type":"string","title":"Cursor"}}]}},"/v1/profile/{username}/videos":{"get":{"operationId":"get_v1_profile_username_videos","summary":"User Videos","description":"Returns a creator's posts newest first: description, cover, play address, duration, publish time, hashtags, the track, and engagement counts.\n\n**Pagination.** Pass the envelope's `cursor` back as `cursor` to continue; when it comes back `null` the catalogue is exhausted. Use `limit` to stop early. Hand the cursor back exactly as it was given - it carries its own position space, `createTimeMs:…` or `rowOffset:…`. A bare number is still accepted and read as `createTimeMs`.\n\n**About the counts.** TikTok rounds play and like counts to three significant digits on listings, at any size, so `statsPrecision` says `approximate`. Comment, share and save counts arrive exact. This is TikTok's rounding, not ours.\n\n`exact=true` is accepted here for compatibility and does nothing; `/v1/video/{video_id}?exact=true` returns unrounded counts for a single post.","tags":["Users"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"username":"khaby.lame","author":{"id":"127905465618821121","username":"khaby.lame","nickname":"Khabane lame","verified":true,"avatarThumb":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?…"},"videos":[{"id":"7678009073421405471","description":"They were there yesterday, I promise 🤨 #learnfromkhaby #comedy ","authorUsername":"khaby.lame","cover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/ocixChxiAKo4E8aBEluAqGPz6AIBA3RNrHEIA~tplv-tiktokx-origin.image?…","originCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/oEODwIAnNfqAF5zxmlQ5FXNRGQKMgAeUeI8qhf~tplv-tiktokx-origin.image?…","dynamicCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/ocixChxiAKo4E8aBEluAqGPz6AIBA3RNrHEIA~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-ve-37c799-sg/ooaQ9xDMQgfRUCNFeNEM8QKGenAXgfwAP4NqIm/?…","width":720,"height":1280,"ratio":"720p","privateItem":false,"createTime":1787675818,"duration":30,"isPhotoPost":false,"hashtags":["learnfromkhaby","comedy"],"music":{"id":"7678009071777139487","title":"original sound","authorName":"Khabane lame","duration":30,"original":true},"stats":{"playCount":55300000,"diggCount":3300000,"commentCount":35500,"shareCount":97200,"collectCount":116392,"repostCount":0},"statsPrecision":"approximate"},{"id":"7675410938970901791","description":"Come back whenever you want bro 💪🏿#learnfromkhaby #comedy ","authorUsername":"khaby.lame","cover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/osIBLZNfaE1qFEA2IlbTRieDAEhEVFEbYVhgIn~tplv-tiktokx-origin.image?…","originCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/ogAAEFZNlhYbDi4uRfbBIDE2AVEWEaFIeqrVIT~tplv-tiktokx-origin.image?…","dynamicCover":"https://p19-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/oUWViIIYDIabTE2lAZFCVdRNeBf5qSEIEjAbEh~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-ve-37c799-sg/oUClQVmYNDAcibLz8IF2ERqgeEZA8BXhIVfBEE/?…","width":720,"height":1280,"ratio":"720p","privateItem":false,"createTime":1787070894,"duration":33,"isPhotoPost":false,"hashtags":["learnfromkhaby","comedy"],"music":{"id":"7675410950337383199","title":"original sound","authorName":"Khabane lame","duration":33,"original":true},"stats":{"playCount":4800000,"diggCount":328400,"commentCount":6427,"shareCount":8148,"collectCount":11802,"repostCount":0},"statsPrecision":"approximate"}],"statsPrecision":"approximate","limitReached":false,"unresolved":[],"extra":{"source":"post_feed","nextCursor":"rowOffset:1787070894791","totalPosts":1350}},"cursor":"rowOffset:1787070894791","hasMore":true}}}},"400":{"description":"`invalid_request` - the cursor is not a position this listing issues","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`user_not_found` - TikTok has no account with that handle","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`listing_unavailable` - the listing came back unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"504":{"description":"`deadline_exceeded` - the request timed out","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"username","in":"path","description":"TikTok handle","required":true,"schema":{"type":"string","title":"Username"}},{"name":"cursor","in":"query","description":"The envelope's cursor from the previous page, handed back as given. A bare number is read as `createTimeMs`. Omit to start at the newest post.","required":false,"schema":{"type":"string","title":"Cursor"}},{"name":"limit","in":"query","description":"Stop after this many posts. Omitted means 60.","required":false,"schema":{"type":"string","title":"Limit"}},{"name":"exact","in":"query","description":"Accepted for compatibility; has no effect.","required":false,"schema":{"type":"boolean","title":"Exact","default":false}}]}},"/v1/profile/{username}/reposts":{"get":{"operationId":"get_v1_profile_username_reposts","summary":"User Reposts","description":"Returns the videos this account has reposted - other people's posts, not its own. Each row carries the same fields as the post listing, and an `authorUsername` naming whoever actually made the video.\n\nPlay and like counts are rounded by TikTok to three significant digits at any size, so rows report `statsPrecision` `approximate`; comment, share and save counts arrive exact.\n\nPaged fifteen at a time. Pass `cursor` from `nextCursor` to continue.","tags":["Users"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"username":"khaby.lame","author":{"id":"127905465618821121","username":"khaby.lame","nickname":"Khabane lame","verified":true,"avatarThumb":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?…"},"reposts":[{"id":"7631024397754600735","description":"KA-CHOW ⚡️ #cars #edit #disney #viral #fyp ","authorUsername":"x0tkin","cover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oMEmLPIAVAAFgEtsHeRw45fRAhDuECAQoAJpIN~tplv-tiktokx-origin.image?…","originCover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oYsjkzEzDeB0MmqFIQBe27AQDfA9FICgECmTbQ~tplv-tiktokx-origin.image?…","dynamicCover":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oMEmLPIAVAAFgEtsHeRw45fRAhDuECAQoAJpIN~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.us.tiktok.com/video/tos/useast5/tos-useast5-ve-0068c799-tx/oYvBpHPAiQAixiAAynBQq0EdeIHYsaIZbiWCUo/?…","width":1280,"height":720,"ratio":"720p","privateItem":false,"createTime":1776736336,"duration":19,"isPhotoPost":false,"hashtags":["cars","edit","disney","viral","fyp"],"music":{"id":"7631024402712316702","title":"original sound","authorName":"x0tkin","duration":19,"original":true},"stats":{"playCount":323600000,"diggCount":40900000,"commentCount":270000,"shareCount":3000000,"collectCount":3389376,"repostCount":0},"statsPrecision":"approximate"},{"id":"7613894743780576542","description":"Please do all the things! #fypシ #fypシ゚viral #foryoupage #cancer #amputee ","authorUsername":"johnnyscholl46_","cover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oA6GppIl9YK9ZTUQRzmjfLAQGeA1LQGgeFsmfQ~tplv-tiktokx-origin.image?…","originCover":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oQBKOGmg0eLfQajeRApTzUmQfdG9pA7iIg9FDX~tplv-tiktokx-origin.image?…","dynamicCover":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oImKpAezUpQC6fGFRjA9QeLIPZ1gRmTQGtQfFo~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-useast8-pve-0068-tx2/o8S5eAGp6ftQSLG9mKgjmgURAQxTFzlIKJpfIe/?…","width":720,"height":1280,"ratio":"720p","privateItem":false,"createTime":1772748035,"duration":73,"isPhotoPost":false,"hashtags":["fypシ","fypシ゚viral","foryoupage","cancer","amputee"],"music":{"id":"7096475339173431297","title":"Our Love Was Beautiful - Instrumental Version","authorName":"Straight White Teeth","duration":233,"original":false},"stats":{"playCount":55000000,"diggCount":12800000,"commentCount":1400000,"shareCount":1200000,"collectCount":1090814,"repostCount":0},"statsPrecision":"approximate"}],"statsPrecision":"approximate","hasMore":true,"nextCursor":2},"cursor":"2","hasMore":true}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`user_not_found` - no account holds that handle","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"username","in":"path","description":"TikTok handle","required":true,"schema":{"type":"string","title":"Username"}},{"name":"limit","in":"query","description":"Stop after this many. Omitted means 90.","required":false,"schema":{"type":"string","title":"Limit"}},{"name":"cursor","in":"query","description":"Resume from a nextCursor","required":false,"schema":{"type":"string","title":"Cursor"}}]}},"/v1/video/{video_id}":{"get":{"operationId":"get_v1_video_video_id","summary":"Video Details","description":"Returns a single post: description, timestamp, media, music, hashtags, mentions, author, and play, like, comment, share, save and repost counts. **Play and like counts are rounded by TikTok to three significant digits** - 11,381 plays are published as 11,400; comment, share and save counts are exact. `exact=true` asks for unrounded counts; `statsPrecision` says which you got, and `exactReason` says why when they could not be had: `not_original_sound` and `not_listed` will not change, `beyond_first_page`, `counts_missing` and `lookup_failed` may on a retry.\n\nPhoto posts are returned too and flagged with `isPhotoPost`; their duration is zero and they carry no play address.\n\nOnly the id is needed - TikTok resolves a post without the handle.\n\n**`playAddr` and `downloadAddr` are not playable on their own.** TikTok's media host refuses requests that do not come from its own pages, so a play address pasted into a player or a download tool will fail. Use `GET /v1/video/{video_id}/stream` to play or download the file.","tags":["Videos"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"id":"7678009073421405471","description":"They were there yesterday, I promise 🤨 #learnfromkhaby #comedy ","createTime":1787675818,"isPhotoPost":false,"images":[],"author":{"id":"127905465618821121","username":"khaby.lame","nickname":"Khabane lame","avatarThumb":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?…","verified":true},"stats":{"playCount":55400000,"diggCount":3300000,"commentCount":35500,"shareCount":97300,"collectCount":116413,"repostCount":0},"media":{"duration":30,"width":720,"height":1280,"ratio":"720p","cover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/ocixChxiAKo4E8aBEluAqGPz6AIBA3RNrHEIA~tplv-tiktokx-origin.image?…","dynamicCover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/ocixChxiAKo4E8aBEluAqGPz6AIBA3RNrHEIA~tplv-tiktokx-origin.image?…","originCover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oEODwIAnNfqAF5zxmlQ5FXNRGQKMgAeUeI8qhf~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c001-tx2/ooaQ9xDMQgfRUCNFeNEM8QKGenAXgfwAP4NqIm/?…","downloadAddr":"https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c003-tx2/oQ6exwugMEiLFNfeAhXQUYGnfF8KqHQIQAAmRN/?…"},"music":{"id":"7678009071777139487","title":"original sound","authorName":"Khabane lame","duration":30,"original":true,"playUrl":"https://v16m.tiktokcdn-us.com/ca83943e083660de769b8efd7866ff6d/6a983cbc/video/tos/useast8/tos-useast8-v-27dcd7-tx2/oACiJKBtiAJVRxN7AE2cBADKo7wEEqAfA1uNRi/?…","coverThumb":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?…"},"hashtags":["learnfromkhaby","comedy"],"mentions":[],"locationCreated":"US","textLanguage":"en","privateItem":false,"isAd":false,"commentsDisabled":false,"statsPrecision":"approximate","extra":{"scheduleTime":0,"warnInfo":[],"originalItem":false,"officalItem":false,"secret":false,"forFriend":false,"digged":false,"takeDown":0,"effectStickers":[],"duetEnabled":true,"stitchEnabled":true,"stickersOnItem":[],"shareEnabled":true,"comments":[],"duetDisplay":0,"stitchDisplay":0,"indexEnabled":true,"diversificationLabels":["Comedy","Performance"],"suggestedWords":["funny videos","comedy","Comedy Videos","Comedy Funny Videos","Comedians On TikTok","comedy stand up","landon and jenna","hilarious funny videos"],"diversificationId":10003,"collected":false,"channelTags":[],"item_control":{"can_repost":true},"IsAigc":false,"AIGCDescription":"","ShowAIGC":true,"backendSourceEventTracking":"","CategoryType":104,"textTranslatable":true,"isReviewing":false,"creatorAIComment":{"hasAITopic":false,"categoryList":[],"eligibleVideo":false,"notEligibleReason":101}},"exactReason":null},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`video_not_found` - TikTok has no such post","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"504":{"description":"`deadline_exceeded` - the request timed out, which `exact=true` makes likelier","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"video_id","in":"path","description":"TikTok video id","required":true,"schema":{"type":"string","title":"Video Id"}},{"name":"handle","in":"query","description":"Author handle. Optional: TikTok resolves the post from the id alone.","required":false,"schema":{"type":"string","title":"Handle"}},{"name":"exact","in":"query","description":"Ask for unrounded play and like counts. Available only for a post using its own original sound; `statsPrecision` says which you got and `exactReason` why not. Slower - typically several seconds.","required":false,"schema":{"type":"boolean","title":"Exact","default":false}}]}},"/v1/video/{video_id}/stream":{"get":{"operationId":"get_v1_video_video_id_stream","summary":"Video Stream file","description":"Streams the post's MP4 through this API.\n\n**Use this rather than the `playAddr` returned by `/v1/video/{video_id}`.** TikTok's media host refuses play addresses requested outside its own pages, so a `playAddr` pasted into a player or a download tool will fail; this endpoint hands back the bytes in the only shape that plays.\n\n`Range` is passed through, so seeking works and a player can start mid-file. Do not store responses: the address behind them expires.","tags":["Videos"],"responses":{"200":{"description":"The envelope with `data` filled in"},"206":{"description":"The requested byte range"},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`video_not_found` - no such post, or a photo post with no video","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` - TikTok would not serve the media; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"video_id","in":"path","description":"TikTok video id","required":true,"schema":{"type":"string","title":"Video Id"}},{"name":"handle","in":"query","description":"Author handle. Optional: TikTok resolves the post from the id alone.","required":false,"schema":{"type":"string","title":"Handle"}},{"name":"download","in":"query","description":"Serve the download address instead, which is the higher-quality file.","required":false,"schema":{"type":"boolean","title":"Download","default":false}},{"name":"Range","in":"header","required":false,"schema":{"type":"string","title":"Range"}}]}},"/v1/videos":{"get":{"operationId":"get_v1_videos","summary":"Multi-video Details","description":"Takes a comma-separated list of post ids and returns them together, which is the cheapest way to enrich a list of ids you already hold. The rows carry all six counts, the publish time, the duration, the track, the hashtags and the mentions.\n\n**Play and like counts are rounded by TikTok** to three significant digits - 527,168 plays are published as 527,200. `/v1/video/{video_id}?exact=true` returns unrounded counts, but only for a post using its own original sound and only one post at a time.\n\nTwenty ids is the ceiling, and a longer list is rejected rather than silently truncated. Repeated ids are fetched and returned once, in the order you sent them.\n\nThe two ways an id can come back without a post are kept apart: `missing` is TikTok saying it holds no such post, and asking again will not change that, while `notFetched` is an id that went unread - the request ran out of time, or TikTok stopped answering part way down the list - and those are worth asking for again.","tags":["Videos"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"videos":[{"id":"7678009073421405471","description":"They were there yesterday, I promise 🤨 #learnfromkhaby #comedy ","createTime":1787675818,"isPhotoPost":false,"images":[],"author":{"id":"127905465618821121","username":"khaby.lame","nickname":"Khabane lame","avatarThumb":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?…","verified":true},"stats":{"playCount":55300000,"diggCount":3300000,"commentCount":35500,"shareCount":97200,"collectCount":116396,"repostCount":0},"media":{"duration":30,"width":720,"height":1280,"ratio":"720p","cover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/ocixChxiAKo4E8aBEluAqGPz6AIBA3RNrHEIA~tplv-tiktokx-origin.image?…","dynamicCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/ocixChxiAKo4E8aBEluAqGPz6AIBA3RNrHEIA~tplv-tiktokx-origin.image?…","originCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/oEODwIAnNfqAF5zxmlQ5FXNRGQKMgAeUeI8qhf~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-ve-37c799-sg/ooaQ9xDMQgfRUCNFeNEM8QKGenAXgfwAP4NqIm/?…","downloadAddr":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-ve-37c799-sg/oQ6exwugMEiLFNfeAhXQUYGnfF8KqHQIQAAmRN/?…"},"music":{"id":"7678009071777139487","title":"original sound","authorName":"Khabane lame","duration":30,"original":true,"playUrl":"https://v45.tiktokcdn-eu.com/0b28203f89e4b38c1587451382874687/6a9939df/video/tos/alisg/tos-alisg-ve-2370c799-sg/oMexOfSbDEaqF0gUrPEOczQmjBVYQ4GA3GJjSC/?…","coverThumb":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?…"},"hashtags":["learnfromkhaby","comedy"],"mentions":[],"locationCreated":null,"textLanguage":"en","privateItem":false,"isAd":false,"commentsDisabled":false,"statsPrecision":"approximate","extra":{"AIGCDescription":"","CategoryType":104,"IsHDBitrate":false,"ShowAIGC":true,"backendSourceEventTracking":"","collected":false,"creatorAIComment":{"eligibleVideo":false,"hasAITopic":false,"notEligibleReason":101},"digged":false,"diversificationId":10003,"duetDisplay":0,"duetEnabled":true,"forFriend":false,"isProhibited":false,"isReviewing":false,"item_control":{"can_repost":true},"officalItem":false,"originalItem":false,"penaltyContext":{"arb_content_safety_status":102,"display_penalty_type":0,"display_policy":0,"display_ui_type":0,"ec_global_verdict":1,"reviewed":1,"status":102,"tns_status":102,"video_status":10},"secret":false,"shareEnabled":true,"stitchDisplay":0,"stitchEnabled":true,"textTranslatable":true},"exactReason":null},{"id":"7675410938970901791","description":"Come back whenever you want bro 💪🏿#learnfromkhaby #comedy ","createTime":1787070894,"isPhotoPost":false,"images":[],"author":{"id":"127905465618821121","username":"khaby.lame","nickname":"Khabane lame","avatarThumb":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?…","verified":true},"stats":{"playCount":4800000,"diggCount":328400,"commentCount":6427,"shareCount":8148,"collectCount":11804,"repostCount":0},"media":{"duration":33,"width":720,"height":1280,"ratio":"720p","cover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/osIBLZNfaE1qFEA2IlbTRieDAEhEVFEbYVhgIn~tplv-tiktokx-origin.image?…","dynamicCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/oUWViIIYDIabTE2lAZFCVdRNeBf5qSEIEjAbEh~tplv-tiktokx-origin.image?…","originCover":"https://p19-common-sign.tiktokcdn-eu.com/tos-useast8-p-0068-tx2/ogAAEFZNlhYbDi4uRfbBIDE2AVEWEaFIeqrVIT~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-ve-37c799-sg/oUClQVmYNDAcibLz8IF2ERqgeEZA8BXhIVfBEE/?…","downloadAddr":"https://v16-webapp-prime.tiktok.com/video/tos/alisg/tos-alisg-ve-37c799-sg/oIqUQJ8EADETZABLmElBfF32lEVbNIbYRIhVfg/?…"},"music":{"id":"7675410950337383199","title":"original sound","authorName":"Khabane lame","duration":33,"original":true,"playUrl":"https://v16m.tiktokcdn-eu.com/f7a5be544ccd6b2bc9100b9b1a6cfa9b/6a9939e3/video/tos/alisg/tos-alisg-ve-2370c799-sg/oYEJzuMFiGRKzKDwBAffFcCVImI5LPjvEIhqrU/?…","coverThumb":"https://p16-common-sign.tiktokcdn-eu.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:100:100.jpeg?…"},"hashtags":["learnfromkhaby","comedy"],"mentions":[],"locationCreated":null,"textLanguage":"en","privateItem":false,"isAd":false,"commentsDisabled":false,"statsPrecision":"approximate","extra":{"AIGCDescription":"","CategoryType":104,"IsHDBitrate":false,"ShowAIGC":false,"backendSourceEventTracking":"","collected":false,"creatorAIComment":{"eligibleVideo":false,"hasAITopic":false,"notEligibleReason":101},"digged":false,"diversificationId":10003,"duetDisplay":0,"duetEnabled":true,"forFriend":false,"isProhibited":false,"isReviewing":false,"item_control":{"can_repost":true},"officalItem":false,"originalItem":false,"penaltyContext":{"arb_content_safety_status":102,"display_penalty_type":0,"display_policy":0,"display_ui_type":0,"ec_global_verdict":1,"reviewed":1,"status":102,"tns_status":102,"video_status":10},"secret":false,"shareEnabled":true,"stitchDisplay":0,"stitchEnabled":true,"textTranslatable":true},"exactReason":null}],"requested":2,"missing":[],"notFetched":[],"statsPrecision":"approximate"},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - more than twenty ids, or an id that is not a post id","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - TikTok answered with something unusable, or refused before a single post could be read. A refusal part way through answers 200 with the rest of the ids in `notFetched`.","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"504":{"description":"`deadline_exceeded` - the request timed out before any post could be read. A timeout part way through answers 200 with the rest of the ids in `notFetched`.","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"ids","in":"query","description":"Comma-separated post ids, at most twenty","required":true,"schema":{"type":"string","title":"Ids"}}]}},"/v1/video/{video_id}/comments":{"get":{"operationId":"get_v1_video_video_id_comments","summary":"Video Comments","description":"Returns the comments on a post - text, author, timestamp, and like and reply counts.\n\nPaged twenty at a time. Pass `cursor` from `nextCursor` to continue.","tags":["Videos"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"videoId":"7678376901903207700","total":71,"comments":[{"id":"7680894976251773718","text":"i draw one of Ur cat u like it?😄,and i stayed soo much do to IT 🥹","createTime":1788347757,"likeCount":0,"replyCount":0,"author":{"id":"7221840598537602075","username":"nudautaptap2","nickname":"SμpE¢-💽💿","avatarThumb":"https://p16-common-sign.tiktokcdn-eu.com/tos-no1a-avt-0068c001-no/31472d03ae95d62de668faf323ee7d86~tplv-tiktokx-cropcenter:100:100.jpg?…"}},{"id":"7679191486155883286","text":"is my cat cute","createTime":1787951122,"likeCount":50,"replyCount":6,"author":{"id":"7588134865825498134","username":"makaroon102","nickname":"M.","avatarThumb":"https://p16-common-sign.tiktokcdn-eu.com/tos-no1a-avt-0068c001-no/97f5e976b12b008bf2914624b22fa6aa~tplv-tiktokx-cropcenter:100:100.jpg?…"}}],"hasMore":true,"nextCursor":3},"cursor":"3","hasMore":true}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - TikTok answered with something unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"video_id","in":"path","description":"Numeric post id","required":true,"schema":{"type":"string","title":"Video Id"}},{"name":"limit","in":"query","description":"Stop after this many. Omitted means 60.","required":false,"schema":{"type":"string","title":"Limit"}},{"name":"cursor","in":"query","description":"Resume from a nextCursor","required":false,"schema":{"type":"string","title":"Cursor"}}]}},"/v1/video/{video_id}/comments/{comment_id}/replies":{"get":{"operationId":"get_v1_video_video_id_comments_comment_id_replies","summary":"Video Comment Replies","description":"Returns the replies to one comment - the thread beneath it - with the same fields as a top-level comment.\n\nPaged twenty at a time. Pass `cursor` from `nextCursor` to continue.","tags":["Videos"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"videoId":"7678376901903207700","commentId":"7679191486155883286","total":6,"replies":[{"id":"7679408151821255446","text":"BRUH I HAVE THE EXACT SAME CAT","createTime":1788001570,"likeCount":4,"replyCount":null,"author":{"id":"7407057449414493217","username":"patron_sk67","nickname":"patron_sk67","avatarThumb":"https://p16-common-sign.tiktokcdn-eu.com/tos-no1a-avt-0068c001-no/f52dec8894ac29c5e05e2c89c3f6a7cd~tplv-tiktokx-cropcenter:100:100.jpg?…"}},{"id":"7679911091987727107","text":"YEASSS ITS SOOO CUREEEE :3","createTime":1788118657,"likeCount":1,"replyCount":null,"author":{"id":"7519610297532695584","username":"lola.milliken","nickname":"Lola 💖🐾","avatarThumb":"https://p16-common-sign.tiktokcdn-eu.com/tos-no1a-avt-0068c001-no/d7ffec341e35fa44194971e8e925ae6b~tplv-tiktokx-cropcenter:100:100.jpg?…"}}],"hasMore":true,"nextCursor":3},"cursor":"3","hasMore":true}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - TikTok answered with something unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"video_id","in":"path","description":"Numeric post id","required":true,"schema":{"type":"string","title":"Video Id"}},{"name":"comment_id","in":"path","description":"Parent comment id","required":true,"schema":{"type":"string","title":"Comment Id"}},{"name":"limit","in":"query","description":"Stop after this many. Omitted means 40.","required":false,"schema":{"type":"string","title":"Limit"}},{"name":"cursor","in":"query","description":"Resume from a nextCursor","required":false,"schema":{"type":"string","title":"Cursor"}}]}},"/v1/user/{user_id}/handle":{"get":{"operationId":"get_v1_user_user_id_handle","summary":"User ID to Username handle","description":"Turns a TikTok user id into the @handle. Useful when a dataset carries ids but every other endpoint here takes handles.","tags":["Lookup"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"userId":"127905465618821121","username":"khaby.lame"},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`not_found` - no account resolves from that id","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"user_id","in":"path","description":"Numeric TikTok user id","required":true,"schema":{"type":"string","title":"User Id"}}]}},"/v1/profile/{username}/live":{"get":{"operationId":"get_v1_profile_username_live","summary":"Check User Live Status","description":"Reports whether the account is broadcasting at this moment, and when it is, the room id, title, cover, viewer count and start time - alongside the identity fields and exact follower counts that come with it.\n\n`isLive` follows the room's own state rather than the presence of a room id: a room id survives the broadcast that created it, so an account that streamed once years ago still carries one. Everything describing the broadcast is returned only while it is on air, so a stale title or viewer count is never published as current.\n\nMuch cheaper than `/v1/profile/{username}` when all you need is followers, `secUid` or live state. Answers are never more than thirty seconds old.","tags":["Lookup"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"username":"khaby.lame","userId":"127905465618821121","secUid":"MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA","nickname":"Khabane lame","verified":true,"isLive":false,"roomId":null,"title":null,"coverUrl":null,"viewerCount":null,"startedAt":null,"followerCount":null,"followingCount":null,"statsPrecision":"exact"},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`user_not_found` - no account holds that handle","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"username","in":"path","description":"TikTok handle","required":true,"schema":{"type":"string","title":"Username"}}]}},"/v1/hashtag/{name}":{"get":{"operationId":"get_v1_hashtag_name","summary":"Hashtag Details","description":"Returns the hashtag's own numbers - **exact** total views and total posts - together with a page of the posts TikTok lists for it.\n\n**The posts are TikTok's ranking for the tag, not a strict membership list.** Roughly half the rows on a popular tag carry the tag itself; the rest carry adjacent tags. TikTok's own tag page shows the same rows.\n\n**A tag's figures and its posts do not always agree** on whether a tag can be read. Some tags have real, readable figures while TikTok refuses their post listing; those answer with the tag, an empty `videos` list and `videosAvailable: false`. It is not a size ceiling - `#fyp` answers normally with billions of posts. A tag nobody holds is a 404, and an outage is an error rather than an empty list.\n\nCounts on the posts are rounded by TikTok above roughly a hundred thousand. `/v1/video/{video_id}?exact=true` returns unrounded counts, but only for a post using its own original sound.\n\n`cursor` is opaque - hand back whatever the previous response gave; a page of thirty can carry a few more or fewer rows, so it is not a row count. `dropped` reports rows that arrived unreadable, so a short page is never silently short.\n\n`related=true` adds the tags TikTok itself lists as related, with their own exact counts. Slower.","tags":["Hashtag"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"hashtag":{"id":"229207","name":"fyp","description":null,"cover":null,"viewCount":127154031065317,"videoCount":9257637857,"isCommerce":false,"statsPrecision":"exact"},"videos":[{"id":"7321550193646652718","description":"😂😂😂😂 #fyp #fypシ #foryou #foryoupage #trending #viral #xyzbca ","authorUsername":"eliansosa_03","cover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/owPzIEBtN5BWaztBO4gIXiUM3kbIBZUENdZAi~tplv-tiktokx-origin.image?…","originCover":"https://p19-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/fcc1f4596a564046afb250c208239180_1704681275~tplv-tiktokx-origin.image?…","dynamicCover":"https://p19-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/218150ee875741b5b6d8434ed9a44b61_1704681276~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.us.tiktok.com/video/tos/useast5/tos-useast5-ve-0068c003-tx/oMIBXZiEbNr5IGAUqgd4BNUlYPZtE0MFiBQ3P/?…","width":576,"height":1024,"ratio":"540p","privateItem":false,"createTime":1704681274,"duration":8,"isPhotoPost":false,"hashtags":["fyp","fypシ","foryou","foryoupage","trending","viral","xyzbca"],"music":{"id":"7206312709393025834","title":"original sound","authorName":"jjsenior23","duration":8,"original":true},"stats":{"playCount":13500000,"diggCount":2500000,"commentCount":9133,"shareCount":72200,"collectCount":192531,"repostCount":0},"statsPrecision":"approximate"},{"id":"7638767614868737310","description":"#fypシ゚viral ","authorUsername":"glittergrenadexo","cover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/oEFnrSzqAAQoEWdDEful0RWBV4CfIPx9EucAID~tplv-tiktokx-origin.image?…","originCover":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/ocsEnrD4FOWdAWCqDRQcABoEufxIIVBfAqlu4E~tplv-tiktokx-origin.image?…","dynamicCover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/ogXQQ4L7Pdq7fsFEIDGAQOBfjdUAtCAICLIjeX~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.us.tiktok.com/video/tos/useast8/tos-useast8-ve-0068c004-tx2/oIVoAczRWIuxEWuEEqlA9nDfFdfQABsDgEZCYU/?…","width":720,"height":1280,"ratio":"720p","privateItem":false,"createTime":1778539196,"duration":16,"isPhotoPost":false,"hashtags":["fypシ゚viral"],"music":{"id":"7522912028060240671","title":"original sound","authorName":"Gmazgul","duration":15,"original":true},"stats":{"playCount":17000000,"diggCount":3700000,"commentCount":19500,"shareCount":429300,"collectCount":187876,"repostCount":0},"statsPrecision":"approximate"}],"statsPrecision":"approximate","videosAvailable":true,"hasMore":true,"nextCursor":2,"dropped":0,"relatedHashtags":[],"relatedAvailable":true},"cursor":2,"hasMore":true}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`not_found` - TikTok has no hashtag by that name","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - TikTok answered with something unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"504":{"description":"`deadline_exceeded` - the request timed out","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"name","in":"path","description":"Hashtag without the # sign","required":true,"schema":{"type":"string","title":"Name"}},{"name":"related","in":"query","description":"Also return the tags TikTok lists as related. Slower.","required":false,"schema":{"type":"boolean","title":"Related","default":false}},{"name":"limit","in":"query","description":"How many posts to return.","required":false,"schema":{"type":"integer","title":"Limit","default":30}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response.","required":false,"schema":{"type":"string","title":"Cursor"}}]}},"/v1/music/{music_id}":{"get":{"operationId":"get_v1_music_music_id","summary":"Music Details","description":"Returns a track's own details together with the posts using it.\n\nOnly the numeric id is needed. The slug that appears in a TikTok music URL is decoration and is ignored.\n\nPagination is by row offset: pass the `cursor` from the previous response back to continue. `cursorSpace` on the body names the unit, because the post listings on this API count in milliseconds under the same field name. A response with `hasMore` false and no cursor means this walk reached the end.\n\n`limit` is a floor, not a ceiling: TikTok serves this listing a whole page at a time, so a response can carry more posts than it asks for.\n\nPlay and like counts here are exact. A track TikTok will not list is an error rather than a partial body.","tags":["Music"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"music":{"id":"7678009071777139487","artist":"Khabane lame","cover":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.webp?…","videoCount":null,"title":"original sound - khaby.lame"},"videos":[{"id":"7678009073421405471","description":"They were there yesterday, I promise 🤨 #learnfromkhaby #comedy ","authorUsername":"khaby.lame","cover":"https://p16-common-sign.tiktokcdn.com/tos-useast8-p-0068-tx2/ocixChxiAKo4E8aBEluAqGPz6AIBA3RNrHEIA~tplv-tiktokx-cropcenter:300:400.webp?…","originCover":"https://p16-common-sign.tiktokcdn.com/tos-useast8-p-0068-tx2/oEODwIAnNfqAF5zxmlQ5FXNRGQKMgAeUeI8qhf~tplv-tiktokx-360p.webp?…","dynamicCover":"https://p19-common-sign.tiktokcdn.com/tos-useast8-p-0068-tx2/ocixChxiAKo4E8aBEluAqGPz6AIBA3RNrHEIA~tplv-tiktokx-origin.image?…","playAddr":"https://v16m-default.tiktokcdn.com/8f45675154c6392feaf40f775a873887/6a983cc2/video/tos/alisg/tos-alisg-ve-37c799-sg/ooaQ9xDMQgfRUCNFeNEM8QKGenAXgfwAP4NqIm/?…","width":1080,"height":1920,"ratio":"720p","privateItem":false,"createTime":1787675818,"duration":31,"isPhotoPost":false,"hashtags":["learnfromkhaby"],"music":{"id":"7678009071777139487","title":"original sound - khaby.lame","authorName":"Khabane lame","duration":30,"original":false},"stats":{"playCount":55356185,"diggCount":3304396,"commentCount":35488,"shareCount":97254,"collectCount":116413,"repostCount":0},"statsPrecision":"exact"},{"id":"7678029944315841812","description":"#islamabad #foryoupage #🦋🎀🐰🌍🔐 #inziboxer75 ","authorUsername":"inziboxer75","cover":"https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0037/oYIYYOXiav2EpBaVuMS5PAIcN4oCIA3SB1iWp~tplv-tiktokx-cropcenter:300:400.webp?…","originCover":"https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0037/ooA4IiaVVoYYB1BASXyaNIEBoom32MWcFIiv5~tplv-tiktokx-360p.webp?…","dynamicCover":"https://p16-common-sign.tiktokcdn.com/tos-alisg-p-0037/owQDqjDwfwydEBsQymIBsqnAEUczb4CQ0gfFRr~tplv-tiktokx-origin.image?…","playAddr":"https://v16m-default.tiktokcdn.com/02c174511f64b7ce14aa3435d3959780/6a983caf/video/tos/alisg/tos-alisg-pve-0037c001/oYaNvAic6IYoIBXYC5iVSiWMEE1aBMrA3l4WF/?…","width":1080,"height":1920,"ratio":"540p","privateItem":false,"createTime":1787680666,"duration":11,"isPhotoPost":false,"hashtags":["islamabad"],"music":{"id":"7678009071777139487","title":"original sound - khaby.lame","authorName":"Khabane lame","duration":30,"original":false},"stats":{"playCount":8495,"diggCount":919,"commentCount":62,"shareCount":3,"collectCount":24,"repostCount":0},"statsPrecision":"exact"}],"statsPrecision":"exact","limitReached":false,"hasMore":true,"nextCursor":18,"cursorSpace":"rowOffset"},"cursor":"18","hasMore":true}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`listing_unavailable` - TikTok refused this track, or listed no posts for it; `upstream_unavailable` or `parse_error` - TikTok answered with something unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"music_id","in":"path","description":"Numeric TikTok music id","required":true,"schema":{"type":"string","title":"Music Id"}},{"name":"limit","in":"query","description":"How many posts to collect before stopping. A whole page is served, so the response can carry more.","required":false,"schema":{"type":"integer","title":"Limit","default":30}},{"name":"cursor","in":"query","description":"Row offset from a previous response's cursor. Omitted starts at the beginning.","required":false,"schema":{"type":"string","title":"Cursor"}}]}},"/v1/effect/{effect_id}":{"get":{"operationId":"get_v1_effect_effect_id","summary":"Effect Details","description":"Returns the effect's name, owner and icon, together with two counts nothing else on the public web reports: how many posts have used it and how many times those posts were played.\n\nBoth counts are unrounded.","tags":["Effect"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"id":"3680594","name":"makeup x arda","description":null,"icon":"https://lf16-effectcdn-sg.tiktokcdn.com/obj/ies.fe.effect.alisg/acb65abb9b97f1f6b95c8fa788ab37e8","videoCount":70677056,"viewCount":3296788543,"ownerId":"6798888265934242822","ownerNickname":"ardabberk","ownerSecUid":"MS4wLjABAAAAgSMElgdNGtXJwqLSfP3QB8rCXWk0w-uy4M9IIwhLpCek1A8fjn7ITRp15UZwwjDS","publishedAt":1663402522000,"tags":[]},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`not_found` - TikTok has no effect with that id","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - TikTok answered with something unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"effect_id","in":"path","description":"Numeric effect id","required":true,"schema":{"type":"string","title":"Effect Id"}}]}},"/v1/effect/{effect_id}/videos":{"get":{"operationId":"get_v1_effect_effect_id_videos","summary":"Effect Videos","description":"Walks the posts that use an effect, newest first.\n\nThe counts on these rows are **exact** - a post that reads 648,000 on a web listing reads 648,086 here.\n\n`cursor` is the row offset the previous response handed back; pass it to continue. `dropped` reports rows that arrived unreadable, so a short page is never silently short.","tags":["Effect"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"effectId":"3680594","videos":[{"id":"7147390968294083841","description":"Geçen hafta yapmıştım #fyp #kesfet #kesfetteyiz #kesfetbeniöneçıkart ","authorUsername":"ardabberk","cover":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/fb9b9e30899e4a33b0fa6b0ebe142a44~tplv-tiktokx-cropcenter:300:400.jpeg?…","originCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/0ecb8003bc8e424ea53d06dde3e05e4a_1664131653~tplv-tiktokx-360p.jpeg?…","dynamicCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-alisg-p-0037/2f9a76d13f014322ad62d1aa927763c9_1664131653~tplv-tiktokx-origin.image?…","playAddr":"https://v16-web-newkey.tiktokcdn.com/4d762edc352864aa4d51c61973d88764/6a9868ff/video/tos/alisg/tos-alisg-pve-0037c001/f06d8ac5a4334480ad2ae565f47465ee/?…","width":720,"height":1280,"ratio":"540p","privateItem":false,"createTime":1664131651,"duration":5,"isPhotoPost":false,"hashtags":["fyp"],"music":{"id":"7138043964936259585","title":"UNUTTUM","authorName":"UZI","duration":60,"original":false},"stats":{"playCount":648730,"diggCount":5418,"commentCount":82,"shareCount":704,"collectCount":660,"repostCount":0},"statsPrecision":"exact"},{"id":"7532208700942077190","description":"MY FAV DANCE !! ","authorUsername":"maligoshik","cover":"https://p16-common-sign.tiktokcdn-eu.com/tos-maliva-p-0068/oscjnDEEvA0Q3PSeIsftjMgIDfA9FCAvTEAR4Q~tplv-tiktokx-cropcenter:300:400.jpeg?…","originCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-maliva-p-0068/osJqEEDDgfpjAQQfRaQUBIFKICCPS4fjCjCcDA~tplv-tiktokx-360p.image?…","dynamicCover":"https://p16-common-sign.tiktokcdn-eu.com/tos-maliva-p-0068/oscjnDEEvA0Q3PSeIsftjMgIDfA9FCAvTEAR4Q~tplv-tiktokx-origin.image?…","playAddr":"https://v16-web-newkey.tiktokcdn.com/2d05fa162d55b96ecf91d02f5de0b620/6a986906/video/tos/alisg/tos-alisg-ve-0068c800-sg/oYBRDgDCQCCEDEpjfIAgIXcFQ4PJUcjffFEjSj/?…","width":1080,"height":1920,"ratio":"540p","privateItem":false,"createTime":1753729007,"duration":12,"isPhotoPost":false,"hashtags":[],"music":{"id":"7515079524474112017","title":"ACELERADA","authorName":"sma$her & MXZI","duration":58,"original":false},"stats":{"playCount":30273607,"diggCount":2916428,"commentCount":5854,"shareCount":32084,"collectCount":152544,"repostCount":0},"statsPrecision":"exact"}],"statsPrecision":"exact","hasMore":false,"nextCursor":null,"dropped":0},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - TikTok answered with something unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"504":{"description":"`deadline_exceeded` - the request timed out","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"effect_id","in":"path","description":"Numeric effect id","required":true,"schema":{"type":"string","title":"Effect Id"}},{"name":"limit","in":"query","description":"How many posts to return.","required":false,"schema":{"type":"integer","title":"Limit","default":30}},{"name":"cursor","in":"query","description":"Row offset from a previous response.","required":false,"schema":{"type":"string","title":"Cursor"}}]}},"/v1/place/{place_id}":{"get":{"operationId":"get_v1_place_place_id","summary":"Place Details","description":"Returns TikTok's own record for a place - its name, category and address - together with how many posts it holds.\n\nAddress fields arrive sparse: a city carries a country and little between, and a missing field is null rather than an empty string.","tags":["Place"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"id":"22535865206759585","name":"Bursa","address":"Turkey","city":null,"province":null,"country":null,"category":"City","videoCount":6246248},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"404":{"description":"`not_found` - TikTok has no place with that id","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - TikTok answered with something unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"place_id","in":"path","description":"Numeric place id","required":true,"schema":{"type":"string","title":"Place Id"}}]}},"/v1/place/{place_id}/videos":{"get":{"operationId":"get_v1_place_place_id_videos","summary":"Place Videos","description":"Walks the posts filmed at a place, newest first. Every row carries that place's id, so this is a geographic query rather than a feed of whatever is nearby.\n\nCounts on these rows are **approximate**: TikTok rounds plays and likes above roughly a hundred thousand on listings. Ask `/v1/video/{video_id}` for a real number.\n\n`cursor` is opaque - hand back whatever the previous response gave. `dropped` reports rows that arrived unreadable, so a short page is never silently short.","tags":["Place"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"placeId":"22535865206759585","videos":[{"id":"7655371533199740168","description":"Turkish kokoreç midye 😀😀 ","authorUsername":"melikeonurofficial_","cover":"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/ogdr8AAWoBGMffu6JFXQAfMBR9AGmGAQIf8HwV~tplv-tiktokx-origin.image?…","originCover":"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/oosqUxcDZAWkCR06gIFdPWcDOf2meEVEBEBw9I~tplv-tiktokx-origin.image?…","dynamicCover":"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/ogdr8AAWoBGMffu6JFXQAfMBR9AGmGAQIf8HwV~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.us.tiktok.com/video/tos/alisg/tos-alisg-pve-0037c001/ooCBDcq2hsRMEOsEFVAh7QID6gycPt9B6IfeUk/?…","width":576,"height":1024,"ratio":"540p","privateItem":false,"createTime":1782405090,"duration":137,"isPhotoPost":false,"hashtags":[],"music":{"id":"7655371590070323988","title":"orijinal ses","authorName":"Melikeonur0","duration":137,"original":true},"stats":{"playCount":48900000,"diggCount":6900000,"commentCount":35600,"shareCount":349100,"collectCount":263471,"repostCount":0},"statsPrecision":"approximate"},{"id":"7675077785630575879","description":"Neden mi onu seçtim ?♥️","authorUsername":"melikeonurofficial_","cover":"https://p16-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/owAMDF71ogApDWUkRfAB10EggUEKBekQRqcVQW~tplv-tiktokx-origin.image?…","originCover":"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/oMfREsGERUAf7ocWtgE1rQQgQAAqVgDbN1TBFB~tplv-tiktokx-origin.image?…","dynamicCover":"https://p19-common-sign.tiktokcdn-us.com/tos-alisg-p-0037/o4faoopya1ATIwi2WK9iACABAuLrQIID0wqADA~tplv-tiktokx-origin.image?…","playAddr":"https://v16-webapp-prime.us.tiktok.com/video/tos/alisg/tos-alisg-pve-0037c001/oAfArRFrGAVAs5etAJI1CLBIjDUGAARorgeU2i/?…","width":576,"height":1024,"ratio":"540p","privateItem":false,"createTime":1786993308,"duration":12,"isPhotoPost":false,"hashtags":[],"music":{"id":"7628093017374739231","title":"original sound","authorName":"⃟","duration":18,"original":true},"stats":{"playCount":39900000,"diggCount":6400000,"commentCount":33500,"shareCount":420800,"collectCount":206779,"repostCount":0},"statsPrecision":"approximate"}],"statsPrecision":"approximate","hasMore":true,"nextCursor":6398892,"dropped":0},"cursor":6398892,"hasMore":true}}}},"400":{"description":"`invalid_request` - a parameter failed validation, or `unsupported_option`","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - TikTok answered with something unusable","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"504":{"description":"`deadline_exceeded` - the request timed out","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"place_id","in":"path","description":"Numeric place id","required":true,"schema":{"type":"string","title":"Place Id"}},{"name":"limit","in":"query","description":"How many posts to return.","required":false,"schema":{"type":"integer","title":"Limit","default":30}},{"name":"cursor","in":"query","description":"Opaque cursor from a previous response.","required":false,"schema":{"type":"string","title":"Cursor"}}]}},"/v1/trending":{"get":{"operationId":"get_v1_trending","summary":"Trending Videos","description":"Returns the posts TikTok publishes as top performing for a country and period, with their author, follower count, and engagement figures.\n\n**These metrics are not available anywhere else on this API.** Engagement rate and six-second view-through are advertising measures; ordinary post payloads do not carry them.\n\n**Limits, stated rather than discovered.** A hundred posts per country and period is the whole list. Only the United States is available; other countries are refused rather than answered with an empty list.\n\n`period` is `daily`, `weekly` or `monthly`.","tags":["Trending"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"country":"US","period":"weekly","videos":[{"id":"7665337718389345567","description":"When my boyfriend coughs 🙄 Tag your partner if you can relate. #galaxyzfold8ultra #samsungpartner #exploregalaxy  @Samsung ","createTime":1784725546,"cover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast8-p-0068-tx2/osCfE7FnALVpvvPgEADAIAYuROqAwCBEAMEwfb~tplv-tiktokx-origin.image?…","playAddr":"https://v16m-default.tiktokcdn-us.com/938797b110ca409fdf2696e2e435d64a/6a983cda/video/tos/useast8/tos-useast8-pve-0068-tx2/oQGUfy6UFAbpgj3MAQXawgqMp8evfkXQIIC7BI/?…","author":{"id":"6852469834286891014","username":"hannahstocking","nickname":"Hannah Stocking","bio":"This giving 4th, let&#39;s spread kindness ❤️\nhttps://america250.org/giving4th/","avatar":"https://p19-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/c7ef8dfca24ef39d0d6378d9c1f49295~tplv-tiktokx-cropcenter:300:300.jpeg?…","followerCount":29586320},"metrics":{"videoViews":231420398,"organicVideoViews":28800814,"engagementRate":0.008258191656899665,"sixSecondsViewRate":0.3589811141929918},"organic":true},{"id":"7675054241660062989","description":"#BlueBuffaloPartner Wiley is 8 years old and somehow still has more energy than I do. From mountain summits to snowy adventures, I'm so grateful that BLUE Wilderness helps fuel his active lifestyle with high protein ingredients. ❤️🐺 @Blue Buffalo #BlueBuffalo #BlueWilderness #DogTok #AdventureDog   ","createTime":1786987847,"cover":"https://p16-common-sign.tiktokcdn-us.com/tos-useast5-p-0068-tx/ocROyDLoA22IsIUq50SFETOgIBAf9wqDtgDREf~tplv-tiktokx-origin.image?…","playAddr":"https://v16m-default.tiktokcdn-us.com/547404947ef27b70a7962f1874798cd8/6a983cca/video/tos/useast5/tos-useast5-pve-0068-tx/oMAGHIvVkIXgWjfImyGeCLiBkG9ReoQtZVdQBA/?…","author":{"id":"6959381426420580357","username":"pnwsally","nickname":"Wiley the Husky","bio":"Wiley the Husky 🐾🐺\nOregon 🏕🌄\n\nPNWsally@gmail.com ✉️","avatar":"https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/7314928235756650501~tplv-tiktokx-cropcenter:300:300.jpeg?…","followerCount":243334},"metrics":{"videoViews":34181165,"organicVideoViews":15630451,"engagementRate":0.0011210267408966312,"sixSecondsViewRate":0.020676453545949658},"organic":true}],"advertisedTotal":100},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - that country or period is not available","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - the ranking refused or answered unusably","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"country","in":"query","description":"Country code. Available today: US.","required":false,"schema":{"type":"string","title":"Country","default":"US"}},{"name":"period","in":"query","description":"Window the ranking covers.","required":false,"schema":{"type":"string","enum":["daily","weekly","monthly"],"title":"TrendingPeriod"}},{"name":"limit","in":"query","description":"How many posts to return.","required":false,"schema":{"type":"integer","title":"Limit","default":20}}]}},"/v1/trending/hashtags":{"get":{"operationId":"get_v1_trending_hashtags","summary":"Trending Hashtags","description":"Returns the hashtags TikTok publishes as trending, with how many posts carry them, how many views they have drawn, TikTok's own daily popularity curve, and the creators driving them.\n\n**Creators come with real user ids**, so a caller can pass one straight to `/v1/profile/{username}` rather than searching by name.\n\n**Covers 27 countries**, including ones the video ranking does not - Turkey among them. Three tags per country and period is the whole list.\n\n`period` is 7, 30 or 120 days. Other values are refused.","tags":["Trending"],"responses":{"200":{"description":"The envelope with `data` filled in","content":{"application/json":{"schema":{"type":"object","description":"Every answer, success or failure, has this shape.","required":["success","data","cursor","hasMore"],"properties":{"success":{"type":"boolean"},"data":{"description":"The endpoint's payload on success, `null` on failure. Its shape is shown in each endpoint's example.","oneOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"cursor":{"description":"Hand back as `cursor` to fetch the next page; `null` when there is none.","oneOf":[{"type":"string"},{"type":"integer"},{"type":"null"}]},"hasMore":{"type":"boolean","description":"Whether a further page exists."}}},"example":{"success":true,"data":{"country":"US","periodDays":7,"hashtags":[{"id":"2534","name":"dollyparton","rank":1,"postCount":360001,"viewCount":2066932410,"industryIds":["23000000000"],"creators":[{"id":"6739867522710406149","username":"dailymail","nickname":"Daily Mail","avatar":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/d286fcc626ea9c7ce367e74b5ad5305f~tplv-tiktokx-cropcenter:300:300.jpeg?…","followerCount":26660687,"rank":1},{"id":"7623484208371188749","username":"deja.was.here","nickname":"Deja was here 👆🏽","avatar":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/988c6ba5d613819a7afd54677312f77a~tplv-tiktokx-cropcenter:300:300.jpeg?…","followerCount":11686,"rank":2}],"popularity":[{"timestamp":1787616000,"value":72.82286186619916},{"timestamp":1787702400,"value":100}]},{"id":"72928","name":"dolly","rank":2,"postCount":102094,"viewCount":393762418,"industryIds":["23000000000"],"creators":[{"id":"6815259133110305798","username":"kymjax","nickname":"Kym","avatar":"https://p19-common-sign.tiktokcdn.com/tos-maliva-avt-0068/b69b260543b1a6d5b22b2fa0fd204c85~tplv-tiktokx-cropcenter:300:300.jpeg?…","followerCount":36639,"rank":1},{"id":"7646223339343021069","username":"alyssaromero09","nickname":"alyssa","avatar":"https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/d98e1a0daafd1ab9ddc4cf0568b4363a~tplv-tiktokx-cropcenter:300:300.jpeg?…","followerCount":1762,"rank":2}],"popularity":[{"timestamp":1787616000,"value":56.103998145188946},{"timestamp":1787702400,"value":100}]}]},"cursor":null,"hasMore":false}}}},"400":{"description":"`invalid_request` - that country or period is not covered","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}},"example":{"success":false,"data":null,"cursor":null,"hasMore":false,"error":{"code":"invalid_request","message":"request parameters failed validation","details":{"fields":[{"field":"path.username","reason":"String should match pattern '^@?[A-Za-z0-9._]{1,24}$'"}]}}}}}},"429":{"description":"`quota_exceeded` - your allowance is used up, or `rate_limited` - TikTok is throttling; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"502":{"description":"`upstream_unavailable` or `parse_error` - the ranking answered unusably","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}},"503":{"description":"`upstream_recovering` or `challenge_detected` - TikTok is temporarily unavailable; retry later","content":{"application/json":{"schema":{"type":"object","description":"A failed answer: the envelope with `data: null` and an `error`.","required":["success","data","cursor","hasMore","error"],"properties":{"success":{"type":"boolean","const":false},"data":{"type":"null"},"cursor":{"type":"null"},"hasMore":{"type":"boolean","const":false},"error":{"type":"object","required":["code","message","details"],"properties":{"code":{"type":"string","description":"Stable; branch on this, never on `message`."},"message":{"type":"string","description":"Human-readable, may change."},"details":{"type":"object","additionalProperties":true,"description":"Structured context, for example `fields` on `invalid_request`."}}}}}}}}},"parameters":[{"name":"country","in":"query","description":"Two-letter country code; 27 are covered.","required":false,"schema":{"type":"string","title":"Country","default":"US"}},{"name":"period","in":"query","description":"Window in days: 7, 30 or 120.","required":false,"schema":{"type":"integer","title":"Period","default":7}},{"name":"limit","in":"query","description":"How many tags to return.","required":false,"schema":{"type":"integer","title":"Limit","default":10}}]}}},"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"X-JoJAPI-Key","description":"Your JoJ API key."}}}}