TikTok data, ready when you are.
Creators, videos, comments, followers, search and shop listings from TikTok.
- See the price before every call
- Pay only for records that come back
- No subscription. Your balance never expires
What you can get.
- $0.0022per recordTry it →
Profiles
Name, headline, company, skills and work history.
- $0.0018per recordTry it →
Posts by a person
A person's latest posts, with likes and comments.
- $0.00045per recordTry it →
Videos
Full cards for up to ten posts by video or photo URL.
- $0.0018per recordTry it →
Search posts
Posts about any topic, brand or person.
- $0.00045per recordTry it →
Search
Find accounts by keyword. Every hit a full profile card.
- $0.00045per recordTry it →
Comments
Top-level comments on up to ten posts by URL.
- $0.0009per recordTry it →
Followers
The followers OR following of up to five accounts, each row a full profile.
- $0.013per recordTry it →
Shop
TikTok Shop products for a keyword. Price, discount, rating, sold count, seller, every variant with its stock.
What the data looks like.
| handle | displayName | bio | verified | businessAccount | businessCategory | followers | following | totalLikes | videos | tiktokId | profileUrl | bioLink | accountCreated | details |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @mira.moves | Mira | Pilates | New class every Monday 🧘 | true | true | Fitness | 1,240,000 | 312 | 41,200,000 | 642 | 2692099489 | https://www.tiktok.com/mira-pilates-1000 | https://www.tiktok.com/mira-pilates-1000 | 2026-10-07 |
|
| @cookwithkai | Cook with Kai | Dinner in 30 minutes or less | true | false | null | 860,000 | 190 | 22,100,000 | 418 | 3614854177 | https://www.tiktok.com/cook-with-kai-1001 | https://www.tiktok.com/cook-with-kai-1001 | 2026-10-01 |
|
| @brewlab | Brewlab Coffee | Coffee nerds from Austin | false | true | Food & Drink | 52,100 | 88 | 610,000 | 214 | 3961941065 | https://www.tiktok.com/brewlab-coffee-1002 | https://www.tiktok.com/brewlab-coffee-1002 | 2026-10-15 |
|
For developers
API reference.
One endpoint, POST /v1/tiktok. Open an operation to see its fields.
Profilesprofiles
Profile cards for up to ten accounts by @handle or profile URL. Followers, following, total likes, video count, bio, verification.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | @handles or profile URLs. |
Response fields, each row of data
| Field | Type |
|---|---|
| handle | string |
| tiktokId | string |
| displayName | string |
| profileUrl | string |
| avatar | string |
| bio | string |
| bioLink | string |
| verified | boolean |
| private | boolean |
| businessAccount | boolean |
| businessCategory | string |
| tiktokSeller | boolean |
| followers | integer |
| following | integer |
| totalLikes | integer |
| likesGiven | integer |
| videos | integer |
| mutualFollows | integer |
| accountCreated | string |
| details | object |
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.
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
[
{
"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.
Posts by a personposts
One account's recent posts. Views, likes, comments, shares, saves, sound, hashtags, duration; includes the author card when held.
| Field | Type | Meaning |
|---|---|---|
| subject * | string · ≤400 chars | One @handle or profile URL. |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| postId | string |
| postUrl | string |
| authorHandle | string |
| caption | string |
| postedDate | string |
| views | integer |
| likes | integer |
| comments | integer |
| shares | integer |
| saves | integer |
| durationS | integer |
| language | string |
| isSlideshow | boolean |
| isSponsored | boolean |
| isAd | boolean |
| hashtags | list of string |
| mentions | list of string |
| sound | any |
| location | string |
| locationAddress | string |
| country | string |
| thumbnail | string |
| resolution | string |
| effects | list of string |
| slideshowImages | any |
| hashtagViews | integer |
| sourceQuery | string |
| details | object |
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.
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
[
{
"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.
Videosvideos
Full cards for up to ten posts by video or photo URL.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Video or photo URLs. |
Response fields, each row of data
| Field | Type |
|---|---|
| postId | string |
| postUrl | string |
| authorHandle | string |
| caption | string |
| postedDate | string |
| views | integer |
| likes | integer |
| comments | integer |
| shares | integer |
| saves | integer |
| durationS | integer |
| language | string |
| isSlideshow | boolean |
| isSponsored | boolean |
| isAd | boolean |
| hashtags | list of string |
| mentions | list of string |
| sound | any |
| location | string |
| locationAddress | string |
| country | string |
| thumbnail | string |
| resolution | string |
| effects | list of string |
| slideshowImages | any |
| hashtagViews | integer |
| sourceQuery | string |
| details | object |
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.
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
[
{
"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.
Search postssearchPosts
Posts by keyword, by hashtag, or by sound URL. Exactly one.
| Field | Type | Meaning |
|---|---|---|
| query | string · ≤300 chars | |
| hashtag | string · ≤150 chars | |
| soundUrl | string · ≤400 chars | A TikTok sound page URL (tiktok.com/music/…): posts made with that sound. |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| postId | string |
| postUrl | string |
| authorHandle | string |
| caption | string |
| postedDate | string |
| views | integer |
| likes | integer |
| comments | integer |
| shares | integer |
| saves | integer |
| durationS | integer |
| language | string |
| isSlideshow | boolean |
| isSponsored | boolean |
| isAd | boolean |
| hashtags | list of string |
| mentions | list of string |
| sound | any |
| location | string |
| locationAddress | string |
| country | string |
| thumbnail | string |
| resolution | string |
| effects | list of string |
| slideshowImages | any |
| hashtagViews | integer |
| sourceQuery | string |
| details | object |
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.
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
[
{
"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.
Searchsearch
Find accounts by keyword. Every hit a full profile card.
| Field | Type | Meaning |
|---|---|---|
| query * | string · ≤300 chars | |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| handle | string |
| tiktokId | string |
| displayName | string |
| profileUrl | string |
| avatar | string |
| bio | string |
| bioLink | string |
| verified | boolean |
| private | boolean |
| businessAccount | boolean |
| businessCategory | string |
| tiktokSeller | boolean |
| followers | integer |
| following | integer |
| totalLikes | integer |
| likesGiven | integer |
| videos | integer |
| mutualFollows | integer |
| accountCreated | string |
| details | object |
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.
curl -X POST https://apiforagents.dev/v1/tiktok \
-H "Authorization: Bearer $AFA_KEY" \
-H "Content-Type: application/json" \
-d '{"op":"search","query":"home cooking","limit":10}'Example response rows
[
{
"handle": "@latteart.lou",
"displayName": "Lou | Latte Art",
"bio": "Pouring hearts daily",
"verified": false,
"followers": 312000,
"following": 140,
"totalLikes": 8400000,
"videos": 520,
"businessAccount": null,
"tiktokId": "673577550",
"profileUrl": "https://www.tiktok.com/lou-latte-art-1000",
"bioLink": "https://www.tiktok.com/lou-latte-art-1000",
"accountCreated": "2026-10-04",
"details": {}
},
{
"handle": "@brewlab",
"displayName": "Brewlab Coffee",
"bio": "Coffee nerds from Austin",
"verified": false,
"followers": 52100,
"following": 88,
"totalLikes": 610000,
"videos": 214,
"businessAccount": true,
"tiktokId": "994794249",
"profileUrl": "https://www.tiktok.com/brewlab-coffee-1001",
"bioLink": "https://www.tiktok.com/brewlab-coffee-1001",
"accountCreated": "2026-10-02",
"details": {}
}
]An example to show the shape. The rows show the most used fields; a live row carries every field in the table above.
Commentscomments
Top-level comments on up to ten posts by URL.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | Video or photo URLs. |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| commentId | string |
| comment | string |
| likes | integer |
| replies | integer |
| postedDate | string |
| commenter | string |
| commenterId | string |
| commenterUrl | string |
| commenterAvatar | string |
| pinnedByCreator | boolean |
| likedByCreator | boolean |
| mentions | list of string |
| details | object |
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.
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
[
{
"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.
Followersfollowers
The followers OR following of up to five accounts, each row a full profile.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-5 items | @handles or profile URLs. |
| direction | enum | followers · following |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| handle | string |
| userId | string |
| displayName | string |
| profileUrl | string |
| avatar | string |
| bio | string |
| verified | boolean |
| private | boolean |
| followers | integer |
| following | integer |
| videos | integer |
| totalLikes | integer |
| tiktokSeller | boolean |
| connectionType | string |
| connectedAccount | string |
| details | object |
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.
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
[
{
"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.
Shopshop
TikTok Shop products for a keyword. Price, discount, rating, sold count, seller, every variant with its stock.
| Field | Type | Meaning |
|---|---|---|
| query * | string · ≤300 chars | |
| limit | integer · 1-100 |
Response fields, each row of data
| Field | Type |
|---|---|
| productId | string |
| productUrl | string |
| title | string |
| description | string |
| salePrice | number |
| originalPrice | number |
| discount | string |
| currency | string |
| rating | number |
| reviewCount | integer |
| soldCount | integer |
| seller | any |
| image | string |
| labels | list of string |
| variants | any |
| details | object |
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.
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
[
{
"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.
Historyhistoryfree
Stored follower/likes/video-count series of profiles already held. Free.
| Field | Type | Meaning |
|---|---|---|
| subjects * | list of string · 1-10 items | |
| metric | enum | followers · following · total_likes · videos |
| days | integer · 1-730 |