TikTok API documentation: 150 followers per credit
One credit now returns 150 TikTok followers, 48 comments, 49 replies, and 30 search results. Live-checked 2026-09-04 on five accounts. TikTok API documentation.
One credit now returns 150 TikTok followers, 150 following, 48 comments, 49 replies, and 30 keyword results. Live-checked 2026-09-04 on five public accounts, 16 credits spent, still 1 credit a live miss. That is the working TikTok API documentation for those denser public paths.
Official docs still land most developers on two dead ends: the ads/business portal, and the Research API, which freezes Query User Followers at a default of 20 (max 100) behind research.data.basic. The Display API is OAuth and lists the authorized user's own videos at a max of 20. This post is not those two APIs. For the official-API landscape, see TikTok data without an official API.
Stack: Python 3.10+ · requests · GET https://www.socialcrawl.dev/v1/tiktok/… · header x-api-key. Print len(items) and credits_used on the denser existing paths, then the new 1-credit reads. Pagination is one billed page per call.
What do you need before the first 1-credit call?
- A SocialCrawl account and one API key, sent as
x-api-key. The free plan includes 100 credits, no card. Credits never expire. A standard live miss is 1 credit; a cache hit is 0; empty pages and hard fails are refunded; bad params return 400 and are unbilled. - Python 3.10+ and
requests(pip install requests). The stdliburllibworks;requestsis shorter. - Base URL
https://www.socialcrawl.dev. Per-key limits: 600 requests/minute, 50 concurrent (pricing). - Assumed knowledge: HTTP GET, JSON, env vars. No TikTok developer app, no OAuth, no
research.data.basic. The live catalogue is/platforms/tiktok. Per-path docs:/docs/tiktok.
Step 1 — How many followers does a TikTok followers API return per credit?
Call GET /v1/tiktok/user/followers?handle=tiktok and print the length of data.items plus the envelope credits_used. That is the whole job. Page size is not a caller limit. The platform decides; a short graph returns a short page.
Live numbers from the 2026-09-04 harvest (5 public accounts, 16 credits). Before-figures come from the 2026-08-29 changelog — not re-measured this run. Ratios divide live page_len by those historical numbers.
| Path | Before (changelog) | Live page_len | Credits | Fixture |
|---|---|---|---|---|
| Followers | ~20 | 150 | 1 | @tiktok, has_more=true |
| Following | ~20, no cursor | 150 | 1 | @jomboymedia only (see Step 2) |
| Comments | ~40–50 claimed | 48 | 1 | @lvelove758 video, 1,165 comments |
| Replies | 6 | 49 | 1 | 51-reply thread, has_more=true |
| Keyword search | 10 | 30 | 1 | query=kpop |
Against those before-figures: followers 7.5× (150/20), a long following graph 7.5×, replies 8.17× (49/6, not 50/6), keyword search 3× (30/10). Comments had no published before-denominator; live is 48 and 44. Ten full follower pages used to buy about 200 accounts. They now buy 1,500, still 10 credits, when the list fills. Empty pages still refund.
Official Research Query User Followers is default 20, max 100, and the payload is two strings: display_name and username (spec). The SocialCrawl API returned 150 canonical author rows on the same 1 credit: id, handle, avatar, follower/following counts, under the unified schema. Head of the @tiktok followers page on 2026-09-04:
{
"author": {
"id": "7053775014932628481",
"username": "sheagef",
"followers": 7278,
"verified": false
}
}
A TikTok API Python snippet for the followers path (requests, no SDK):
import os
import requests
BASE = "https://www.socialcrawl.dev"
r = requests.get(
f"{BASE}/v1/tiktok/user/followers",
params={"handle": "tiktok"},
headers={"x-api-key": os.environ["SOCIALCRAWL_API_KEY"]},
timeout=30,
)
r.raise_for_status()
payload = r.json()
items = payload["data"]["items"]
pag = payload.get("pagination") or {}
print(len(items), payload.get("credits_used"), pag.get("has_more"))
Curl twin of the same GET:
curl "https://www.socialcrawl.dev/v1/tiktok/user/followers?handle=tiktok" \
-H "x-api-key: YOUR_KEY"
In this harvest the envelope set credits_used=1, pagination.has_more=true, and included a next_cursor on the 150-row page (request_id req-h4wTY6bL7A6xFQfc). Pass pagination.next_cursor from that block to the next GET. Do not invent a field.
Sample bias: these were large public accounts (@tiktok, @stoolpresidente, @chipotle, @espn, @jomboymedia), not a random-creator sample. A followers page fills when the account has at least 150 followers. A following page fills only when that account follows at least 150 people — @tiktok follows 11, so that page is 11.
Step 2 — Does following still stop after twenty users?
It used to. Following was about 20 rows, one page, no cursor. It now pages at 150 a page, still 1 credit, only if the graph is long enough. Live does not mean every account returns 150.
r = requests.get(
f"{BASE}/v1/tiktok/user/following",
params={"handle": "jomboymedia"},
headers={"x-api-key": os.environ["SOCIALCRAWL_API_KEY"]},
timeout=30,
)
r.raise_for_status()
payload = r.json()
items = payload["data"]["items"]
pag = payload.get("pagination") or {}
print(len(items), payload.get("credits_used"), pag.get("has_more"))
# 150, 1, True — total=167 on this fixture.
If has_more is true, the next GET is another 1-credit page. This harvest did not fetch page 2. On @jomboymedia the envelope reported total=167, so the rest of the list is 17 rows, not another 150.
Counterexamples you will hit if you only poke the official account:
@tiktokfollowing = 11. The profile following count is 11. Density is invisible if this is your only fixture (has_more=false, 1 credit).@stoolpresidente= 96,has_more=false. The graph is shorter than 150, so the page is 96.@espnprofile following = 676, but the list call returned 404RESOURCE_NOT_FOUNDat 0 credits. Hidden list, not an outage.
The 404 is the contract, not a retry. A follower or following list the owner has hidden returns a definitive 404 at 0 credits, not an empty 200 (changelog). @espn is that case. If your client 200-checks and then reads items, a hidden list never reaches that branch.
If you want to see the 150-row page, check the profile following count first, then call a long public graph. @jomboymedia is the harvest fixture that actually filled the page.
Step 3 — How many comments does a TikTok comments API return per credit?
Official Research comments default to 10, max 100 (spec). Five official pages at that default still only match one of the pages below — and only after research.data.basic. Live on 2026-09-04, still 1 credit:
- 48 comments on
https://www.tiktok.com/@lvelove758/video/7633767260557069589(1,165-comment video,has_more=true). - 44 comments on an
@tiktokofficial video with 2,868 comments. Treat 48 as the working comments figure.
The official spec warns a page can come back shorter than max_count because of deletes. So can this one: 48 is not 50, 49 is not 50, and 18 is what a 20-reply thread actually held.
Replies are a separate path. GET /v1/tiktok/video/comment/replies with comment_id plus url returned 49 on comment_id=7634164824419681031 (thread hinted 51, has_more=true, 1 credit). Changelog says max 50; that is a ceiling, not this page. Live is 49. A 20-reply thread on the official video returned 18 (has_more=true). Short threads return short pages.
VIDEO = "https://www.tiktok.com/@lvelove758/video/7633767260557069589"
comments = requests.get(
f"{BASE}/v1/tiktok/post/comments",
params={"url": VIDEO},
headers={"x-api-key": os.environ["SOCIALCRAWL_API_KEY"]},
timeout=30,
)
comments.raise_for_status()
c_payload = comments.json()
print(len(c_payload["data"]["items"]), c_payload.get("credits_used"))
# 48, 1
replies = requests.get(
f"{BASE}/v1/tiktok/video/comment/replies",
params={"url": VIDEO, "comment_id": "7634164824419681031"},
headers={"x-api-key": os.environ["SOCIALCRAWL_API_KEY"]},
timeout=30,
)
replies.raise_for_status()
r_payload = replies.json()
print(len(r_payload["data"]["items"]), r_payload.get("credits_used"))
# 49, 1
Optional query params on comments: cursor, trim. Same idea on replies. For a longer comments walkthrough, see how to scrape TikTok comments in Python.
Step 4 — How many results does a TikTok search API return per credit?
Unfiltered GET /v1/tiktok/search?query=kpop returned 30 rows, has_more=true, 1 credit. Changelog before-figure was 10. That is a 3× page on the same credit. Ten search pages used to be 100 posts. They are 300 now, still 10 credits, on the unfiltered path this harvest called.
r = requests.get(
f"{BASE}/v1/tiktok/search",
params={"query": "kpop"},
headers={"x-api-key": os.environ["SOCIALCRAWL_API_KEY"]},
timeout=30,
)
r.raise_for_status()
payload = r.json()
print(len(payload["data"]["items"]), payload.get("credits_used"))
# 30, 1
Optional filters on the same path: date_posted, sort_by, region (ISO-2; a proxy location, not a hard geo filter), and cursor. This harvest did not test those filters. Do not claim a filtered page size from this run.
Search rows carry post.ext.author_followers. Engagement carries exact saves and post.ext.download_count (changelog).
An unofficial TikTok API in the GitHub-README sense is usually a Playwright wrapper that searches trending through a browser cookie. This is a billed REST page: handle or query in, JSON out, 1 credit on a live miss.
Step 5 — Which new 1-credit TikTok reads shipped?
The density wave shipped 2026-08-29. This harvest is 2026-09-04. Eight new reads joined at 1 credit. Live where this harvest called them; changelog-only where it did not. Liked posts and location posts were cache hits this run (credits_used=0); page length is still the production value.
| Read | Path | Live page_len | Credits this run | Note |
|---|---|---|---|---|
| Liked posts | /v1/tiktok/user/liked | 30 | 0 (cache) | @chipotle. @tiktok → 404, 0 credits (hidden). Direction = "what this user liked". |
| Location posts | /v1/tiktok/location/posts | 20 | 0 (cache) | location_id=22535865202815278, has_more=true |
| Music search | /v1/tiktok/search/music | 27 | 1 | query=espresso, has_more=true. Live 27, not 30. Rows may carry ext.dsp_ids. |
| Playlists | /v1/tiktok/profile/playlists | 6 | 1 | @chipotle, has_more=false (the account only published 6). Sibling: /v1/tiktok/playlist/videos |
| Hashtag | /v1/tiktok/hashtag | 1 | 1 | #kpop — a single record, not a list. Pass the name. |
| Effects | /v1/tiktok/effects + /v1/tiktok/effect/videos | — | not called this run | 1-credit catalogue paths. No live page_len this run. |
Music search was a true 1-credit miss:
r = requests.get(
f"{BASE}/v1/tiktok/search/music",
params={"query": "espresso"},
headers={"x-api-key": os.environ["SOCIALCRAWL_API_KEY"]},
timeout=30,
)
r.raise_for_status()
payload = r.json()
print(len(payload["data"]["items"]), payload.get("credits_used"))
# 27, 1
Live catalogue: /platforms/tiktok. Ship note: changelog. Same week, the changelog also covers denser Reddit search, Instagram profile/about, new platforms, and Finance history, statements, options, and news. Those are not this harvest.
What do 404s, short pages, and cache hits actually mean?
- Short page on following. You hit
@tiktok(11) or any account whose graph is under 150. Fix: read the profilefollowingcount first; use a long public graph (@jomboymedia) to see the 150-row page. - 404
RESOURCE_NOT_FOUND,credits_used=0. Hidden following (@espn) or hidden liked (@tiktok). Not an outage. A definitive 404, not an empty 200. credits_used=0on a 200. Cache hit. Location posts and@chipotleliked did this on 2026-09-04. Page length is still real; you were not billed.- Replies 18 on a 20-reply thread. Not a regression. A ceiling test needs a long thread (harvest used a 51-reply thread → 49).
- Not every TikTok path got denser.
GET /v1/tiktok/profile/videosstill returned 10 on@tiktok(1 credit). That path was not part of the density wave. - 400 unbilled. Bad params. 429: back off; 600 req/min, 50 concurrent.
- Official OAuth token expiry / Research gate. Wrong API family. Display API tokens in the getting-started example expire in 86,400 seconds; Research needs
research.data.basic. Nothing in this how-to uses those. - Gated / age-gated profile. Changelog says a previously-404 profile now returns and bills 1 credit. Not re-verified on 2026-09-04, so it is not a fixture here.
Where to go after the first 150-row page
- Comments walkthrough: scrape TikTok comments in Python
- DIY scrape vs API, including TikTok data scraping trade-offs
- Vendor comparison and TikTok API pricing (that post owns the TikTok data API roundup)
- Live catalogue:
/platforms/tiktok· ship notes:/changelog
Reproduce the harvest with four GETs: followers handle=tiktok, following handle=jomboymedia, search query=kpop, and comments on the @lvelove758 URL above. Try the same GET in the visual explorer before writing a single line.
Frequently asked questions
How many TikTok followers can I pull with 1 credit?
Live 150 on GET /v1/tiktok/user/followers?handle=tiktok (2026-09-04, has_more=true, 1 credit). That is not a caller-chosen limit. Official Research API max is 100.
Did the TikTok followers API page size change?
Yes. Changelog before-figure ~20 → live 150, still 1 credit. Harvest date 2026-09-04. Density wave shipped 2026-08-29.
How many comments does 1 credit return now?
Live 48 on a 1,165-comment video; 44 on a 2,868-comment official video. Use 48 as the working comments figure. Replies on a long thread: 49, not 50. Official Research comments default 10 / max 100.
How many TikTok search results do I get per credit?
Live 30 on GET /v1/tiktok/search?query=kpop (was 10). 1 credit. has_more=true.
Does following still stop after twenty users?
No, when the graph is long enough. Live 150 plus a cursor on @jomboymedia (total=167). @tiktok still returns 11. Hidden lists 404 at 0 credits.
What new 1-credit TikTok reads shipped in September 2026?
Wave dated 2026-08-29. This harvest (2026-09-04) verified liked posts 30/page on a public list, location posts 20, music search 27 live (not 30), playlists (6 on @chipotle), and hashtag detail. Changelog also lists effects plus effect videos at 1 credit; those two were not called this run, so they have no live page size here. Liked and location were cache hits this run (credits_used=0); a live miss on those paths bills 1 credit.
Does a gated TikTok profile still come back as not found?
Changelog: a previously-404 gated profile now returns data and bills 1 credit. Not re-verified in the 2026-09-04 harvest. Hidden follower/following/liked lists still 404 at 0 credits (@espn following, @tiktok liked).
Related posts
Scrape Threads: 55 Posts for 3 Credits + Comments
Scrape Threads with one API: 55 posts for 3 credits via multi-window search. Plus comments, carousel slides, and phrase expand that turned 0 hits into 44.
Twitter Search API: 20/Page + Full Long Posts
Twitter search API returned 20 Artemis hits/page; 12 of 20 past 280 chars (max 1,173). Cursor timelines, replies, followers — live curl + JSON, 2026-09-04.
RapidAPI Alternatives: 4 Profiles, One Author Schema
RapidAPI alternatives for Instagram, TikTok, and YouTube: one x-api-key. Live @mrbeast profiles, computed engagement rates, 17-source search for 33 credits.
