Production API · Version 1.2.6

Public TikTok metadata,
normalized for production.

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.

16 data endpoints2 MiB raw budget0 persistent browsers
First request
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>'
200 OK{ data, count: 1, request_id }

Built for real products

From one video to a complete public-data workflow.

Start with a narrow metadata call, then add discovery, comments, batch resolution, or native raw data without changing providers.

01

Creator intelligence

Track public creator profiles, posting history, engagement, sounds, and hashtags without stitching together unrelated providers.

02

Social listening

Search public videos, creators, hashtags, and music, then continue through deterministic cursors for repeatable collection.

03

Moderation research

Read public comments and replies with authors, engagement, thread metadata, and honest missing-value semantics.

04

Trend discovery

Combine public Explore videos with hashtag, music, creator, and video search to identify emerging content patterns.

05

Content archiving

Normalize public video metadata, media variants, subtitles, and source URLs into a stable record for downstream systems.

06

Workflow automation

Resolve short links, classify resources, and batch up to 20 video lookups while preserving the original request order.

One API surfaceVideo, user, comment, reply, music, hashtag, search, trend, batch, and resolver data.
Upstream truthNative raw JSON on demand, without inventing fields when TikTok omits them.
Bounded infrastructureHTTP-first collection, no persistent browser fleet, and explicit resource limits.

Live status

Honest health, not a blanket green light.

The service process is checked live. Endpoint-specific upstream restrictions are reported separately because TikTok can vary by route, region, and egress.

Checking

Core service

Public health route and application process.

Operational

29/29 production probes

All sixteen data endpoints passed the latest customer-path RapidAPI regression, including raw and signed pagination checks for the six newest routes.

Upstream-variable

Upstream-variable lists

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.

Waiting for first health check

API reference

Sixteen focused endpoints.

Every list response guarantees count === data.length. Fewer items means the upstream page ended, was filtered, or hit the bounded ten-window safety cap.

GET/v1/videos/infoHTTP only

Videos

Video metadata

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/7658435999478992148
rawOptional native upstream JSONfalse
Runnable cURL and response shape

Request

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 }
POST/v1/videos/batchHTTP only · sequential

Videos

Video metadata batch

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 orderfalse
Runnable cURL and response shape

Request

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 }
GET/v1/resolveHTTP only

Discovery

Resolve TikTok URL

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/
Runnable cURL and response shape

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 }
GET/v1/music/infoHTTP only

Music

Music metadata

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/7658435999478992148
rawOptional native upstream music entityfalse
Runnable cURL and response shape

Request

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 }
GET/v1/music/videosHTTP-first + bounded fallback

Music

Music videos

Count-bounded public videos using one TikTok sound, deduplicated across native windows with a signed opaque continuation cursor.

Known upstream limitationUse the exact canonical URL returned by the music-info endpoint. TikTok pages with a guessed or altered slug can render without a trustworthy item list.
urlRequired full canonical TikTok music URLhttps://www.tiktok.com/music/sonido-original-7658436057389648660
countOptional, 1–502
cursorOptional; copy returned value unchanged0
rawOptional native upstream pagesfalse
Runnable cURL and response shape

Request

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 }
GET/v1/videosHTTP-first + bounded fallback

Videos

Creator videos

A count-bounded page of a creator’s public videos, with signed opaque cursors for reliable continuation.

Known upstream limitationTikTok can intermittently return HTTP 200 with an empty body for dynamic list routes. The API fails safely with a structured 503 instead of inventing data, and later requests may recover normally.
usernameRequired, @ is optionalsophiegamergirl
countOptional, 1–503
cursorOptional; copy the returned value unchanged0
rawOptional native upstream pagesfalse
Runnable cURL and response shape

Request

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 }
GET/v1/users/infoHTTP only

Users

User profile

Public identity, account flags, profile tabs, audience counters, and visibility settings for one creator.

usernameRequired, @ is optionalsophiegamergirl
rawOptional native user and stats entityfalse
Runnable cURL and response shape

Request

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 }
GET/v1/videos/commentsHTTP-first + bounded fallback

Videos

Video comments

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/7658435999478992148
countOptional, 1–5010
cursorOptional numeric comment cursor0
rawOptional native upstream pagesfalse
Runnable cURL and response shape

Request

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 }
GET/v1/videos/comments/repliesHTTP-first + bounded fallback

Videos

Comment replies

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/7658435999478992148
comment_idRequired numeric parent comment ID7664243548862563102
countOptional, 1–5010
cursorOptional numeric reply cursor0
rawOptional native upstream pagesfalse
Runnable cURL and response shape

Request

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 }
GET/v1/hashtag/infoHTTP-first + bounded fallback

Discovery

Hashtag metadata

Hashtag identity, commerce marker, artwork, high-precision aggregate counts, announcement, and share metadata.

tagRequired, # is optionalbleachcosplay
rawOptional native challenge detailfalse
Runnable cURL and response shape

Request

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 }
GET/v1/hashtag/videosHTTP-first + bounded fallback

Discovery

Hashtag videos

Count-bounded public videos for a hashtag, deduplicated across native windows with signed opaque pagination.

Known upstream limitationTikTok applies route- and egress-specific controls to dynamic hashtag lists. A temporary structured 503 is retryable with backoff; normalized results are returned only when the upstream payload is trustworthy.
tagRequired, # is optionalforyou
countOptional, 1–503
cursorOptional; copy returned value unchanged0
rawOptional native upstream pagesfalse
Runnable cURL and response shape

Request

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 }
GET/v1/search/usersOn-demand browser

Users

Search users

Use TikTok’s native user-search response when available, with a transparent lower-detail fallback to real author objects from public video search.

Known upstream limitationIf TikTok suppresses the dedicated user-search request, fallback rows contain only fields carried by real public video author objects; absent profile-only fields remain null.
keywordRequired, 1–100 characterstiktok
countOptional, 1–503
cursorOptional; copy returned value unchanged0
rawOptional native upstream pagesfalse
Runnable cURL and response shape

Request

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 }
GET/v1/search/hashtagsOn-demand browser

Discovery

Search hashtags

Extract and deduplicate native challenge objects actually attached to videos in TikTok’s current public search results.

Known upstream limitationThis is an honest projection of hashtag references in current public video search, not TikTok’s broader mobile-app hashtag index.
keywordRequired, 1–100 charactersdance
countOptional, 1–503
cursorOptional; copy returned value unchanged0
rawOptional native public-search pagesfalse
Runnable cURL and response shape

Request

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 }
GET/v1/search/musicOn-demand browser

Music

Search music

Extract and deduplicate native music objects actually attached to videos in public search, retaining the source video URL.

Known upstream limitationThis is an honest projection of sounds in current public video search, not TikTok’s broader mobile-app music index.
keywordRequired, 1–100 charactersdance
countOptional, 1–503
cursorOptional; copy returned value unchanged0
rawOptional native public-search pagesfalse
Runnable cURL and response shape

Request

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

Predictable behavior under pressure.

The API preserves upstream truth, keeps pagination deterministic, and fails explicitly when TikTok does not provide a trustworthy payload.

01

Pagination

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.

02

Raw upstream data

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.

03

Null and false

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.

04

Retries

Retry 429 and transient 503 responses with exponential backoff and jitter. Do not retry 400,401, 404, or 413 unchanged.

Response contract

Structured errors with a request ID.

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 unavailable

Before you subscribe

Clear answers to production questions.

The service exposes its tradeoffs directly so teams can decide whether public web data fits their product before integrating.

Is this the official TikTok API?

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.

Does every request launch a browser?

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.

Why can a field be null?

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.

How should pagination be implemented?

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.

Can I get the original upstream response?

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.

What happens when TikTok blocks or changes a route?

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

Make the first request, then inspect the real response.

Subscribe on RapidAPI, use the generated application headers, and start with normalized video metadata. Every endpoint includes a working request and response example.