One keyword in. Clean JSON out.
Send a keyword, get back an array of public TikTok videos matching it, each one already carrying its view, like, comment, share and save counts. It is the search box on tiktok.com, returned as JSON instead of an infinite scroll. Billing is per result at 4 credits, so a 20-video search costs 80 credits.
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 a full video object, not a stub: id, canonical URL, caption, the five engagement counters, runtime, publish timestamp, the author's handle and display name, the attached sound, and the parsed hashtags. You do not need a second call to the stats endpoint to find out how a result performed.
Result ordering comes from TikTok's own search ranking, which weighs relevance, recency and engagement in a mix nobody outside the company can see. It is not sorted by views, and it is not strictly chronological. If you need a deterministic order, sort the array yourself after it lands.
Search is keyword-based over captions and on-video text. A query of `cold brew` will surface videos whose creators wrote about cold brew, which is not the same set as everything about cold brew. Videos with no caption are effectively invisible to search however popular they are.
Public like count.
Pricing
Each returned video is 4 credits — about 2¢ on the monthly plan. You are billed per item returned, so a default 20-result search runs about 40¢, and an empty search still costs 1 credit.
Estimate only, on a full-year basis. 4 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.
4 credits per video returned. The default is 20 results, which is 80 credits, roughly 40 cents on the monthly plan. Pass `limit` to control it. A broad exploratory query with limit=100 costs 400 credits, and it is easy to burn a plan running that in a loop.
50 is the ceiling for a synchronous response. Ask for more and the request is submitted as an async job instead: you get a job handle back and collect the results when it finishes, rather than rows in the reply. There is no pagination either way — one call returns one batch, and no cursor comes back to continue from.
You are charged for what comes back, not what you asked for. If TikTok has only 7 matches for an obscure query, you are billed for 7.
Keep queries to two or three words. Long natural-language phrases match badly because TikTok is comparing them against short captions, not documents. `protein pancakes` works; `best high protein pancake recipe for meal prep` will return less, not more.
There are no boolean operators, no quoted phrases, no minus-exclusions. Whatever filtering logic you need, apply it to the returned array in your own code.
Run the same query twice a day apart and you will get overlapping but different sets. TikTok's ranking shifts constantly and new videos push old ones out. Treat search as a sampling method, not a census.
This is the reason to dedupe on `id` rather than position. If you are monitoring, store every id you have already seen and diff against it.
Responses sit in the fast cache class, so the same query repeated inside the window returns in milliseconds with x-cache: hit. A cache hit is billed identically to a fresh call — the caching is there for speed, not discounts. Add fresh=true when you specifically need to bypass it.
Search reaches what a logged-out visitor can see. Private accounts, deleted videos and content restricted in the region we read from are simply absent from results. Nulls are normal inside a result too — plenty of live videos have no attached sound or no hashtags.
Questions
Send a GET to /v1/tiktok/search with a query parameter and your API key. You get back an array of matching public videos with their metrics attached. No TikTok developer account, no app review, no OAuth. TikTok's official Display API has no public keyword search at all, which is why most people end up here.
4 credits per result returned. Credits are $0.005 each monthly and $0.0045 annual, so a 20-result search runs about 40 cents. Set the limit parameter to control spend — you are billed on what actually comes back, so a query with only 5 matches costs 20 credits, not 80. Failed calls are never charged.
You set it with the limit parameter, and the default is 20. Up to 50 comes back synchronously; anything larger is routed to an async job, so asking for 200 gets you a job handle to collect from rather than 200 rows in the response. Practical ceilings also come from TikTok rather than us: obscure queries genuinely run out of matches. Since ranking shifts between runs, one 200-result call is usually worse value than a smaller query on a schedule, deduped on id — there is no cursor to walk, so scheduled repeats are how you build coverage.
No operators, no quoted phrases, no exclusions. Plain keywords only. You can put a hashtag in the query and it will often match, but for tag-based collection the TikTok Hashtag Search API is the right endpoint — it browses the tag page directly and returns a more complete set than keyword matching does.
TikTok reranks search continuously and new uploads displace older ones, so two runs a day apart will overlap without matching. That is the platform's behaviour, not a caching artefact. Store the ids you have seen and diff against them rather than comparing result positions between runs.
Not in the request. The endpoint takes a query and a limit, nothing else. Every result carries posted_at and views, so filter the array once it lands. Bear in mind that filtering after the fact does not refund the credits for results you discard, so keep queries narrow if budget matters.
No. You get the caption, the metrics, the author and the hashtags, but not the spoken words. Take the url field from any result and pass it to the TikTok Transcript API to get the spoken words as text. That is a common two-step pipeline: search wide, then transcribe only the handful of videos worth reading.
Next
100 trial credits on signup — no card, key on screen immediately.