TikTok videos API
A TikTok account's latest videos, newest first, in one answer (no pages): about 20 to 30, each with its caption, time, cover, video link and numbers. A number or a time is null when it is not exact.
GEThttps://storiesfly.com/api/v1/tiktok/user/videos- Price 1 request
- Answers up to 30 minutes old
Parameters
All parameters go in the query string.
| Name | Type | Sent | Description |
|---|---|---|---|
username | string | required | TikTok username, or a profile link. A leading @ is ignored. |
Example request
Put your own key in the header, or in the apiKey option of the npm client.
curl "https://storiesfly.com/api/v1/tiktok/user/videos?username=khaby.lame" \
-H "X-Api-Key: sf_live_your_key"const res = await fetch(
"https://storiesfly.com/api/v1/tiktok/user/videos?username=khaby.lame",
{ headers: { "X-Api-Key": process.env.STORIESFLY_KEY } }
);
const data = await res.json();import os
import requests
r = requests.get(
"https://storiesfly.com/api/v1/tiktok/user/videos",
params={"username": "khaby.lame"},
headers={"X-Api-Key": os.environ["STORIESFLY_KEY"]},
)
data = r.json()Example response
{
"user": {
"username": "khaby.lame"
},
"videos": [
{
"id": "7697307919943060767",
"url": "https://www.tiktok.com/@khaby.lame/video/7697307919943060767",
"author": {
"username": "khaby.lame"
},
"taken_at": 1792169181,
"taken_at_iso": "2026-10-16T16:46:21.000Z",
"caption": "I guess is time to retire #learnfromkhaby #comedy 🥊",
"hashtags": [
"learnfromkhaby",
"comedy"
],
"media_type": "video",
"thumbnail_url": null,
"video_url": "https://v19e.tiktokcdn.com/67a0c3597f8d0415651f75b5494b0798/6ad96aab/video/tos/alisg/tos-alisg-ve-37c799-sg/okAtBQJDE2EBABOobPVaUIr8ztS8Vii6QRmMZ/",
"video_url_sd": null,
"audio_url": null,
"images": [],
"video_duration": 10,
"views": 3305006,
"likes": 273179,
"comments": 6524,
"shares": 31470
},
{
"id": "7694335322922044703",
"url": "https://www.tiktok.com/@khaby.lame/video/7694335322922044703",
"author": {
"username": "khaby.lame"
},
"taken_at": 1791477076,
"taken_at_iso": "2026-10-08T16:31:16.000Z",
"caption": "Was the ball out, or was it just my imagination? 🤨#learnfromkhaby #comedy",
"hashtags": [
"learnfromkhaby",
"comedy"
],
"media_type": "video",
"thumbnail_url": null,
"video_url": "https://v19e.tiktokcdn.com/425aa2ad5c79b175d3870eb2819014a8/6ad96ac0/video/tos/alisg/tos-alisg-ve-37c799-sg/oEmjGeelIIxqIXxkjgVALC6HQxj4AfTSTISIkK/",
"video_url_sd": null,
"audio_url": null,
"images": [],
"video_duration": 31,
"views": 6300899,
"likes": 659883,
"comments": 12141,
"shares": 20223
}
]
}A real answer, shortened: lists are cut to two items and long texts to 160 characters.
Price and freshness
A call takes 1 request. Free requests are spent first, then your balance. The pricing page has the rates.
Answers are kept for up to 30 minutes. Asking again inside that time returns the same answer and takes 1 request again.
Errors
A failed call answers with an HTTP status and a body {error, code}. These are the codes this endpoint gives. Errors and what is charged covers all of them.
| Status | Code | When |
|---|---|---|
400 | bad_request | A parameter is missing or wrong. fields lists the names. Free. |
401 | unauthorized | The X-Api-Key header is missing or the key is wrong. Free. |
402 | credits_exhausted | The free requests and the balance are used up. Top up in the dashboard. Free. |
403 | telegram_required | The account behind the key is not linked to Telegram. The answer has a link_url to do it. Free. |
404 | not_found | The account does not exist. Charged like an answer. |
429 | rate_limited | More requests in a second than your level allows, more than this group can take at once, or more than 1,000 TikTok and download calls today. Wait for the Retry-After header. Free. |
500 | internal_error | A fault on our side. Retry shortly. Refunded. |
503 | upstream_unavailable | Our side failed or timed out. Retry shortly. Refunded. |
Questions about this endpoint
How many videos does it return?
The latest ones, about 20 to 30, in one answer for 1 request. There are no further pages.
Why are some numbers or times null?
Each is given only when it is exact, and is null otherwise. tiktok/video reads one video with its numbers.
How old can an answer be?
Up to 30 minutes. Asking again inside that time returns the same list.
Your first 100 requests are on us
Sign in with Telegram, create a key, call any endpoint. Top up only when you need more.
