One keyword in. Clean JSON out.
Give this endpoint one hashtag and it returns recent public TikTok videos carrying that tag, each with its full engagement numbers already parsed. Billing is per video returned, at 3 credits each, so a 20-video pull costs 60 credits. It is the fastest way to see what a tag is actually producing right now without opening the app.
How I plan a week of posts in 30 minutes
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": "v_77120","url": "https://example-result-url","caption": "How I plan a week of posts in 30 minutes","author": {"handle": "plannerpro"},"metrics": {"views": 88210,"likes": 5120},"posted_at": "2026-07-08T16:20:00Z"}],"meta": {"count": 2,"limit": 20,"item": "result"},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
An array. Every element is one video, described exactly the way the TikTok Stats API describes a single video: id, canonical URL, caption, the five engagement counters, runtime, publish time, creator, sound and parsed hashtags. Same shape, many rows. If you already parse the single-video response, this needs no new code on your side.
The set you get is what TikTok surfaces publicly for that tag, in the order the platform returns it. That order leans recent and popular; it is not a complete archive of every video ever posted under the tag, and nobody outside TikTok can produce one. Ask for 20 and you get up to 20 — fewer if the tag is small or newly coined.
Because each row carries `hashtags`, one call also tells you which other tags travel with yours. Count the co-occurrences across a result set and you have a cheap map of the neighbouring tags worth searching next.
Public like count.
Pricing
Billing is per video returned, at 3 credits each — about 1.5¢ on the monthly plan. A 20-video pull is 60 credits, roughly 30¢, and a tag that returns nothing still costs 1 credit.
Estimate only, on a full-year basis. 3 credits per returned result. 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.
The unit is a result. At 3 credits each, a limit of 50 costs 150 credits whether you read all 50 or one. Set the limit to what you will actually use, and prefer several small scheduled pulls over one huge one — a daily 20 is both cheaper and more useful than a weekly 140, which would also have to run as an async job.
If the tag returns fewer videos than you asked for, you are charged for what came back, not for the limit you requested.
TikTok decides what to surface for a tag, and that decision changes through the day. Two calls an hour apart will overlap heavily but not exactly. Store rows keyed on `id` and upsert; do not assume the Nth item is the same video it was this morning.
There is no cursor, page token or offset — one call, one batch, no way to resume where it left off. Raising the limit is how you go deeper, and the depth available depends on how much public content the tag has. Note that a limit above 50 stops being a synchronous request: it is submitted as an async job and you get back a job handle to collect from, not rows in the response.
Pass the tag with or without the leading #; both work. One tag per call — there is no AND/OR syntax, and a multi-word string is not a hashtag. For a tag intersection, pull each tag separately and intersect on `id` yourself.
Tags are matched as TikTok stores them, so casing does not matter but spelling does. A typo returns an empty array rather than a near-miss.
Counters can be null on very new videos, and `music` and `hashtags` are often absent. Filter on a field only after checking it exists. A row with a null view count is still a real video, not a broken response.
Responses sit in the fast cache class, so a repeated pull of the same tag inside the window comes back in milliseconds with x-cache: hit. A cache hit is billed at the same rate as a fresh one. Send fresh=true when you specifically need a new sample, such as the first call of a scheduled run.
Questions
Send a GET to /v1/tiktok/hashtag-search with your tag in the query parameter and your API key in the header. The response is a JSON array of videos with engagement counts already parsed. No TikTok developer account or OAuth is involved — the endpoint reads the same public tag pages you can open in a browser while logged out.
3 credits per video returned. Credits are $0.005 each monthly and $0.0045 annual, so 20 videos costs 60 credits, roughly 30 cents. A limit of 100 costs 300 credits. Because you are charged per result, the limit you set is the main lever on your bill. Failed calls are not charged.
Set a limit and you get up to that many, in one batch. Popular tags fill large limits easily; niche or brand-new tags return whatever exists, which may be a handful. There is no pagination of any kind, so depth comes from the limit rather than from walking pages — and past 50 the request becomes an async job rather than a direct response. For long-term coverage, run smaller pulls on a schedule and deduplicate on the video id.
Not in a single call. The endpoint takes one hashtag. To find videos carrying both tags, call it twice and intersect the two arrays on the id field — that also tells you how much the two tags genuinely overlap, which a combined query would hide. Every row includes its own hashtags array to help with that.
No, and no public source can. TikTok surfaces a subset for each tag, weighted towards recent and well-performing content, and that subset shifts through the day. Treat a pull as a sample of what the tag is showing now. Repeated scheduled pulls stored by video id build far better coverage than one large call.
They are what TikTok was showing publicly when the call ran. Counters on videos posted in the last few hours move quickly, so a number captured this morning will already be stale by evening. If you are tracking specific videos over time, re-check them individually through the TikTok Stats API rather than re-running the tag search.
Yes, as a second step. This endpoint gives you canonical video URLs; pass those to the TikTok Transcript API to get the speech as text (flat text, not timed segments). That is a common pipeline — search a tag, rank the results by saves, then transcribe only the top few rather than paying to transcribe the whole set.
Next
100 trial credits on signup — no card, key on screen immediately.