TikTok data, ready when you are.

Creators, videos, comments, followers, search and shop listings from TikTok.

Try in playground From $0.00045 a record · $0.10 free

What you can get.

  • $0.0022per record

    Profiles

    Name, headline, company, skills and work history.

    Try it →
  • $0.0018per record

    Posts by a person

    A person's latest posts, with likes and comments.

    Try it →
  • $0.00045per record

    Videos

    Full cards for up to ten posts by video or photo URL.

    Try it →
  • $0.0018per record

    Search posts

    Posts about any topic, brand or person.

    Try it →
  • $0.00045per record

    Search

    Find accounts by keyword. Every hit a full profile card.

    Try it →
  • $0.00045per record

    Comments

    Top-level comments on up to ten posts by URL.

    Try it →
  • $0.0009per record

    Followers

    The followers OR following of up to five accounts, each row a full profile.

    Try it →
  • $0.013per record

    Shop

    TikTok Shop products for a keyword. Price, discount, rating, sold count, seller, every variant with its stock.

    Try it →

What the data looks like.

handledisplayNamebioverifiedbusinessAccountbusinessCategoryfollowersfollowingtotalLikesvideostiktokIdprofileUrlbioLinkaccountCreateddetails
@mira.movesMira | PilatesNew class every Monday 🧘truetrueFitness1,240,00031241,200,0006422692099489https://www.tiktok.com/mira-pilates-1000https://www.tiktok.com/mira-pilates-10002026-10-07
  • {}
@cookwithkaiCook with KaiDinner in 30 minutes or lesstruefalsenull860,00019022,100,0004183614854177https://www.tiktok.com/cook-with-kai-1001https://www.tiktok.com/cook-with-kai-10012026-10-01
  • {}
@brewlabBrewlab CoffeeCoffee nerds from AustinfalsetrueFood & Drink52,10088610,0002143961941065https://www.tiktok.com/brewlab-coffee-1002https://www.tiktok.com/brewlab-coffee-10022026-10-15
  • {}
15 fields, scroll sideways for all. Example rows: made-up names, real field names. Live calls return real data.

For developers

API reference.

One endpoint, POST /v1/tiktok. Open an operation to see its fields.

Read the docs
Profilesprofiles

Profile cards for up to ten accounts by @handle or profile URL. Followers, following, total likes, video count, bio, verification.

FieldTypeMeaning
subjects *list of string · 1-10 items@handles or profile URLs.

Response fields, each row of data

FieldType
handlestring
tiktokIdstring
displayNamestring
profileUrlstring
avatarstring
biostring
bioLinkstring
verifiedboolean
privateboolean
businessAccountboolean
businessCategorystring
tiktokSellerboolean
followersinteger
followinginteger
totalLikesinteger
likesGiveninteger
videosinteger
mutualFollowsinteger
accountCreatedstring
detailsobject

Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.

example request · profiles
curl -X POST https://apiforagents.dev/v1/tiktok \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"profiles","subjects":["@nba","@natgeo"]}'

Example response rows

data · made-up names, real field names
[
  {
    "handle": "@mira.moves",
    "displayName": "Mira | Pilates",
    "bio": "New class every Monday 🧘",
    "verified": true,
    "businessAccount": true,
    "businessCategory": "Fitness",
    "followers": 1240000,
    "following": 312,
    "totalLikes": 41200000,
    "videos": 642,
    "tiktokId": "2692099489",
    "profileUrl": "https://www.tiktok.com/mira-pilates-1000",
    "bioLink": "https://www.tiktok.com/mira-pilates-1000",
    "accountCreated": "2026-10-07",
    "details": {}
  },
  {
    "handle": "@cookwithkai",
    "displayName": "Cook with Kai",
    "bio": "Dinner in 30 minutes or less",
    "verified": true,
    "businessAccount": false,
    "businessCategory": null,
    "followers": 860000,
    "following": 190,
    "totalLikes": 22100000,
    "videos": 418,
    "tiktokId": "3614854177",
    "profileUrl": "https://www.tiktok.com/cook-with-kai-1001",
    "bioLink": "https://www.tiktok.com/cook-with-kai-1001",
    "accountCreated": "2026-10-01",
    "details": {}
  }
]

An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.

Try profiles in the playground Examples and pricing for profiles
Posts by a personposts

One account's recent posts. Views, likes, comments, shares, saves, sound, hashtags, duration; includes the author card when held.

FieldTypeMeaning
subject *string · ≤400 charsOne @handle or profile URL.
limitinteger · 1-100

Response fields, each row of data

FieldType
postIdstring
postUrlstring
authorHandlestring
captionstring
postedDatestring
viewsinteger
likesinteger
commentsinteger
sharesinteger
savesinteger
durationSinteger
languagestring
isSlideshowboolean
isSponsoredboolean
isAdboolean
hashtagslist of string
mentionslist of string
soundany
locationstring
locationAddressstring
countrystring
thumbnailstring
resolutionstring
effectslist of string
slideshowImagesany
hashtagViewsinteger
sourceQuerystring
detailsobject

Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.

example request · posts
curl -X POST https://apiforagents.dev/v1/tiktok \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"posts","subject":"@nba","limit":20}'

Example response rows

data · made-up names, real field names
[
  {
    "authorHandle": "@mira.moves",
    "caption": "60-second core burner #pilates",
    "postedDate": "2026-10-14",
    "views": 2410000,
    "likes": 312000,
    "comments": 2100,
    "shares": 14200,
    "saves": 88000,
    "durationS": 60,
    "hashtags": [
      "pilates",
      "core"
    ],
    "postId": "18940392",
    "postUrl": "https://www.tiktok.com/60-second-core-burner-pilates-1000",
    "isSlideshow": false,
    "isSponsored": false,
    "isAd": false,
    "details": {}
  },
  {
    "authorHandle": "@mira.moves",
    "caption": "Pilates for back pain, gentle version",
    "postedDate": "2026-10-11",
    "views": 980000,
    "likes": 104000,
    "comments": 1320,
    "shares": 9100,
    "saves": 61000,
    "durationS": 74,
    "hashtags": [
      "pilates",
      "backpain"
    ],
    "postId": "835950238",
    "postUrl": "https://www.tiktok.com/pilates-for-back-pain-gentle-version-1001",
    "isSlideshow": false,
    "isSponsored": false,
    "isAd": false,
    "details": {}
  }
]

An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.

Try posts by a person in the playground Examples and pricing for posts by a person
Videosvideos

Full cards for up to ten posts by video or photo URL.

FieldTypeMeaning
subjects *list of string · 1-10 itemsVideo or photo URLs.

Response fields, each row of data

FieldType
postIdstring
postUrlstring
authorHandlestring
captionstring
postedDatestring
viewsinteger
likesinteger
commentsinteger
sharesinteger
savesinteger
durationSinteger
languagestring
isSlideshowboolean
isSponsoredboolean
isAdboolean
hashtagslist of string
mentionslist of string
soundany
locationstring
locationAddressstring
countrystring
thumbnailstring
resolutionstring
effectslist of string
slideshowImagesany
hashtagViewsinteger
sourceQuerystring
detailsobject

Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.

example request · videos
curl -X POST https://apiforagents.dev/v1/tiktok \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"videos","subjects":["https://www.tiktok.com/@nba/video/<video-id>"]}'

Example response rows

data · made-up names, real field names
[
  {
    "authorHandle": "@cookwithkai",
    "caption": "Crispy rice in 5 minutes",
    "postedDate": "2026-10-12",
    "views": 1180000,
    "likes": 140000,
    "comments": 980,
    "shares": 8600,
    "saves": 52000,
    "durationS": 35,
    "hashtags": [
      "easyrecipes"
    ],
    "postId": "2158438716",
    "postUrl": "https://www.tiktok.com/crispy-rice-in-5-minutes-1000",
    "isSlideshow": false,
    "isSponsored": false,
    "isAd": false,
    "details": {}
  },
  {
    "authorHandle": "@cookwithkai",
    "caption": "One-pan laksa",
    "postedDate": "2026-10-09",
    "views": 640000,
    "likes": 71000,
    "comments": 520,
    "shares": 4100,
    "saves": 33000,
    "durationS": 58,
    "hashtags": [
      "laksa"
    ],
    "postId": "55945509",
    "postUrl": "https://www.tiktok.com/one-pan-laksa-1001",
    "isSlideshow": false,
    "isSponsored": false,
    "isAd": false,
    "details": {}
  }
]

An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.

Try videos in the playground Examples and pricing for videos
Search postssearchPosts

Posts by keyword, by hashtag, or by sound URL. Exactly one.

FieldTypeMeaning
querystring · ≤300 chars
hashtagstring · ≤150 chars
soundUrlstring · ≤400 charsA TikTok sound page URL (tiktok.com/music/…): posts made with that sound.
limitinteger · 1-100

Response fields, each row of data

FieldType
postIdstring
postUrlstring
authorHandlestring
captionstring
postedDatestring
viewsinteger
likesinteger
commentsinteger
sharesinteger
savesinteger
durationSinteger
languagestring
isSlideshowboolean
isSponsoredboolean
isAdboolean
hashtagslist of string
mentionslist of string
soundany
locationstring
locationAddressstring
countrystring
thumbnailstring
resolutionstring
effectslist of string
slideshowImagesany
hashtagViewsinteger
sourceQuerystring
detailsobject

Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.

example request · searchPosts
curl -X POST https://apiforagents.dev/v1/tiktok \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"searchPosts","hashtag":"booktok","limit":25}'

Example response rows

data · made-up names, real field names
[
  {
    "authorHandle": "@homebarista",
    "caption": "Espresso at home for under $300 #coffee",
    "postedDate": "2026-10-13",
    "views": 3100000,
    "likes": 402000,
    "comments": 5200,
    "shares": 31000,
    "saves": 140000,
    "durationS": 64,
    "hashtags": [
      "coffee",
      "espresso"
    ],
    "postId": "1544575846",
    "postUrl": "https://www.tiktok.com/espresso-at-home-for-under-300-coffee-1000",
    "isSlideshow": false,
    "isSponsored": false,
    "isAd": false,
    "details": {}
  },
  {
    "authorHandle": "@latteart.lou",
    "caption": "Rosetta in slow motion #coffee",
    "postedDate": "2026-10-12",
    "views": 880000,
    "likes": 96000,
    "comments": 1100,
    "shares": 4200,
    "saves": 19000,
    "durationS": 18,
    "hashtags": [
      "coffee",
      "latteart"
    ],
    "postId": "113019651",
    "postUrl": "https://www.tiktok.com/rosetta-in-slow-motion-coffee-1001",
    "isSlideshow": false,
    "isSponsored": false,
    "isAd": false,
    "details": {}
  }
]

An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.

Try search posts in the playground Examples and pricing for search posts
Commentscomments

Top-level comments on up to ten posts by URL.

FieldTypeMeaning
subjects *list of string · 1-10 itemsVideo or photo URLs.
limitinteger · 1-100

Response fields, each row of data

FieldType
commentIdstring
commentstring
likesinteger
repliesinteger
postedDatestring
commenterstring
commenterIdstring
commenterUrlstring
commenterAvatarstring
pinnedByCreatorboolean
likedByCreatorboolean
mentionslist of string
detailsobject

Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.

example request · comments
curl -X POST https://apiforagents.dev/v1/tiktok \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"comments","subjects":["https://www.tiktok.com/@nba/video/<video-id>"],"limit":50}'

Example response rows

data · made-up names, real field names
[
  {
    "commenter": "@ravi.k",
    "comment": "Doing this every morning now",
    "likes": 2140,
    "replies": 12,
    "postedDate": "2026-10-14",
    "pinnedByCreator": false,
    "likedByCreator": true,
    "commentId": "4152526865",
    "commenterId": "1659980969",
    "commenterUrl": "https://www.tiktok.com/ravi-k-1000",
    "details": {}
  },
  {
    "commenter": "@lena_m",
    "comment": "Song name?",
    "likes": 980,
    "replies": 41,
    "postedDate": "2026-10-14",
    "pinnedByCreator": false,
    "likedByCreator": false,
    "commentId": "2242419321",
    "commenterId": "3716159273",
    "commenterUrl": "https://www.tiktok.com/lena-m-1001",
    "details": {}
  }
]

An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.

Try comments in the playground Examples and pricing for comments
Followersfollowers

The followers OR following of up to five accounts, each row a full profile.

FieldTypeMeaning
subjects *list of string · 1-5 items@handles or profile URLs.
directionenumfollowers · following
limitinteger · 1-100

Response fields, each row of data

FieldType
handlestring
userIdstring
displayNamestring
profileUrlstring
avatarstring
biostring
verifiedboolean
privateboolean
followersinteger
followinginteger
videosinteger
totalLikesinteger
tiktokSellerboolean
connectionTypestring
connectedAccountstring
detailsobject

Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.

example request · followers
curl -X POST https://apiforagents.dev/v1/tiktok \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"followers","subjects":["@nba"],"direction":"following","limit":50}'

Example response rows

data · made-up names, real field names
[
  {
    "handle": "@ravi.k",
    "displayName": "Ravi",
    "followers": 412,
    "following": 830,
    "videos": 12,
    "connectionType": "follower",
    "userId": "4157080663",
    "profileUrl": "https://www.tiktok.com/ravi-1000",
    "details": {}
  },
  {
    "handle": "@lena_m",
    "displayName": "Lena",
    "followers": 2100,
    "following": 410,
    "videos": 58,
    "connectionType": "follower",
    "userId": "4017953218",
    "profileUrl": "https://www.tiktok.com/lena-1001",
    "details": {}
  }
]

An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.

Try followers in the playground Examples and pricing for followers
Shopshop

TikTok Shop products for a keyword. Price, discount, rating, sold count, seller, every variant with its stock.

FieldTypeMeaning
query *string · ≤300 chars
limitinteger · 1-100

Response fields, each row of data

FieldType
productIdstring
productUrlstring
titlestring
descriptionstring
salePricenumber
originalPricenumber
discountstring
currencystring
ratingnumber
reviewCountinteger
soldCountinteger
sellerany
imagestring
labelslist of string
variantsany
detailsobject

Every field is present on every row: a value the source had nothing for is null, an empty list is []. details is always the last field: everything else the source sent for that row, under our own field names. Its keys depend on the source that answered, so read them defensively; it is {} when there is nothing more.

example request · shop
curl -X POST https://apiforagents.dev/v1/tiktok \
  -H "Authorization: Bearer $AFA_KEY" \
  -H "Content-Type: application/json" \
  -d '{"op":"shop","query":"resistance bands","limit":20}'

Example response rows

data · made-up names, real field names
[
  {
    "title": "Resistance bands set (5)",
    "seller": "Mira Moves Shop",
    "salePrice": 19.99,
    "originalPrice": 29.99,
    "discount": "33%",
    "currency": "USD",
    "rating": 4.7,
    "reviewCount": 2310,
    "soldCount": 12400,
    "productId": "279510755",
    "productUrl": "https://www.tiktok.com/resistance-bands-set-5-1000",
    "details": {}
  },
  {
    "title": "Non-slip yoga mat",
    "seller": "Mira Moves Shop",
    "salePrice": 34,
    "originalPrice": 45,
    "discount": "24%",
    "currency": "USD",
    "rating": 4.8,
    "reviewCount": 1450,
    "soldCount": 8800,
    "productId": "2036470454",
    "productUrl": "https://www.tiktok.com/non-slip-yoga-mat-1001",
    "details": {}
  }
]

An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.

Try shop in the playground Examples and pricing for shop
Historyhistoryfree

Stored follower/likes/video-count series of profiles already held. Free.

FieldTypeMeaning
subjects *list of string · 1-10 items
metricenumfollowers · following · total_likes · videos
daysinteger · 1-730
Try history in the playground

Guides and ideas.

Use it from your tools.

More in social.

All platforms