TikTok
GET /v1/tiktok/search/users

TikTok Search Users API

Search TikTok users — distinct creators only, id + secUid, per-counter isApproximate flags, cursor pagination.

1 credit per request
TL;DR
Search TikTok users — distinct creators only, id + secUid, per-counter isApproximate flags, cursor pagination. The TikTok Search Users API (TikTok) is a single authenticated GET request to /v1/tiktok/search/users that responds with clean JSON and costs 1 credit. Pass cache=true for a free 24h cache hit; default is always fresh. Start with 100 free credits — no credit card.

What is the TikTok Search Users API?

Pass a search query and get matching creators as clean JSON: id + secUid (stable TikTok identity — secUid is what follower/video list calls need), username, displayName, bio, url, followers, following, videos, likes, verified, profileImage, and items[] sample videos when TikTok includes them. Rows are deduped by id — TikTok repeats users across search cards, so totalReturned can be below limit with hasMore false (the honest count, never padding). Every counter carries a per-row *IsApproximate flag (followersIsApproximate, likesIsApproximate, …) computed from the value itself — search display-rounds big totals on some paths. Cursor pagination via nextCursor + hasMore — the cursor is an opaque string that carries the search session, not just an offset, so pass it back verbatim; a creator ranking with several videos can repeat across a page boundary, so dedupe by id when stitching many pages. The native path is TikTok's signed web search (~1 s per page, single-digit seconds at any limit): the dedicated user-search API for the exact-match head where the exit allows it, topped up from distinct authors derived from general-search video rankings — timings.via says which served (signer / signer-mixed / signer-general). If the signer is unreachable the default answer is an empty degraded page (0 credits) — degradedReason names the failure: native-unavailable (page 1 can't be served at all) vs cursor-unsupported (a page-2+ request degraded after page 1 worked). Pass fallback=true to opt into the scraper actor (~2 min, capped at 100 s, degraded-empty on timeout). Prefer id/secUid over @handle for CRM joins — handles change. Envelope includes timings{path,via,nativeMs,apifyMs,totalMs}. Flat 1 credit on every path.

What you get

  • Distinct users only — deduped by id, never padded
  • id + secUid for stable identity / chaining
  • Per-counter *IsApproximate flags on followers/following/videos/likes
  • Sample items[] videos when present
  • Cursor pagination (nextCursor + hasMore) + timings envelope

Try it

Open in Playground

Fill in the parameters below and copy a ready-to-run request, or open the live Playground to run it against your account (no API key paste).

Parameters

Sign in to run live
curl "https://api.captapi.com/v1/tiktok/search/users?q=khaby" \
  -H "Authorization: Bearer capt_live_..."
# or: -H "x-api-key: capt_live_..."

Edit the parameters and the code updates instantly. Switch languages and hit copy.

Example response

{
  "success": true,
  "data": {
    "query": "khaby",
    "totalReturned": 2,
    "hasMore": true,
    "nextCursor": "30:20260809225002ADA0CE0CD6A89",
    "users": [
      {
        "id": "127905465618821121",
        "secUid": "MS4wLjABAAAAwAg0rSzO65WQfz4RzQgGv2Xdv108BgPXhRrrmNVIHQZ9PO8-flwwRtEppYTS0OjA",
        "username": "khaby.lame",
        "displayName": "Khabane lame",
        "bio": "Se vuoi ridere sei nel posto giusto😎 If u wanna laugh u r in the right place😎",
        "url": "https://www.tiktok.com/@khaby.lame",
        "followers": 162476412,
        "following": 81,
        "likes": 2650481169,
        "verified": true,
        "profileImage": "https://p19-common-sign.tiktokcdn-us.com/tos-useast8-avt-0068-tx2/08987e23b94057953fd4f1738694bf5f~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=ef0e9f02&x-expires=1786006800&x-signature=7Mx8iglAOcSlnXlc8QyIBifQV0M%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8",
        "followersIsApproximate": false,
        "followingIsApproximate": false,
        "likesIsApproximate": false
      },
      {
        "id": "6663294979903422470",
        "secUid": "MS4wLjABAAAAbq-1Yqpp1a6u5KbV_sMg93_FK7AN3d6MJeZ3H0Yj3vZXOtqFXXjc2TIkMW7flCxX",
        "username": "espn",
        "displayName": "ESPN",
        "bio": "Serving Sports Fans. Anytime. Anywhere.",
        "url": "https://www.tiktok.com/@espn",
        "followers": 60100768,
        "following": 657,
        "likes": 5769632093,
        "verified": true,
        "profileImage": "https://p16-common-sign.tiktokcdn-us.com/tos-maliva-avt-0068/7310257743653240837~tplv-tiktokx-cropcenter:1080:1080.jpeg?dr=9640&refresh_token=7e4745a7&x-expires=1786006800&x-signature=cJrkoOAcA8KBqdaAWgBgeaE6f6w%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=81f88b70&idc=useast8",
        "followersIsApproximate": false,
        "followingIsApproximate": false,
        "likesIsApproximate": false
      }
    ]
  }
}

Billing metadata is returned in response headers: X-Captapi-Credits (credits charged), X-Captapi-Cache (hit or miss), and X-Captapi-Source. Failed requests (4xx/5xx) are never charged. See the full list of error codes in the error reference.

Response structure

A successful call returns success and a data object with the following fields:

Top-level fields

  • queryThe search query you sent.
  • totalReturnedNumber of items returned in this response.
  • hasMoreWhether more results are available beyond this page. When true, pass nextCursor to fetch the next page.
  • nextCursorCursor to pass for the next page of results. May be null when the platform does not expose deep pagination (e.g. some Facebook Ad Library searches).

Users

Each item in users contains:

  • idId of this users item.
  • secUidTikTok secure user ID — required for many platform-internal list endpoints.
  • usernameAccount username / handle.
  • displayNameDisplay name of the account. Canonical across profile endpoints (prefer over name).
  • bioProfile bio. Canonical across profile endpoints (prefer over description on YouTube).
  • urlCanonical URL of the item.
  • followersFollower count.
  • followingNumber of accounts followed.
  • likesLike count (number).
  • verifiedWhether the account is verified on this platform.
  • profileImageProfile image URL. Deprecated alias of avatar on Instagram/Twitter/Threads/TikTok profile endpoints (one release).
  • followersIsApproximateTrue when followers was parsed from a compact Facebook chrome label (e.g. 28M) rather than an exact integer.
  • followingIsApproximateFollowing is approximate. Example: false.
  • likesIsApproximateTrue when engagement.likes looks display-rounded rather than exact.

Timings

The timings object contains:

  • pathPath. Example: "direct".
  • viaVia. Example: "signer".
  • nativeMsNative ms. Example: 1370.
  • totalMsTotal ms. Example: 1370.

Parameters

NameTypeRequiredDescription
qstringYesSearch query matched against usernames, display names and bios (min 2 characters).
limitintegerNoMax items to return (default 20, max 100). Flat 1 credit per call.
cursorstringNoPagination cursor. Omit (or pass 0) for the first page; then pass the nextCursor value from the previous response verbatim — it carries the search session, not just an offset. A null nextCursor means the end of the results.
fallbackbooleanNoOpt into the scraper actor when native search is unavailable (~2 min, capped at 100 s, degraded-empty on timeout). Default false — return an empty degraded page (0 credits) instead.
cachebooleanNoSet true to serve from the 24h response cache (0 credits on hit). Default false — always fetch fresh.

Authentication: send your key as Authorization: Bearer capt_live_.... A typical call costs 1 credit. Pass cache=true for a free 24h cache hit; default is always fresh.

Using an AI agent? This endpoint is the MCP tool tiktok_search_users via @captapi/mcp. Set it up →

How it works

  1. 1. Sign up — get 100 free credits, no card required.
  2. 2. Create a key from your dashboard.
  3. 3. Send one request to /v1/tiktok/search/users and parse the JSON response.

Use cases

Trend Discovery

Find trending content by keyword or hashtag.

Content Sourcing

Build feeds and playlists programmatically.

Monitoring

Track topics, brands, and competitors.

Research

Sample large sets of content for analysis.

Frequently asked questions

What does the TikTok Search Users API do?+

The TikTok Search Users API lets you search and return matching results from a public TikTok query using one GET request to /v1/tiktok/search/users. It returns clean JSON — no OAuth or infrastructure setup required.

How many credits does the TikTok Search Users API cost?+

Each successful call costs 1 credit. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Failed or empty results are never charged.

Do I need a TikTok API key or OAuth?+

No. A single Captapi key works across every platform Captapi supports — YouTube, TikTok, Instagram, Facebook, Twitter/X, Reddit, Threads, Bluesky, Pinterest, LinkedIn, Rumble, Spotify, Kwai, and more. We handle proxies, rate limits, retries, and authentication for you.

Why do I need secUid if I already have the @handle?+

Handles change; id and secUid do not. TikTok's follower lists, video lists, and many internal calls require secUid. Prefer id/secUid for CRM joins and chaining — use username for display.

Why did I get fewer users than my limit with hasMore false?+

Rows are deduped by id. TikTok repeats the same user across search cards (and scrapers re-emit the top match when results run out) — we return the honest distinct count, never padding. totalReturned is what uniquely exists.

What do the *IsApproximate flags mean on followers/likes?+

Search display-rounds big totals on some paths (162.6M → 162600000). Each counter carries its own flag computed from the value — followersIsApproximate: true means the number is display-rounded; false means exact. Small counts (following, videos) are almost always exact.

When should I pass fallback=true?+

Almost never. Native signed search answers in single-digit seconds; when it is unreachable the default response is an empty degraded page (0 credits, degradedReason: native-unavailable) so your pipeline never blocks. fallback=true opts into the scraper actor — expect ~2 minutes, a hard 100 s cap, and possibly a degraded-empty page on actor timeout. Use it only for batch jobs that must have a result at any latency.

native-unavailable vs cursor-unsupported — what's the difference?+

Both are empty 0-credit degraded pages, but they name different failures. native-unavailable means page 1 itself can't be served (the signer path is down) — fallback=true is the remedy. cursor-unsupported means a page-2+ request degraded after page 1 worked — re-request page 1 for a fresh cursor instead of paying for the actor.

Can the same creator appear on two pages?+

Rarely, yes. Rows are derived from the videos ranking for your query, and one creator can rank with several videos straddling a page boundary. Within one response rows are strictly distinct; when stitching many pages, dedupe by id.

Is the TikTok Search Users API suitable for production use?+

Yes. It is a stable REST endpoint with predictable JSON and automatic retries. Pass cache=true to serve from the 24h cache (0 credits on hit); default is always fresh. Selected profile endpoints also accept cacheMaxAge=1d|3d|7d|14d|30d. Use it for analytics, monitoring, and content automation.

More TikTok APIs

Ready to use the TikTok Search Users API?

Sign up, grab your key, and make your first call in 60 seconds.

TikTok Search Users API | Captapi — Captapi