Creator intelligence
Track public creator profiles, posting history, engagement, sounds, and hashtags without stitching together unrelated providers.
Sixteen read-only endpoints for videos, creators, comments, music, hashtags, and search. HTTP-first, bounded by design, and independent of the official TikTok API or paid data providers.
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/videos/info?url=https%3A%2F%2Fwww.tiktok.com%2F%40sophiegamergirl%2Fvideo%2F7658435999478992148&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'{ data, count: 1, request_id }Built for real products
Start with a narrow metadata call, then add discovery, comments, batch resolution, or native raw data without changing providers.
Track public creator profiles, posting history, engagement, sounds, and hashtags without stitching together unrelated providers.
Search public videos, creators, hashtags, and music, then continue through deterministic cursors for repeatable collection.
Read public comments and replies with authors, engagement, thread metadata, and honest missing-value semantics.
Combine public Explore videos with hashtag, music, creator, and video search to identify emerging content patterns.
Normalize public video metadata, media variants, subtitles, and source URLs into a stable record for downstream systems.
Resolve short links, classify resources, and batch up to 20 video lookups while preserving the original request order.
Live status
The service process is checked live. Endpoint-specific upstream restrictions are reported separately because TikTok can vary by route, region, and egress.
Public health route and application process.
All sixteen data endpoints passed the latest customer-path RapidAPI regression, including raw and signed pagination checks for the six newest routes.
Creator and hashtag lists can alternate between valid results and TikTok empty responses. Temporary failures return a safe structured 503 and may recover on a later request.
API reference
Every list response guarantees count === data.length. Fewer items means the upstream page ended, was filtered, or hit the bounded ten-window safety cap.
Videos
Complete normalized video, creator, engagement, music, media, subtitle, and content-policy metadata for one public video.
urlRequired canonical TikTok video URLhttps://www.tiktok.com/@sophiegamergirl/video/7658435999478992148rawOptional native upstream JSONfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/videos/info?url=https%3A%2F%2Fwww.tiktok.com%2F%40sophiegamergirl%2Fvideo%2F7658435999478992148&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": { "id": "7658435999478992148", "duration": 15, "view_count": 1000, "author": { "unique_id": "sophiegamergirl" } }, "count": 1 }Videos
Fetch 1–20 public videos sequentially, preserving input order without multiplying upstream concurrency or peak memory.
urlsRequired JSON array, 1–20 canonical URLs["https://www.tiktok.com/@…/video/…"]rawOptional JSON boolean; raw array follows input orderfalseRequest
curl --request POST \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/videos/batch' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>' \
--header 'content-type: application/json' \
--data '{"urls":["https://www.tiktok.com/@sophiegamergirl/video/7658435999478992148"],"raw":false}'Normalized response shape
{ "data": [{ "id": "7658435999478992148" }], "count": 1 }Discovery
Follow bounded TikTok-only HTTP redirects and classify a canonical video, user, music, or hashtag URL without starting a browser.
urlRequired full TikTok URL or short linkhttps://vm.tiktok.com/ZMexample/Request
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/resolve?url=https%3A%2F%2Fwww.tiktok.com%2F%40sophiegamergirl%2Fvideo%2F7658435999478992148' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": { "type": "video", "canonical_url": "https://www.tiktok.com/@sophiegamergirl/video/7658435999478992148", "video_id": "7658435999478992148" }, "count": 1 }Music
Rich normalized sound metadata extracted from a public video, including identity, attribution, duration, rights flags, covers, playback URL, and the exact canonical music URL.
urlRequired canonical TikTok video URLhttps://www.tiktok.com/@sophiegamergirl/video/7658435999478992148rawOptional native upstream music entityfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/music/info?url=https%3A%2F%2Fwww.tiktok.com%2F%40sophiegamergirl%2Fvideo%2F7658435999478992148&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": { "id": "7658436057389648660", "title": "sonido original", "author": "sophiegamergirl", "url": "https://www.tiktok.com/music/sonido-original-7658436057389648660" }, "count": 1 }Music
Count-bounded public videos using one TikTok sound, deduplicated across native windows with a signed opaque continuation cursor.
urlRequired full canonical TikTok music URLhttps://www.tiktok.com/music/sonido-original-7658436057389648660countOptional, 1–502cursorOptional; copy returned value unchanged0rawOptional native upstream pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/music/videos?url=https%3A%2F%2Fwww.tiktok.com%2Fmusic%2Fsonido-original-7658436057389648660&count=2&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "id": "7658435999478992148" }], "count": 2, "has_more": false }Videos
A count-bounded page of a creator’s public videos, with signed opaque cursors for reliable continuation.
usernameRequired, @ is optionalsophiegamergirlcountOptional, 1–503cursorOptional; copy the returned value unchanged0rawOptional native upstream pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/videos?username=sophiegamergirl&count=3&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "id": "…" }], "count": 3, "cursor": "opaque-signed-value", "has_more": true }Users
Public identity, account flags, profile tabs, audience counters, and visibility settings for one creator.
usernameRequired, @ is optionalsophiegamergirlrawOptional native user and stats entityfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/users/info?username=sophiegamergirl&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": { "unique_id": "sophiegamergirl", "verified": false, "follower_count": 1000 }, "count": 1 }Videos
Public top-level comments with authors, engagement, thread metadata, and merged native windows when TikTok underfills a page.
urlRequired canonical video URLhttps://www.tiktok.com/@sophiegamergirl/video/7658435999478992148countOptional, 1–5010cursorOptional numeric comment cursor0rawOptional native upstream pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/videos/comments?url=https%3A%2F%2Fwww.tiktok.com%2F%40sophiegamergirl%2Fvideo%2F7658435999478992148&count=10&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "id": "…", "text": "Nice video!" }], "count": 10, "cursor": 20, "has_more": true }Videos
A page of public replies for one parent comment, including reply/thread IDs, authors, likes, images, and share metadata.
urlRequired canonical video URLhttps://www.tiktok.com/@sophiegamergirl/video/7658435999478992148comment_idRequired numeric parent comment ID7664243548862563102countOptional, 1–5010cursorOptional numeric reply cursor0rawOptional native upstream pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/videos/comments/replies?url=https%3A%2F%2Fwww.tiktok.com%2F%40sophiegamergirl%2Fvideo%2F7658435999478992148&comment_id=7664243548862563102&count=10&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "parent_comment_id": "7664243548862563102", "text": "Thank you!" }], "count": 2, "has_more": false }Discovery
Hashtag identity, commerce marker, artwork, high-precision aggregate counts, announcement, and share metadata.
tagRequired, # is optionalbleachcosplayrawOptional native challenge detailfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/hashtag/info?tag=bleachcosplay&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": { "title": "bleachcosplay", "statistics": { "video_count": 123, "view_count": 456789 } }, "count": 1 }Discovery
Count-bounded public videos for a hashtag, deduplicated across native windows with signed opaque pagination.
tagRequired, # is optionalforyoucountOptional, 1–503cursorOptional; copy returned value unchanged0rawOptional native upstream pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/hashtag/videos?tag=foryou&count=3&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "id": "…" }], "count": 3, "cursor": "opaque-signed-value", "has_more": true }Discovery
Public video search results with normalized video entities and signed cursors bound to the original keyword.
keywordRequired, 1–100 charactersbleach cosplay trendcountOptional, 1–503cursorOptional; copy returned value unchanged0rawOptional native upstream pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/search/videos?keyword=bleach%20cosplay%20trend&count=3&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "id": "…", "description": "…" }], "count": 3, "cursor": "opaque-signed-value", "has_more": true }Users
Use TikTok’s native user-search response when available, with a transparent lower-detail fallback to real author objects from public video search.
keywordRequired, 1–100 characterstiktokcountOptional, 1–503cursorOptional; copy returned value unchanged0rawOptional native upstream pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/search/users?keyword=tiktok&count=3&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "id": "…", "unique_id": "…", "nickname": "…" }], "count": 3, "cursor": "opaque-signed-value", "has_more": true }Discovery
TikTok’s current public web Explore feed, count-bounded and paginated with a signed opaque cursor.
countOptional, 1–503cursorOptional; copy returned value unchanged0rawOptional native Explore pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/trending/videos?count=3&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "id": "…" }], "count": 3, "cursor": "opaque-signed-value", "has_more": true }Discovery
Extract and deduplicate native challenge objects actually attached to videos in TikTok’s current public search results.
keywordRequired, 1–100 charactersdancecountOptional, 1–503cursorOptional; copy returned value unchanged0rawOptional native public-search pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/search/hashtags?keyword=dance&count=3&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "id": "5054", "title": "dance", "canonical_url": "https://www.tiktok.com/tag/dance" }], "count": 3, "has_more": true }Music
Extract and deduplicate native music objects actually attached to videos in public search, retaining the source video URL.
keywordRequired, 1–100 charactersdancecountOptional, 1–503cursorOptional; copy returned value unchanged0rawOptional native public-search pagesfalseRequest
curl --request GET \
--url 'https://tiktok-public-metadata-api.p.rapidapi.com/v1/search/music?keyword=dance&count=3&cursor=0&raw=false' \
--header 'x-rapidapi-host: tiktok-public-metadata-api.p.rapidapi.com' \
--header 'x-rapidapi-key: <YOUR_RAPIDAPI_KEY>'Normalized response shape
{ "data": [{ "id": "…", "title": "…", "author": "…", "source_video_url": "…" }], "count": 3, "has_more": true }Integration guide
The API preserves upstream truth, keeps pagination deterministic, and fails explicitly when TikTok does not provide a trustworthy payload.
Start with cursor=0. When has_more is true, send the returned cursor back unchanged. Video-list cursors are opaque and signed; comment cursors are numeric.
Add raw=true only when normalized fields are not enough. Multi-window results appear in raw.pages[], bypass cache, and are limited to 2 MiB.
null means TikTok did not provide that field in the actual upstream entity. false is retained only when the upstream value is explicitly false—not as a missing-data placeholder.
Retry 429 and transient 503 responses with exponential backoff and jitter. Do not retry 400,401, 404, or 413 unchanged.
Response contract
Keep request_id when reporting an issue. It connects a client response to server-side diagnostics without exposing credentials or raw customer data.
400 Invalid parameter or URL401 Missing or invalid RapidAPI gateway auth404 Public entity unavailable413 Raw response exceeded 2 MiB429 Rate limit reached503 TikTok upstream or bounded browser unavailableBefore you subscribe
The service exposes its tradeoffs directly so teams can decide whether public web data fits their product before integrating.
No. This service reads public TikTok web data. It does not use TikTok's official API and does not resell a paid third-party TikTok data API.
No. The service is HTTP-first and keeps zero persistent browsers. A single bounded browser fallback is started only for routes that require a current TikTok web signature.
A null value means the selected upstream surface did not provide a trustworthy value. The API does not invent missing values or convert an unknown boolean into false.
Start with cursor=0, then pass the returned cursor back unchanged while has_more is true. Opaque cursors are signed and must not be decoded, incremented, or reconstructed.
Yes on 15 upstream-backed endpoints. Use raw=true, or raw in the batch JSON body. Raw payloads may be large, bypass cache, and can change when TikTok changes its web response.
The API returns a structured retryable 503 with a request ID instead of fabricating data or silently returning an incomplete success response.
Ready to build
Subscribe on RapidAPI, use the generated application headers, and start with normalized video metadata. Every endpoint includes a working request and response example.