TikTok Live Recorder avatar

TikTok Live Recorder

Pricing

from $0.45 / 1,000 recording seconds

Go to Apify Store
TikTok Live Recorder

TikTok Live Recorder

Record one active public TikTok Live broadcast as stored MP4 segments with a matching row for each segment. Choose a username, profile or live URL, or live-room ID, set a limit or record until the broadcast ends, and get room, creator, audience, permission, stream, and delivered interaction data.

Pricing

from $0.45 / 1,000 recording seconds

Rating

0.0

(0)

Developer

Maxime Dupré

Maxime Dupré

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 days ago

Last modified

Share

🎥 Capture TikTok LIVE as MP4 segments

Developers and data teams can record one active public TikTok Live broadcast and get stored MP4 segments with a matching dataset row for each completed segment. Each row keeps the room, stream session, creator, audience, commerce and interaction permissions, delivered interactions, selected stream quality, and available variants so you can archive or process live video with its context.

📦 TikTok LIVE segment data

Each completed segment produces one stored MP4 file and one matching Dataset row. The row keeps source values when TikTok provides them, including room and stream identity, creator details, audience counts, permissions, delivered interactions, and stream variants.

▶️ Start a TikTok LIVE capture

Quick start

  1. Choose Username, Profile or live URL, or Live-room ID and fill only the matching field.
  2. Set Maximum capture time (seconds), choose Recording quality, and decide whether to turn on Wait for the live to start.
  3. Start the run. Open the Dataset for segment rows and the run's default Key-Value Store for stored MP4 files.

Shorten the run

Use a positive maximum capture time to stop capture sooner. Keep Wait for the live to start off when you do not want to wait at startup. Automatic recording quality uses the best quality exposed by the live stream.

⚙️ Input

Input fields

FieldTypeWhat it does
discoveryMethodstringRequired. Select username, profileOrLiveUrl, or liveRoomId to choose how to identify one public TikTok Live broadcast.
usernamestringEnter one public TikTok username when discoveryMethod is username.
profileOrLiveUrlstringEnter one TikTok profile URL or live-room URL when discoveryMethod is profileOrLiveUrl.
liveRoomIdstringEnter one TikTok Live room identifier when discoveryMethod is liveRoomId.
maxDurationSecondsintegerSet a positive number of seconds to stop capture. Leave it empty to record until the live broadcast ends. The run then returns all available results until the source is exhausted.
recordingQualitystringChoose a quality exposed by the live stream. Use auto for the best available quality, or request a suggested quality such as 1080p, 720p, 480p, or 360p.
waitForLivebooleanTurn this on to wait when the target is not live at run start. With it off, the run does not wait for a live broadcast to start.

Example input

This is the public input from a successful default-input run.

{
"discoveryMethod": "username",
"username": "jimmieislive",
"maxDurationSeconds": 15,
"recordingQuality": "auto",
"waitForLive": false
}

🧾 Output

Run output

FieldTypeWhat it does
datasetUrlstring (URL)Opens the Dataset with one row for each completed MP4 segment and its captured data.

Dataset row

Each Dataset row has one shape. Nested paths below use dotted names so you can map the row into your own data model. Optional values may be empty or absent when TikTok does not expose them.

FieldTypeWhat it does
segmentobjectDetails for one completed video segment.
segment.outcomestringReports completed for a completed segment.
segment.numberintegerOne-based segment order in the recording.
segment.startedAtstringSource time when capture of this segment started.
segment.endedAtstringSource time when capture of this segment ended.
segment.durationSecondsnumberCaptured segment length in seconds.
segment.fileobjectDetails for the stored MP4 file for this segment.
segment.file.downloadUrlstringURL for downloading the stored segment file.
segment.file.fileNamestringName of the stored segment file.
segment.file.formatstringFile format, which is mp4.
segment.file.deliverystringFile delivery method, which is stored.
roomobjectTikTok Live room linked to this segment.
room.idstringTikTok Live room identifier.
room.titlestringTitle shown for the live room, when available.
room.visibilitystringVisibility reported by TikTok for the live room, when available.
room.statestringRoom state reported by TikTok, when available.
room.startedAtstringSource time when the live room started, when available.
streamSessionobjectStream session that delivered this segment.
streamSession.idstringSource stream-session identifier.
streamSession.startedAtstringSource time when the stream session started, when available.
streamSession.endedAtstringSource time when the stream session ended, when available.
creatorobjectAvailable profile details for the live creator.
creator.idstringCreator identifier reported by TikTok, when available.
creator.usernamestringCreator username, when available.
creator.displayNamestringCreator name shown to viewers, when available.
creator.biostringCreator biography, when available.
creator.avatarUrlstringCreator profile image URL, when available.
creator.verifiedbooleanWhether TikTok marks the creator as verified, when available.
audienceobjectAudience and engagement measures reported during capture.
audience.viewerCountintegerNumber of viewers reported by TikTok, when available.
audience.likeCountintegerNumber of likes reported by TikTok, when available.
audience.commentCountintegerNumber of comments reported by TikTok, when available.
audience.shareCountintegerNumber of shares reported by TikTok, when available.
audience.followCountintegerNumber of follows reported by TikTok, when available.
audience.giftCountintegerNumber of gifts reported by TikTok, when available.
audience.fanActivityCountintegerFan activity measure reported by TikTok, when available.
commerceobjectCommerce and interaction permissions reported by TikTok.
commerce.shopEnabledbooleanWhether TikTok reports a shop for the live room, when available.
commerce.businessAccountbooleanWhether TikTok marks the creator account as a business account, when available.
commerce.interactionPermissionsobjectPermissions for interactions reported by TikTok.
commerce.interactionPermissions.commentsbooleanWhether comments are allowed, when available.
commerce.interactionPermissions.giftsbooleanWhether gifts are allowed, when available.
commerce.interactionPermissions.likesbooleanWhether likes are allowed, when available.
commerce.interactionPermissions.sharesbooleanWhether shares are allowed, when available.
commerce.interactionPermissions.followsbooleanWhether follows are allowed, when available.
interactionsarray of objectsTimestamped live interactions delivered during capture.
interactions[].idstringSource interaction identifier, when available.
interactions[].occurredAtstringSource time when the interaction occurred.
interactions[].eventTypestringType of live interaction.
interactions[].participantobjectParticipant context reported for the interaction, when available.
interactions[].participant.idstringParticipant identifier, when available.
interactions[].participant.usernamestringParticipant username, when available.
interactions[].participant.displayNamestringParticipant name shown for the interaction, when available.
interactions[].messagestringText attached to the interaction, when available.
interactions[].giftobjectGift details attached to the interaction, when available.
interactions[].gift.idstringGift identifier, when available.
interactions[].gift.namestringGift name, when available.
interactions[].gift.countintegerNumber of gifts in the interaction, when available.
interactions[].gift.diamondCountintegerGift diamond count, when available.
interactions[].amountnumberNumeric amount attached to the interaction, when available.
interactions[].currencystringCurrency for the interaction amount, when available.
interactions[].likeCountintegerLike count attached to the interaction, when available.
interactions[].shareCountintegerShare count attached to the interaction, when available.
interactions[].followCountintegerFollow count attached to the interaction, when available.
streamobjectSelected stream quality and variants exposed during capture.
stream.selectedQualitystringStream quality used for this segment.
stream.variantsarray of objectsStream-quality variants exposed by TikTok during capture.
stream.variants[].qualitystringQuality label for the stream variant.
stream.variants[].widthintegerStream width in pixels, when available.
stream.variants[].heightintegerStream height in pixels, when available.
stream.variants[].bitrateKbpsnumberStream bitrate in kilobits per second, when available.
stream.variants[].codecstringStream codec, when available.
stream.variants[].formatstringFormat of the stream variant, when available.

Example dataset row

This is one complete row from a successful current-beta run. The values are shown as returned.

{
"segment": {
"outcome": "completed",
"number": 1,
"startedAt": "2026-08-29T17:44:14.710Z",
"endedAt": "2026-08-29T17:44:35.404Z",
"durationSeconds": 15.044,
"file": {
"downloadUrl": "https://api.apify.com/v2/key-value-stores/Keb76OsQeHtevPM8c/records/live-7679487266922334998-1.mp4?signature=1i8YTBMGUctHxkNz7USrf",
"fileName": "live-7679487266922334998-1.mp4",
"format": "mp4",
"delivery": "stored"
}
},
"room": {
"id": "7679487266922334998",
"title": "Je parle juste fort...",
"visibility": "public",
"state": "live",
"startedAt": "2026-08-29T16:13:11.000Z"
},
"streamSession": {
"id": "1272913494955525453",
"startedAt": "2026-08-29T16:13:11.000Z",
"endedAt": "2026-08-29T16:13:11.000Z"
},
"interactions": [
{
"occurredAt": "2026-08-29T17:44:14.774Z",
"eventType": "like",
"id": "7679510850956461077",
"participant": {
"id": "7267779356586902530",
"username": "hideya721",
"displayName": "🐇ひでや🐇"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:15.305Z",
"eventType": "like",
"id": "7679510853074338848",
"participant": {
"id": "6852399814992086022",
"username": "papaceliba",
"displayName": "papa celiba liege 🇧🇪"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:15.813Z",
"eventType": "chat",
"id": "7679510817008388866",
"participant": {
"id": "6933335443619775493",
"username": "sp3cii",
"displayName": "SPECi 🦁"
},
"message": "@Enzo you have just reached Level: 47!"
},
{
"occurredAt": "2026-08-29T17:44:16.334Z",
"eventType": "like",
"id": "7679510857952330017",
"participant": {
"id": "7105907614987289606",
"username": "hala.madridrodrygo11",
"displayName": "Hala.Madridrodrygo11"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:16.404Z",
"eventType": "room-user-seq",
"id": "7679510858890199310"
},
{
"occurredAt": "2026-08-29T17:44:17.455Z",
"eventType": "chat",
"id": "7679510830858324769",
"participant": {
"id": "7508659353085756438",
"username": "adawong.officiel",
"displayName": "💃🏻 Ada Wong 💃🏻"
},
"message": "GO COEUR DU JOUR"
},
{
"occurredAt": "2026-08-29T17:44:18.234Z",
"eventType": "like",
"id": "7679510865229644065",
"participant": {
"id": "7105907614987289606",
"username": "hala.madridrodrygo11",
"displayName": "Hala.Madridrodrygo11"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:18.250Z",
"eventType": "room-user-seq",
"id": "7679510867134022669"
},
{
"occurredAt": "2026-08-29T17:44:18.729Z",
"eventType": "like",
"id": "7679510868203569941",
"participant": {
"id": "7267779356586902530",
"username": "hideya721",
"displayName": "🐇ひでや🐇"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:18.849Z",
"eventType": "member",
"id": "7679510862801980192",
"participant": {
"id": "7039741461541520389",
"username": "logan25108",
"displayName": "Logan adt"
}
},
{
"occurredAt": "2026-08-29T17:44:20.518Z",
"eventType": "room-user-seq",
"id": "7679510876497281549"
},
{
"occurredAt": "2026-08-29T17:44:20.660Z",
"eventType": "social",
"id": "7679510868379929377",
"participant": {
"id": "7587838597332960278",
"username": "adele.0120",
"displayName": "★Adèle★"
},
"followCount": 156959
},
{
"occurredAt": "2026-08-29T17:44:20.859Z",
"eventType": "like",
"id": "7679510876935799841",
"participant": {
"id": "7105907614987289606",
"username": "hala.madridrodrygo11",
"displayName": "Hala.Madridrodrygo11"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:21.286Z",
"eventType": "like",
"id": "7679510879456477729",
"participant": {
"id": "6852399814992086022",
"username": "papaceliba",
"displayName": "papa celiba liege 🇧🇪"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:22.669Z",
"eventType": "room-user-seq",
"id": "7679510886314197261"
},
{
"occurredAt": "2026-08-29T17:44:23.195Z",
"eventType": "member",
"id": "7679510878913137440",
"participant": {
"id": "7484342416213525526",
"username": "spider15110",
"displayName": "H'🕷"
}
},
{
"occurredAt": "2026-08-29T17:44:23.340Z",
"eventType": "chat",
"id": "7679510875182467873",
"participant": {
"id": "6805305328239903749",
"username": "ninimnms",
"displayName": "🌼 ℕ𝕚𝕟𝕚 🏉🌼"
},
"message": "!score"
},
{
"occurredAt": "2026-08-29T17:44:23.364Z",
"eventType": "like",
"id": "7679510887623033888",
"participant": {
"id": "7105907614987289606",
"username": "hala.madridrodrygo11",
"displayName": "Hala.Madridrodrygo11"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:24.224Z",
"eventType": "chat",
"id": "7679510868794690326",
"participant": {
"id": "6933335443619775493",
"username": "sp3cii",
"displayName": "SPECi 🦁"
},
"message": "@🌼 ℕ𝕚𝕟𝕚 🏉🌼 Commands:"
},
{
"occurredAt": "2026-08-29T17:44:24.254Z",
"eventType": "like",
"id": "7679510890974200608",
"participant": {
"id": "7105907614987289606",
"username": "hala.madridrodrygo11",
"displayName": "Hala.Madridrodrygo11"
},
"likeCount": 6
},
{
"occurredAt": "2026-08-29T17:44:24.381Z",
"eventType": "chat",
"id": "7679510856082115350",
"participant": {
"id": "6933335443619775493",
"username": "sp3cii",
"displayName": "SPECi 🦁"
},
"message": "@🌼 ℕ𝕚𝕟𝕚 🏉🌼 you have 161 007 Points (Level: 154)."
},
{
"occurredAt": "2026-08-29T17:44:25.146Z",
"eventType": "room-user-seq",
"id": "7679510897030791437"
},
{
"occurredAt": "2026-08-29T17:44:26.218Z",
"eventType": "room-user-seq",
"id": "7679510901325939725"
},
{
"occurredAt": "2026-08-29T17:44:27.636Z",
"eventType": "like",
"id": "7679510906367296545",
"participant": {
"id": "6852399814992086022",
"username": "papaceliba",
"displayName": "papa celiba liege 🇧🇪"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:28.009Z",
"eventType": "room-user-seq",
"id": "7679510908457927693"
},
{
"occurredAt": "2026-08-29T17:44:29.601Z",
"eventType": "like",
"id": "7679510913980679200",
"participant": {
"id": "6852399814992086022",
"username": "papaceliba",
"displayName": "papa celiba liege 🇧🇪"
},
"likeCount": 8
},
{
"occurredAt": "2026-08-29T17:44:30.595Z",
"eventType": "room-user-seq",
"id": "7679510919822836750"
},
{
"occurredAt": "2026-08-29T17:44:31.809Z",
"eventType": "like",
"id": "7679510924264931873",
"participant": {
"id": "7105907614987289606",
"username": "hala.madridrodrygo11",
"displayName": "Hala.Madridrodrygo11"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:31.864Z",
"eventType": "like",
"id": "7679510924582978580",
"participant": {
"id": "7267779356586902530",
"username": "hideya721",
"displayName": "🐇ひでや🐇"
},
"likeCount": 15
},
{
"occurredAt": "2026-08-29T17:44:31.995Z",
"eventType": "room-user-seq",
"id": "7679510925774684430"
},
{
"occurredAt": "2026-08-29T17:44:32.594Z",
"eventType": "member",
"id": "7679510921299856161",
"participant": {
"id": "7668012839965475862",
"username": "vexaz016",
"displayName": "vexazthedark"
}
},
{
"occurredAt": "2026-08-29T17:44:33.622Z",
"eventType": "like",
"id": "7679510931902235168",
"participant": {
"id": "7105907614987289606",
"username": "hala.madridrodrygo11",
"displayName": "Hala.Madridrodrygo11"
},
"likeCount": 15
}
],
"stream": {
"selectedQuality": "720p",
"variants": [
{
"quality": "720p",
"width": 720,
"height": 1280,
"bitrateKbps": 1800,
"codec": "h264",
"format": "flv"
}
]
},
"creator": {
"id": "6933335443619775493",
"username": "sp3cii",
"displayName": "SPECi 🦁",
"bio": "RECORD PERSO 3.2M💎\n12x🏆29x🥈22x🥉 | 10x 🥇Arène Gaming \n1x TOP 1 QUOTIDIEN 🥇\n3x TOP 1 Populaire ❤️\nTeam Rouge :18 vs Team Verte :3",
"avatarUrl": "https://p16-common-sign.tiktokcdn.com/tos-maliva-avt-0068/3b5c3b26329474ad9e0e0271d51366f7~tplv-tiktokx-cropcenter:100:100.webp?dr=14579&refresh_token=6be1bc0c&x-expires=1788195600&x-signature=5hlpp7Pa3OOg3Qtnif1Ml8GrIJc%3D&t=4d5b0474&ps=13740610&shp=a5d48078&shcp=fdd36af4&idc=my2",
"verified": false
},
"audience": {
"viewerCount": 56,
"likeCount": 0,
"commentCount": 0,
"shareCount": 0,
"followCount": 0,
"giftCount": 0,
"fanActivityCount": 0
},
"commerce": {
"shopEnabled": false,
"businessAccount": false,
"interactionPermissions": {
"comments": true,
"gifts": true,
"likes": true,
"shares": true,
"follows": true
}
}
}

💳 Pricing

This Actor uses pay-per-event pricing. The prices below are the current tier prices for the two buyer-facing events.

EventPrice
Recording second$0.0005 per successfully captured second on FREE and BRONZE tiers; $0.00045 on SILVER, GOLD, PLATINUM, and DIAMOND tiers.
Live interaction$0.00001 per timestamped interaction delivered during capture.

A charge applies only when the relevant video second is successfully captured or an interaction is delivered during capture. Prices can change, so check the current pricing page before a long run.

🔌 Integrations

Call the Actor through the Apify API, then read the Dataset URL and stored MP4 file links from the run. Export the Dataset or pass its rows to your own workflow. One run captures one broadcast.

❓ FAQ

What does one Dataset row represent?

One row represents one completed MP4 segment. It includes the segment file details and the room, stream session, creator, audience, permission, interaction, and stream data available for that segment.

Can I record a TikTok Live after it ends?

No. The target must be an active public TikTok Live broadcast. Ended posts, replays, and inaccessible rooms are outside this Actor.

What happens if the target is not live when the run starts?

Turn on Wait for the live to start if you want the run to wait at startup. With it off, the run does not wait for a live broadcast to start.

What happens when I leave Maximum capture time empty?

The Actor records until the live broadcast ends. The run then returns all available results until the source is exhausted.

Can I choose the recording quality?

Yes. Choose a quality exposed by the stream, or use auto for the best available quality. The available variants are also reported in stream.variants.

Does the Actor capture chat and gifts?

It saves delivered interaction events such as chat, likes, follows, members, and gifts when TikTok sends them during capture. It cannot guarantee an event type that the source does not deliver.

Why is a room, creator, or audience value empty?

TikTok may not expose every optional value for every room. The Actor keeps available source data and does not invent a missing value.

Can one run monitor several accounts?

No. One run captures one public TikTok Live broadcast. Start separate runs when you need separate targets.

Can I use this for other live platforms?

No. This Actor is for public TikTok Live broadcasts. It does not capture YouTube Live, Twitch, Instagram Live, or other platforms.

📝 Changelog

0.0: Initial release

🆘 Support

For issues, questions, or feature requests, file a ticket and I'll fix or implement it in less than 24h 🫡

Made with ❤️ by Maxime Dupré