# TikTok API documentation: 150 followers per credit (https://www.socialcrawl.dev/blog/tiktok-api-more-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](https://developers.tiktok.com/products/research-api), which freezes [Query User Followers](https://developers.tiktok.com/docs/en/research-api-specs-query-user-followers) at a default of 20 (max 100) behind `research.data.basic`. The [Display API](https://developers.tiktok.com/docs/en/display-api-get-started) is OAuth and lists the authorized user's own videos at a [max of 20](https://developers.tiktok.com/docs/en/tiktok-api-v2-video-list). This post is not those two APIs. For the official-API landscape, see [TikTok data without an official API](/blog/tiktok-data-without-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](/pricing). 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 stdlib `urllib` works; `requests` is shorter. - Base URL `https://www.socialcrawl.dev`. Per-key limits: 600 requests/minute, 50 concurrent ([pricing](/pricing)). - Assumed knowledge: HTTP GET, JSON, env vars. No TikTok developer app, no OAuth, no `research.data.basic`. The live catalogue is [`/platforms/tiktok`](/platforms/tiktok). Per-path docs: [`/docs/tiktok`](/docs/tiktok). A tall portrait slab overflowing with circular avatars next to one coin, showing a denser TikTok followers API page per credit. ## 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](/changelog#tiktok-eight-endpoints-2026-08-29) — 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](https://developers.tiktok.com/docs/en/research-api-specs-query-user-followers)). 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: ```json { "author": { "id": "7053775014932628481", "username": "sheagef", "followers": 7278, "verified": false } } ``` A TikTok API Python snippet for the followers path (`requests`, no SDK): ```python 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: ```bash 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. ```python 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: - `@tiktok` following = **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. - `@espn` profile following = 676, but the list call returned **404** `RESOURCE_NOT_FOUND` at **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](/changelog#tiktok-eight-endpoints-2026-08-29)). `@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. Stacked speech-bubble tiles packed beside a single coin, showing how a TikTok comments API now returns more rows per credit. ## Step 3 — How many comments does a TikTok comments API return per credit? Official Research comments default to **10**, max **100** ([spec](https://developers.tiktok.com/docs/en/research-api-specs-query-video-comments)). 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 `@tiktok` official 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. ```python 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](/blog/how-to-scrape-tiktok-comments-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. ```python 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](/changelog#tiktok-eight-endpoints-2026-08-29)). 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: ```python 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`](/platforms/tiktok). Ship note: [changelog](/changelog#tiktok-eight-endpoints-2026-08-29). 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 profile `following` count 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=0` on a 200.** Cache hit. Location posts and `@chipotle` liked 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/videos` still 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](https://developers.tiktok.com/docs/en/display-api-get-started) 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](/blog/how-to-scrape-tiktok-comments-python) - DIY scrape vs API, including [TikTok data scraping](/blog/how-to-scrape-tiktok-2026) trade-offs - Vendor comparison and [TikTok API pricing](/blog/best-tiktok-data-apis-2026) (that post owns the TikTok data API roundup) - Live catalogue: [`/platforms/tiktok`](/platforms/tiktok) · ship notes: [`/changelog`](/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).