One handle in. Clean JSON out.
Give this endpoint a TikTok handle and it returns that creator's recent videos as a JSON array, each one carrying its own view, like, comment, share and save counts. It is the list version of the single-video stats call: one request instead of twenty, and you never have to find the video URLs yourself. Billing is per video returned, 3 credits each.
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<div class="css-1qb2n7d-DivItemContainer e148ts220" data-e2e="recommend-list-item"><div class="css-x6y88p-DivContainer"><a class="css-1g95xhm-AVideoContainer" href="/@tiktok/video/7231338487075638570"><video src="blob:https://www.tiktok.com/8f3a..."></video></a></div><div class="css-1f5bbrz-DivCardFooter"><strong data-e2e="video-views" class="css-ws4x78">1.2M</strong><strong data-e2e="like-count">88.4K</strong><strong data-e2e="comment-count">2,314</strong></div><h3 class="css-1yy6f0h">Behind the scenes of our new feature</h3><script id="__UNIVERSAL_DATA_FOR_REHYDRATION__" type="application/json">{"__DEFAULT_SCOPE__":{"webapp.video-detail"... {"data": [{"id": "7231338487075638570","url": "https://www.tiktok.com/@tiktok/video/7231338487075638570","caption": "Behind the scenes of our new feature","posted_at": "2026-07-02T18:00:00Z","metrics": {"views": 1204593,"likes": 88410,"comments": 2314}}],"meta": {"count": 2,"limit": 20,"item": "video"},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
An array under `data`, newest post first. Every element is a full video object — the same shape the TikTok Video Stats API returns for a single URL — so a page of 20 videos gives you 20 sets of counters, captions, hashtags, durations and publish timestamps in one round trip.
Because the objects are complete, you rarely need a follow-up call. A typical competitor sweep pulls one page per handle, writes the rows to a table keyed on `id`, and computes posting cadence and median engagement straight from `posted_at` and the counters. The creator's own identity comes back on every row inside `author`, which is handy when you merge several handles into one table.
What you do not get here is anything the profile page holds rather than the video grid: follower count, bio, verification. Those live on the TikTok Channel Stats API. This endpoint is strictly the video list.
Public like count.
Pricing
Billing is per video returned: 3 credits each, about 1.5¢ on the monthly plan, so a default 20-video page runs 30¢. A handle with no public videos still costs 1 credit.
Estimate only, on a full-year basis. 3 credits per returned video. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.
Entry price, side by side
Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.
Engineering notes
We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.
3 credits per video returned. Ask for 20 and the call costs 60 credits; ask for 50 and it costs 150. Set `limit` deliberately — the most common way to overspend on this endpoint is leaving a large limit on a job that only ever looks at the top five rows.
If a handle has fewer videos than your limit, you are charged for what actually comes back, not for what you asked for.
There is no pagination. `limit` sets how many videos come back (default 20, 50 max on a synchronous call) and that single response is everything you get — no cursor, no page token, no offset. A `limit` above 50 is accepted but routes to an async job, which returns a job handle rather than rows; you collect the result when the job finishes. If you need more videos than one call gives you, that async job is the only route.
Ordering is newest first, but pinned videos on a profile can surface out of chronological order. If your logic depends on recency, sort on `posted_at` after you receive the page rather than trusting array position.
This endpoint sits in the medium cache class, which holds a response for one hour — short, because a creator's grid is exactly where new uploads appear. Repeat calls inside the window return in milliseconds and are marked with x-cache: hit. A hit costs the same credits as a fresh pull.
Pass fresh=true when you are checking whether something went live in the last few minutes. Do not set it on every call in a nightly batch; you will pay the same and wait longer for no extra information.
Pass the handle with or without the leading @; both are accepted. Private accounts, accounts that have been banned and handles that have been renamed return an error rather than an empty array — an empty `data` array means the account exists and genuinely has no public videos.
Handles change. Ids do not. If you track creators long term, store the numeric video ids and the author handle together so a rename does not orphan your history.
Each row's numbers are what TikTok was publishing when the page was assembled, rounded the way TikTok rounds at scale. A video from last year is effectively settled; one posted this morning will read differently on your next sweep. Store the fetch timestamp alongside the row if you plan to compute growth.
Questions
You cannot, in one synchronous call. Calling /v1/tiktok/channel-videos with the handle and a limit returns one batch of up to 50 full video objects and nothing more — there is no cursor to follow and no way to resume where the last call stopped. For a creator with hundreds of uploads, ask for the larger limit so the request becomes an async job and take delivery by webhook.
3 credits per video returned. A default page of 20 videos is 60 credits, which is 30 cents at the monthly rate of $0.005 per credit, or 27 cents on annual. Fetching 200 videos from one creator costs 600 credits. Failed calls are not charged, and a partial page is billed only for the rows you receive.
Up to 50 on a synchronous call, with 20 as the default. That is one shot — there is no cursor and no second page. Anything above 50 is accepted but turns the request into an async job. The cap exists because a synchronous request has to finish inside the HTTP timeout, not because of any per-account restriction.
No. Every row describes a video, and `author` carries only the creator's handle and display name. Follower count, following count, total likes, bio and verification status come from the TikTok Channel Stats API, which is a separate 3-credit call against the profile itself. Most projects run both and join on the handle.
No. We read the same public profile pages you can open logged out, so a private account returns an error. There is no login, no session, and no way to reach content the account has not made public. If you need data on a private account, the account owner has to use TikTok's own authenticated tools.
Responses are cached for an hour, so a video posted minutes ago may not appear on an immediate call. Add fresh=true to force a live pull when you are watching for a specific upload. For routine monitoring, an hourly cron on the default cache is cheaper and just as accurate for anything older than a day.
The parameter is the handle, with or without the @ — pass `charlidamelio` or `@charlidamelio`. If all you have is a tiktok.com/@name profile link, take the segment after the @ and send that. Video URLs are not valid input here; those belong on the TikTok Video Stats API.
Next
100 trial credits on signup — no card, key on screen immediately.